re PR rtl-optimization/48442 (ICE: in init_seqno, at sel-sched.c:6767 with -Os -fsele...
authorAlexander Monakov <amonakov@ispras.ru>
Fri, 8 Apr 2011 11:44:51 +0000 (15:44 +0400)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Fri, 8 Apr 2011 11:44:51 +0000 (15:44 +0400)
PR rtl-optimization/48442
* sel-sched.c (init_seqno): Remove number_of_insns argument.  Update
all callers.  Adjust assert.

testsuite:
* gcc.dg/pr48442.c: New.

From-SVN: r172173

gcc/ChangeLog
gcc/sel-sched.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr48442.c [new file with mode: 0644]

index d149898ba139af81af20400ac803e27826d25d3d..b357ba769390b7736826df2ac531b892c2cfe512 100644 (file)
@@ -1,3 +1,9 @@
+2011-04-08  Alexander Monakov  <amonakov@ispras.ru>
+
+       PR rtl-optimization/48442
+       * sel-sched.c (init_seqno): Remove number_of_insns argument.  Update
+       all callers.  Adjust assert.
+
 2011-04-08  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/48377
index 9179249ab1a22dc8a30d84554dcac2c883fe0f1c..0e8173b3dddee8f58eb071281094574d34f0e413 100644 (file)
@@ -6731,15 +6731,14 @@ init_seqno_1 (basic_block bb, sbitmap visited_bbs, bitmap blocks_to_reschedule)
     INSN_SEQNO (insn) = cur_seqno--;
 }
 
-/* Initialize seqnos for the current region.  NUMBER_OF_INSNS is the number
-   of instructions in the region, BLOCKS_TO_RESCHEDULE contains blocks on
-   which we're rescheduling when pipelining, FROM is the block where
+/* Initialize seqnos for the current region.  BLOCKS_TO_RESCHEDULE contains
+   blocks on which we're rescheduling when pipelining, FROM is the block where
    traversing region begins (it may not be the head of the region when
    pipelining, but the head of the loop instead).
 
    Returns the maximal seqno found.  */
 static int
-init_seqno (int number_of_insns, bitmap blocks_to_reschedule, basic_block from)
+init_seqno (bitmap blocks_to_reschedule, basic_block from)
 {
   sbitmap visited_bbs;
   bitmap_iterator bi;
@@ -6762,9 +6761,13 @@ init_seqno (int number_of_insns, bitmap blocks_to_reschedule, basic_block from)
       from = EBB_FIRST_BB (0);
     }
 
-  cur_seqno = number_of_insns > 0 ? number_of_insns : sched_max_luid - 1;
+  cur_seqno = sched_max_luid - 1;
   init_seqno_1 (from, visited_bbs, blocks_to_reschedule);
-  gcc_assert (cur_seqno == 0 || number_of_insns == 0);
+
+  /* cur_seqno may be positive if the number of instructions is less than
+     sched_max_luid - 1 (when rescheduling or if some instructions have been
+     removed by the call to purge_empty_blocks in sel_sched_region_1).  */
+  gcc_assert (cur_seqno >= 0);
 
   sbitmap_free (visited_bbs);
   return sched_max_luid - 1;
@@ -7473,17 +7476,12 @@ sel_sched_region_2 (int orig_max_seqno)
 static void
 sel_sched_region_1 (void)
 {
-  int number_of_insns;
   int orig_max_seqno;
 
-  /* Remove empty blocks that might be in the region from the beginning.
-     We need to do save sched_max_luid before that, as it actually shows
-     the number of insns in the region, and purge_empty_blocks can
-     alter it.  */
-  number_of_insns = sched_max_luid - 1;
+  /* Remove empty blocks that might be in the region from the beginning.  */
   purge_empty_blocks ();
 
-  orig_max_seqno = init_seqno (number_of_insns, NULL, NULL);
+  orig_max_seqno = init_seqno (NULL, NULL);
   gcc_assert (orig_max_seqno >= 1);
 
   /* When pipelining outer loops, create fences on the loop header,
@@ -7560,7 +7558,7 @@ sel_sched_region_1 (void)
                 {
                   flist_tail_init (new_fences);
 
-                  orig_max_seqno = init_seqno (0, blocks_to_reschedule, bb);
+                  orig_max_seqno = init_seqno (blocks_to_reschedule, bb);
 
                   /* Mark BB as head of the new ebb.  */
                   bitmap_set_bit (forced_ebb_heads, bb->index);
index ca8666ad80a8c9e400027b9a764ff2562a23581b..e311e804439b1b85e040328f70028506288883f7 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-08  Alexander Monakov  <amonakov@ispras.ru>
+
+       PR rtl-optimization/48442
+       * gcc.dg/pr48442.c: New.
+
 2011-04-08  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/48377
diff --git a/gcc/testsuite/gcc.dg/pr48442.c b/gcc/testsuite/gcc.dg/pr48442.c
new file mode 100644 (file)
index 0000000..88e3497
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
+/* { dg-options "-Os -fselective-scheduling2 --param max-sched-extend-regions-iters=100" } */
+void f (void)
+{
+  unsigned *a2;
+  int vertex2;
+  int c, x2, dx2, dy2, s2;
+  long m, b;
+  do
+    {
+      if (dx2)
+       dx2 = dx2 % dy2;
+       s2 = (dx2 / dy2);
+    }
+  while (vertex2);
+  for (;;)
+    {
+      c = x2;
+      a2 = 0;
+      if (c)
+       {
+         m = b << (c);
+         *a2 = (*a2 & ~m);
+       }
+      x2 += s2;
+    }
+}