re PR tree-optimization/85615 (ICE at -O2 and above on valid code on x86_64-linux...
authorRichard Biener <rguenther@suse.de>
Thu, 3 May 2018 13:20:02 +0000 (13:20 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 3 May 2018 13:20:02 +0000 (13:20 +0000)
2018-05-03  Richard Biener  <rguenther@suse.de>

PR tree-optimization/85615
* tree-ssa-threadupdate.c (thread_block_1): Only allow exits
to loops not nested in BBs loop father to avoid creating multi-entry
loops.

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

From-SVN: r259891

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

index 3ce8273a4995e0037b7e1c7508df6c2056561bd0..893a459e09a3a6c12b2bba7043fb59c02ec6a185 100644 (file)
@@ -1,3 +1,10 @@
+2018-05-03  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/85615
+       * tree-ssa-threadupdate.c (thread_block_1): Only allow exits
+       to loops not nested in BBs loop father to avoid creating multi-entry
+       loops.
+
 2018-05-03  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR tree-optimization/70291
index 3a69665dd6990209a6ea228fd79040723f779c3b..6d135894c271e08bb17e316a0dc71369b85d4168 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-03  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/85615
+       * gcc.dg/torture/pr85615.c: New testcase.
+
 2018-05-03  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR tree-optimization/70291
diff --git a/gcc/testsuite/gcc.dg/torture/pr85615.c b/gcc/testsuite/gcc.dg/torture/pr85615.c
new file mode 100644 (file)
index 0000000..1695c2e
--- /dev/null
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+
+long a, d;
+int b, c;
+void fn1()
+{
+  int e = -1L, f = 2, g = 8;
+  for (;;)
+    {
+      for (; b; g++)
+       ;
+      int i;
+      for (; c;)
+       {
+         i = 5;
+         for (; e >= 1; i--)
+           ;
+       }
+      d = f ?: a;
+      if (d)
+       {
+         e = 0;
+         for (; i;)
+           for (; g < 3; f++)
+             ;
+       }
+    }
+}
index 9ab9e7d7d93da0d70b2c66f39a184593b78b2b2c..b6bc5fcf17593bd66af019975b69b47d273dd828 100644 (file)
@@ -1309,7 +1309,9 @@ thread_block_1 (basic_block bb, bool noloop_only, bool joiners)
             and thread this elsewhere, so just cancel the jump threading
             request by clearing the AUX field now.  */
          if (bb->loop_father != e2->src->loop_father
-             && !loop_exit_edge_p (e2->src->loop_father, e2))
+             && (!loop_exit_edge_p (e2->src->loop_father, e2)
+                 || flow_loop_nested_p (bb->loop_father,
+                                        e2->dest->loop_father)))
            {
              /* Since this case is not handled by our special code
                 to thread through a loop header, we must explicitly