]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR tree-optimization/69740
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Feb 2016 18:17:02 +0000 (18:17 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Feb 2016 18:17:02 +0000 (18:17 +0000)
* cfghooks.c (remove_edge): Request loop fixups if we delete
an edge that might turn an irreducible loop into a natural
loop.

        PR tree-optimization/69740
* gcc.c-torture/compile/pr69740-1.c: New test.
* gcc.c-torture/compile/pr69740-2.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233754 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfghooks.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr69740-1.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/pr69740-2.c [new file with mode: 0644]

index d9cfd0e08f52c5956733f8ddd9e03e1e51bb3164..6344092a55df11c753c134fdd61023f638705ca6 100644 (file)
@@ -1,3 +1,11 @@
+2016-02-26  Richard Biener  <rguenther@suse.de>
+           Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/69740
+       * cfghooks.c (remove_edge): Request loop fixups if we delete
+       an edge that might turn an irreducible loop into a natural
+       loop.
+
 2016-02-26  Martin Jambor  <mjambor@suse.cz>
 
        PR middle-end/69920
index bbb1017fd1f951637314ce3a8e145acdb7f078d5..06c05d1fb39a6146de45ac0b71fda31284fb3994 100644 (file)
@@ -408,7 +408,20 @@ void
 remove_edge (edge e)
 {
   if (current_loops != NULL)
-    rescan_loop_exit (e, false, true);
+    {
+      rescan_loop_exit (e, false, true);
+
+      /* Removal of an edge inside an irreducible region or which leads
+        to an irreducible region can turn the region into a natural loop.
+        In that case, ask for the loop structure fixups.
+
+        FIXME: Note that LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS is not always
+        set, so always ask for fixups when removing an edge in that case.  */
+      if (!loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
+         || (e->flags & EDGE_IRREDUCIBLE_LOOP)
+         || (e->dest->flags & BB_IRREDUCIBLE_LOOP))
+       loops_state_set (LOOPS_NEED_FIXUP);
+    }
 
   /* This is probably not needed, but it doesn't hurt.  */
   /* FIXME: This should be called via a remove_edge hook.  */
index 5a928892cb755131098967ad1002b95e94cfc0ac..316720b5b4bd163f68468afd7c31dd86be61e78f 100644 (file)
@@ -1,3 +1,10 @@
+2016-02-26  Richard Biener  <rguenther@suse.de>
+            Jeff Law  <law@redhat.com>
+
+        PR tree-optimization/69740
+       * gcc.c-torture/compile/pr69740-1.c: New test.
+       * gcc.c-torture/compile/pr69740-2.c: New test.
+
 2016-02-26  Martin Jambor  <mjambor@suse.cz>
 
        PR middle-end/69920
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr69740-1.c b/gcc/testsuite/gcc.c-torture/compile/pr69740-1.c
new file mode 100644 (file)
index 0000000..ac867d8
--- /dev/null
@@ -0,0 +1,12 @@
+char a;
+short b;
+void fn1() {
+  if (b)
+    ;
+  else {
+    int c[1] = {0};
+  l1:;
+  }
+  if (a)
+    goto l1;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr69740-2.c b/gcc/testsuite/gcc.c-torture/compile/pr69740-2.c
new file mode 100644 (file)
index 0000000..a89c9a0
--- /dev/null
@@ -0,0 +1,19 @@
+inline int foo(int *p1, int p2) {
+  int z = *p1;
+  while (z > p2)
+    p2 = 2;
+  return z;
+}
+int main() {
+  int i;
+  for (;;) {
+    int j, k;
+    i = foo(&k, 7);
+    if (k)
+      j = i;
+    else
+      k = j;
+    if (2 != j)
+      __builtin_abort();
+  }
+}