re PR tree-optimization/81455 (Compile-time hog w/ -O1 -funswitch-loops)
authorRichard Biener <rguenther@suse.de>
Tue, 25 Jul 2017 13:24:51 +0000 (13:24 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 25 Jul 2017 13:24:51 +0000 (13:24 +0000)
2017-07-25  Richard Biener  <rguenther@suse.de>

PR tree-optimization/81455
* tree-ssa-loop-unswitch.c (find_loop_guard): Make sure to
not walk in cycles when looking for guards.

* gcc.dg/pr81455.c: New testcase.

From-SVN: r250518

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr81455.c [new file with mode: 0644]
gcc/tree-ssa-loop-unswitch.c

index cc4bcddda52b10a877d1dcd3d63e1889570fba29..4597d3b2f572b71d28f32be0c645ec490bad8e98 100644 (file)
@@ -1,3 +1,9 @@
+2017-07-25  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/81455
+       * tree-ssa-loop-unswitch.c (find_loop_guard): Make sure to
+       not walk in cycles when looking for guards.
+
 2017-07-25  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/81529
index e28a732f2efd093fc973aa6ae43eac0d13e04dbe..0aee7d909466a1907ef322a75c2de3bc532bb576 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-25  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/81455
+       * gcc.dg/pr81455.c: New testcase.
+
 2017-07-25  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/81529
diff --git a/gcc/testsuite/gcc.dg/pr81455.c b/gcc/testsuite/gcc.dg/pr81455.c
new file mode 100644 (file)
index 0000000..8ab8863
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O -funswitch-loops" } */
+
+void
+jh (unsigned int aw, int sn)
+{
+  int xs;
+
+  for (xs = 0; xs < 1; ++xs)
+    aw &= 1;
+
+  while (aw < 1 || ++sn < 1)
+    {
+    }
+}
index 204cd0d0645550c0da759219279b06522143e32c..57aba4f1dd019de39cb69785f9115f422f498590 100644 (file)
@@ -582,8 +582,9 @@ find_loop_guard (struct loop *loop)
   gcond *cond;
   do
     {
+      basic_block next = NULL;
       if (single_succ_p (header))
-       header = single_succ (header);
+       next = single_succ (header);
       else
        {
          cond = dyn_cast <gcond *> (last_stmt (header));
@@ -593,12 +594,16 @@ find_loop_guard (struct loop *loop)
          /* Make sure to skip earlier hoisted guards that are left
             in place as if (true).  */
          if (gimple_cond_true_p (cond))
-           header = te->dest;
+           next = te->dest;
          else if (gimple_cond_false_p (cond))
-           header = fe->dest;
+           next = fe->dest;
          else
            break;
        }
+      /* Never traverse a backedge.  */
+      if (header->loop_father->header == next)
+       return NULL;
+      header = next;
     }
   while (1);
   if (!flow_bb_inside_loop_p (loop, te->dest)