This fixes PR54458 where DOM jump threading turns a loop into
one with multiple latches but does not mark it so.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2012-09-04  Richard Guenther  <rguent...@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.

Index: gcc/tree-ssa-threadupdate.c
===================================================================
--- gcc/tree-ssa-threadupdate.c (revision 190889)
+++ gcc/tree-ssa-threadupdate.c (working copy)
@@ -1037,11 +1037,21 @@ thread_through_loop_header (struct loop
        }
       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;
 
Index: gcc/testsuite/gcc.dg/torture/pr54458.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr54458.c      (revision 0)
+++ gcc/testsuite/gcc.dg/torture/pr54458.c      (working copy)
@@ -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);
+}

Reply via email to