]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/27335 (ICE in get_loop_body)
authorZdenek Dvorak <dvorakz@suse.cz>
Sat, 13 May 2006 22:10:56 +0000 (00:10 +0200)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Sat, 13 May 2006 22:10:56 +0000 (22:10 +0000)
PR rtl-optimization/27335
* loop-unroll.c (peel_loops_completely): Use loops->parray to walk the
loops.

* gcc.dg/pr27335.c: New test.

From-SVN: r113746

gcc/ChangeLog
gcc/loop-unroll.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr27335.c [new file with mode: 0644]

index 1c19346bed52b43e1e6ac86e52b79a68bac7b0ba..07e672a2aa672bf2611b94cc9d93189f35e00bc7 100644 (file)
@@ -1,3 +1,9 @@
+2005-05-13  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       PR rtl-optimization/27335
+       * loop-unroll.c (peel_loops_completely): Use loops->parray to walk the
+       loops.
+
 2005-05-13  Zdenek Dvorak  <dvorakz@suse.cz>
 
        PR tree-optimization/27003
index 05977db6f4da0eec845d7d48f870e0dddc1e8183..3a850198e8d7492e21d8562ccb7d2e4806785c05 100644 (file)
@@ -234,22 +234,15 @@ loop_exit_at_end_p (struct loop *loop)
 static void
 peel_loops_completely (struct loops *loops, int flags)
 {
-  struct loop *loop, *next;
-
-  loop = loops->tree_root;
-  while (loop->inner)
-    loop = loop->inner;
+  struct loop *loop;
+  unsigned i;
 
-  while (loop != loops->tree_root)
+  /* Scan the loops, the inner ones first.  */
+  for (i = loops->num - 1; i > 0; i--)
     {
-      if (loop->next)
-       {
-         next = loop->next;
-         while (next->inner)
-           next = next->inner;
-       }
-      else
-       next = loop->outer;
+      loop = loops->parray[i];
+      if (!loop)
+       continue;
 
       loop->lpt_decision.decision = LPT_NONE;
 
@@ -272,7 +265,6 @@ peel_loops_completely (struct loops *loops, int flags)
          verify_loop_structure (loops);
 #endif
        }
-      loop = next;
     }
 }
 
index 654e810fb9ef3069a72161c9a5f5362135bae9ee..b1e075fe42fcca4ceceba5d89b48cd21c16f0871 100644 (file)
@@ -1,3 +1,8 @@
+2005-05-13  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       PR rtl-optimization/27335
+       * gcc.dg/pr27335.c: New test.
+
 2005-05-13  Zdenek Dvorak  <dvorakz@suse.cz>
 
        PR tree-optimization/27003
diff --git a/gcc/testsuite/gcc.dg/pr27335.c b/gcc/testsuite/gcc.dg/pr27335.c
new file mode 100644 (file)
index 0000000..d08db30
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -funroll-loops" } */
+
+extern void bar () __attribute__ ((noreturn));
+
+inline double
+baz (double *x, unsigned int y)
+{
+  if (y >= 6)
+    bar ();
+  return x[y];
+}
+
+double *a, *b;
+
+void
+foo ()
+{
+  unsigned int r, s, t;
+
+  for (r = 0; r < 2; r++)
+    for (t = 0; t < 2; t++)
+      {
+        for (s = 0; s < 3; s++)
+          b[r * 2 + t] += baz (a, 3 * s + t);
+      }
+}