On Tue, 10 May 2016, Richard Biener wrote:

> 
> ifcvt is confused about fake edges not being loop exits which the 
> following fixes.
> 
> Bootstrap / regtest pending on x86_64-unknown-linux-gnu.

Didn't fare well.  The following patch mitigates the issue as well
but in the end make it just latent - it is still sth I wanted
to persue anyway seeing the sometimes odd choices for added
fake edges.  The patch reduces the number from two to one
and adds it to the real dead-end infinite loop only for the
testcases.

2016-05-11  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/70986
        * cfganal.c (dfs_find_deadend): Prefer to take edges exiting
        loops.

        * gcc.dg/torture/pr70986-1.c: New testcase.
        * gcc.dg/torture/pr70986-2.c: Likewise.
        * gcc.dg/torture/pr70986-3.c: Likewise.

Index: gcc/testsuite/gcc.dg/torture/pr70986-1.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr70986-1.c    (revision 0)
+++ gcc/testsuite/gcc.dg/torture/pr70986-1.c    (working copy)
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+
+int a, g;
+char b, c;
+short d, e, f;
+
+char
+fn1 ()
+{
+  return a ? a : 1;
+}
+
+void
+fn2 ()
+{
+  char h;
+  for (; d;)
+    for (; e; e++)
+      c = (fn1 () && h) & !(f |= 9 ^ (b > (g = c)));
+  for (;;)
+    ;
+}
Index: gcc/testsuite/gcc.dg/torture/pr70986-2.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr70986-2.c    (revision 0)
+++ gcc/testsuite/gcc.dg/torture/pr70986-2.c    (working copy)
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+int gi, dg;
+
+void
+fe (void)
+{
+  int ka = gi;
+
+  for (;;)
+    {
+      if (ka != 0)
+       {
+         if (dg != 0)
+           gi = 0;
+         ++ka;
+       }
+      ++dg;
+    }
+}
Index: gcc/testsuite/gcc.dg/torture/pr70986-3.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr70986-3.c    (revision 0)
+++ gcc/testsuite/gcc.dg/torture/pr70986-3.c    (working copy)
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+int a, b;
+int
+fn1 (int p1)
+{
+  return p1 < 0 ? p1 : a;
+}
+
+void
+fn2 ()
+{
+lbl_100:
+  b = 1;
+  for (; b != 21; b = fn1 (b))
+    ;
+  goto lbl_100;
+}
Index: gcc/cfganal.c
===================================================================
*** gcc/cfganal.c       (revision 236069)
--- gcc/cfganal.c       (working copy)
*************** dfs_find_deadend (basic_block bb)
*** 747,753 ****
            return bb;
          }
  
!       bb = EDGE_SUCC (bb, 0)->dest;
      }
  
    gcc_unreachable ();
--- 751,771 ----
            return bb;
          }
  
!       /* If we are in an analyzed cycle make sure to try exiting it.
!          Note this is a heuristic only and expected to work when loop
!        fixup is needed as well.  */
!       if (! bb->loop_father
!         || ! loop_outer (bb->loop_father))
!       bb = EDGE_SUCC (bb, 0)->dest;
!       else
!       {
!         edge_iterator ei;
!         edge e;
!         FOR_EACH_EDGE (e, ei, bb->succs)
!           if (bb->loop_father != e->dest->loop_father)
!             break;
!         bb = e ? e->dest : EDGE_SUCC (bb, 0)->dest;
!       }
      }
  
    gcc_unreachable ();

Reply via email to