PR tree-optimization/67909, 67947
authorYuri Rumyantsev <ysrumyan@gmail.com>
Tue, 13 Oct 2015 13:08:31 +0000 (13:08 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Tue, 13 Oct 2015 13:08:31 +0000 (13:08 +0000)
gcc/

2014-10-13  Yuri Rumyantsev  <ysrumyan@gmail.com>

PR tree-optimization/67909, 67947
* tree-ssa-loop-unswitch.c (find_loop_guard): Add check that GUARD_EDGE
really skip the inner loop.

gcc/testsuite/

2014-10-13  Yuri Rumyantsev  <ysrumyan@gmail.com>

PR tree-optimization/67909, 67947
* gcc.dg/torture/pr67947.c: New test.

From-SVN: r228760

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

index caab5338ff61c2afaf505f5f31b75c2610eaeeb1..68461a0a575af6f16fd061f403c5875f14555900 100644 (file)
@@ -1,3 +1,9 @@
+2014-10-13  Yuri Rumyantsev  <ysrumyan@gmail.com>
+
+       PR tree-optimization/67909, 67947
+       * tree-ssa-loop-unswitch.c (find_loop_guard): Add check that GUARD_EDGE
+       really skip the inner loop.
+
 2015-10-13  Jeff Law  <law@redhat.com>
 
        * tree-ssa-threadbackward.c (fsm_find_control_statement_thread_paths):
index acf6df53b945709d07dfc275696e2331729b6083..523b684e8ed2b30e02987ae5d23a08d7e4ee3885 100644 (file)
@@ -1,3 +1,8 @@
+2014-10-13  Yuri Rumyantsev  <ysrumyan@gmail.com>
+
+       PR tree-optimization/67909, 67947
+       * gcc.dg/torture/pr67947.c: New test.
+
 2015-10-13  Jeff Law  <law@redhat.com>
 
        * gcc.dg/tree-ssa/ssa-thread-13.c: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr67947.c b/gcc/testsuite/gcc.dg/torture/pr67947.c
new file mode 100644 (file)
index 0000000..5664c48
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-additional-options "-O3" } */
+
+#include <stdlib.h>
+
+int a;
+int c;
+__attribute__((noinline, noclone)) void foo (int x)
+{
+  if (x == 0)
+    c++;
+}
+
+int
+main (int argc, char* argv[])
+{
+  int j, k, b = 0;
+  if (argc == 0)
+    b = 1;
+  for (j = 0; j < 3; j++)
+    for (k = 0; k < 1; k++)
+      {
+       foo (0);
+       if (b)
+         for (k = -1; a;)
+           ;
+      }
+  if (c != 3)
+    abort ();
+  return 0;
+}
index d6faa378ba824f4fd5035c27734aaeac77809085..2edc00031c6e820662470eba54d7d1f117e41cbb 100644 (file)
@@ -471,7 +471,6 @@ find_loop_guard (struct loop *loop)
 {
   basic_block header = loop->header;
   edge guard_edge, te, fe;
-  /* bitmap processed, known_invariants;*/
   basic_block *body = NULL;
   unsigned i;
   tree use;
@@ -529,6 +528,16 @@ find_loop_guard (struct loop *loop)
   else
     return NULL;
 
+  /* Guard edge must skip inner loop.  */
+  if (!dominated_by_p (CDI_DOMINATORS, loop->inner->header,
+      guard_edge == fe ? te->dest : fe->dest))
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+       fprintf (dump_file, "Guard edge %d --> %d is not around the loop!\n",
+                guard_edge->src->index, guard_edge->dest->index);
+      return NULL;
+    }
+
   if (dump_file && (dump_flags & TDF_DETAILS))
     fprintf (dump_file,
             "Considering guard %d -> %d in loop %d\n",