diff options
author | Alexander Monakov <amonakov@ispras.ru> | 2011-04-08 15:53:25 +0400 |
---|---|---|
committer | Alexander Monakov <amonakov@gcc.gnu.org> | 2011-04-08 15:53:25 +0400 |
commit | ea4d630fef8a13e6fa4a1db99b1d1057a0bd7a72 (patch) | |
tree | 586c2008cb2ba82b8fde6b577fb903af06659acd | |
parent | 07643d76c74845e250bdedca6b7148ebccff780b (diff) | |
download | gcc-ea4d630fef8a13e6fa4a1db99b1d1057a0bd7a72.zip gcc-ea4d630fef8a13e6fa4a1db99b1d1057a0bd7a72.tar.gz gcc-ea4d630fef8a13e6fa4a1db99b1d1057a0bd7a72.tar.bz2 |
re PR rtl-optimization/48302 (ICE: SIGSEGV in reposition_prologue_and_epilogue_notes (function.c:5662) with -fcrossjumping -fselective-scheduling2)
PR rtl-optimization/48302
* sel-sched-ir.h (sel_add_loop_preheaders): Update prototype.
* sel-sched-ir.c (sel_add_loop_preheaders): Add 'bbs' argument. Use
it to record added preheader blocks.
* sel-sched.c (setup_current_loop_nest): Add 'bbs' argument. Pass it
on to sel_add_loop_preheaders.
(sel_region_init): Move call to setup_current_loop_nest after
sel_init_bbs.
testsuite:
* g++.dg/opt/pr48302.C: New.
From-SVN: r172176
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/sel-sched-ir.c | 7 | ||||
-rw-r--r-- | gcc/sel-sched-ir.h | 2 | ||||
-rw-r--r-- | gcc/sel-sched.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr48302.C | 21 |
6 files changed, 47 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 523c3b7..b5248e0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,16 @@ 2011-04-08 Alexander Monakov <amonakov@ispras.ru> + PR rtl-optimization/48302 + * sel-sched-ir.h (sel_add_loop_preheaders): Update prototype. + * sel-sched-ir.c (sel_add_loop_preheaders): Add 'bbs' argument. Use + it to record added preheader blocks. + * sel-sched.c (setup_current_loop_nest): Add 'bbs' argument. Pass it + on to sel_add_loop_preheaders. + (sel_region_init): Move call to setup_current_loop_nest after + sel_init_bbs. + +2011-04-08 Alexander Monakov <amonakov@ispras.ru> + PR target/48273 * cfgloop.h (loop_has_exit_edges): New helper. * sel-sched-ir.c (init_global_and_expr_for_insn): Make CALLs diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 95c1431..a6daa58 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -6094,11 +6094,11 @@ sel_find_rgns (void) bbs_in_loop_rgns = NULL; } -/* Adds the preheader blocks from previous loop to current region taking - it from LOOP_PREHEADER_BLOCKS (current_loop_nest). +/* Add the preheader blocks from previous loop to current region taking + it from LOOP_PREHEADER_BLOCKS (current_loop_nest) and record them in *BBS. This function is only used with -fsel-sched-pipelining-outer-loops. */ void -sel_add_loop_preheaders (void) +sel_add_loop_preheaders (bb_vec_t *bbs) { int i; basic_block bb; @@ -6109,6 +6109,7 @@ sel_add_loop_preheaders (void) VEC_iterate (basic_block, preheader_blocks, i, bb); i++) { + VEC_safe_push (basic_block, heap, *bbs, bb); VEC_safe_push (basic_block, heap, last_added_blocks, bb); sel_add_bb (bb); } diff --git a/gcc/sel-sched-ir.h b/gcc/sel-sched-ir.h index 5516da9..b0c52eb 100644 --- a/gcc/sel-sched-ir.h +++ b/gcc/sel-sched-ir.h @@ -1628,7 +1628,7 @@ extern void sel_sched_region (int); extern loop_p get_loop_nest_for_rgn (unsigned int); extern bool considered_for_pipelining_p (struct loop *); extern void make_region_from_loop_preheader (VEC(basic_block, heap) **); -extern void sel_add_loop_preheaders (void); +extern void sel_add_loop_preheaders (bb_vec_t *); extern bool sel_is_loop_preheader_p (basic_block); extern void clear_outdated_rtx_info (basic_block); extern void free_data_sets (basic_block); diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c index fb1a026..48fb2e0 100644 --- a/gcc/sel-sched.c +++ b/gcc/sel-sched.c @@ -6801,7 +6801,7 @@ current_region_empty_p (void) /* Prepare and verify loop nest for pipelining. */ static void -setup_current_loop_nest (int rgn) +setup_current_loop_nest (int rgn, bb_vec_t *bbs) { current_loop_nest = get_loop_nest_for_rgn (rgn); @@ -6810,7 +6810,7 @@ setup_current_loop_nest (int rgn) /* If this loop has any saved loop preheaders from nested loops, add these basic blocks to the current region. */ - sel_add_loop_preheaders (); + sel_add_loop_preheaders (bbs); /* Check that we're starting with a valid information. */ gcc_assert (loop_latch_edge (current_loop_nest)); @@ -6849,9 +6849,6 @@ sel_region_init (int rgn) if (current_region_empty_p ()) return true; - if (flag_sel_sched_pipelining) - setup_current_loop_nest (rgn); - sel_setup_region_sched_flags (); bbs = VEC_alloc (basic_block, heap, current_nr_blocks); @@ -6861,6 +6858,9 @@ sel_region_init (int rgn) sel_init_bbs (bbs, NULL); + if (flag_sel_sched_pipelining) + setup_current_loop_nest (rgn, &bbs); + /* Initialize luids and dependence analysis which both sel-sched and haifa need. */ sched_init_luids (bbs, NULL, NULL, NULL); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 96c224f..762558c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2011-04-08 Alexander Monakov <amonakov@ispras.ru> + PR rtl-optimization/48302 + * g++.dg/opt/pr48302.C: New. + +2011-04-08 Alexander Monakov <amonakov@ispras.ru> + PR target/48273 * g++.dg/opt/pr48273.C: New. diff --git a/gcc/testsuite/g++.dg/opt/pr48302.C b/gcc/testsuite/g++.dg/opt/pr48302.C new file mode 100644 index 0000000..fd51ba4 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr48302.C @@ -0,0 +1,21 @@ +// { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } +// { dg-options "-O -fcrossjumping -fgcse -fschedule-insns2 -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -fselective-scheduling2 --param lim-expensive=320 --param min-crossjump-insns=1" } + +struct S +{ + int i, j; + S *s; + ~S(); +}; + +S *gs; + +void foo () +{ +restart: + for (S *s = gs; s; s = s->s) + if (s->j && s->j != (s->i & 1)) { + delete s; + goto restart; + } +} |