re PR rtl-optimization/48302 (ICE: SIGSEGV in reposition_prologue_and_epilogue_notes...
authorAlexander Monakov <amonakov@ispras.ru>
Fri, 8 Apr 2011 11:53:25 +0000 (15:53 +0400)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Fri, 8 Apr 2011 11:53:25 +0000 (15:53 +0400)
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

gcc/ChangeLog
gcc/sel-sched-ir.c
gcc/sel-sched-ir.h
gcc/sel-sched.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr48302.C [new file with mode: 0644]

index 523c3b704cf2534653f6bce9726dd2f9f929ae0b..b5248e07fe1d1e466fdda23094599a1083f09744 100644 (file)
@@ -1,3 +1,14 @@
+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
index 95c1431001ed8db4813d1c7e5ff20d77e89e30bf..a6daa5886dc30086f60ec1d382eed3bc05680e10 100644 (file)
@@ -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);
     }
index 5516da9391f1555052ef9e865b7264c8289e27d3..b0c52eb8c10e3a3e8bddbd807892e7714f8d99ce 100644 (file)
@@ -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);
index fb1a026bf28a2657882853c2d4dac730f11b0440..48fb2e0134d3d3b33c9e96abe46863806aa3a01a 100644 (file)
@@ -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);
index 96c224fcfec6c4961067c1abf5bc623ef8e66d0e..762558c34f860e797ef9cc6debb5c97a93f511e0 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/g++.dg/opt/pr48302.C b/gcc/testsuite/g++.dg/opt/pr48302.C
new file mode 100644 (file)
index 0000000..fd51ba4
--- /dev/null
@@ -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;
+      }
+}