re PR tree-optimization/54458 (ICE get_loop_body, at cfgloop.c:830)
authorRichard Guenther <rguenther@suse.de>
Tue, 4 Sep 2012 09:28:58 +0000 (09:28 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 4 Sep 2012 09:28:58 +0000 (09:28 +0000)
2012-09-04  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/54458
* tree-ssa-threadupdate.c (thread_through_loop_header): If we
turn the loop into one with multiple latches mark it so.

* gcc.dg/torture/pr54458.c: New testcase.

From-SVN: r190918

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr54458.c [new file with mode: 0644]
gcc/tree-ssa-threadupdate.c

index 70aecdd..5ba70bf 100644 (file)
@@ -1,3 +1,9 @@
+2012-09-04  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/54458
+       * tree-ssa-threadupdate.c (thread_through_loop_header): If we
+       turn the loop into one with multiple latches mark it so.
+
 2012-09-04  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
 
        PR target/54220
index 4a05321..b7354f4 100644 (file)
@@ -1,3 +1,8 @@
+2012-09-04  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/54458
+       * gcc.dg/torture/pr54458.c: New testcase.
+
 2012-09-04  Christophe Lyon  <christophe.lyon@linaro.org>
 
        * gcc.target/arm/neon-vext.c: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr54458.c b/gcc/testsuite/gcc.dg/torture/pr54458.c
new file mode 100644 (file)
index 0000000..3d2e12f
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+unsigned int a, b, c;
+
+void
+foo (unsigned int x)
+{
+  do
+    {
+      if (a == 0 ? 1 : 1 % a)
+       for (; b; b--)
+         lab:;
+      else
+       while (x)
+         ;
+      if (c)
+       goto lab;
+    }
+  while (1);
+}
index 86ad74f..30336a1 100644 (file)
@@ -1037,11 +1037,21 @@ thread_through_loop_header (struct loop *loop, bool may_peel_loop_headers)
        }
       free (bblocks);
 
+      /* If the new header has multiple latches mark it so.  */
+      FOR_EACH_EDGE (e, ei, loop->header->preds)
+       if (e->src->loop_father == loop
+           && e->src != loop->latch)
+         {
+           loop->latch = NULL;
+           loops_state_set (LOOPS_MAY_HAVE_MULTIPLE_LATCHES);
+         }
+
       /* Cancel remaining threading requests that would make the
         loop a multiple entry loop.  */
       FOR_EACH_EDGE (e, ei, header->preds)
        {
          edge e2;
+
          if (e->aux == NULL)
            continue;