re PR tree-optimization/82217 (ICE on valid code at -O1 and above: in visit_phi,...
authorRichard Biener <rguenther@suse.de>
Fri, 15 Sep 2017 09:19:36 +0000 (09:19 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 15 Sep 2017 09:19:36 +0000 (09:19 +0000)
2017-09-15  Richard Biener  <rguenther@suse.de>

PR tree-optimization/82217
* tree-ssa-sccvn.c (visit_phi): Properly handle all VN_TOP
but not undefined case.

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

From-SVN: r252796

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

index 4711d4e..65bfc16 100644 (file)
@@ -1,3 +1,9 @@
+2017-09-15  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/82217
+       * tree-ssa-sccvn.c (visit_phi): Properly handle all VN_TOP
+       but not undefined case.
+
 2017-09-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/82145
index b47923b..cd3f7a9 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-15  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/82217
+       * gcc.dg/torture/pr82217.c: New testcase.
+
 2017-09-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/82145
diff --git a/gcc/testsuite/gcc.dg/torture/pr82217.c b/gcc/testsuite/gcc.dg/torture/pr82217.c
new file mode 100644 (file)
index 0000000..471f474
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+
+int a, b, c;
+
+void fn1 ()
+{ 
+  while (1)
+    { 
+      if (c)
+       goto L2;
+      break;
+    }
+  if (c)
+    {
+L1:
+       {
+         int g[1];
+         if (b)
+           goto L1;
+         goto L1;
+L2:
+         for (a = 0; a;)
+           goto L1;
+       }
+    }
+}
+
+int main ()
+{ 
+  fn1 ();
+  return 0;
+}
index 44618da..0b0c510 100644 (file)
@@ -3901,13 +3901,10 @@ visit_phi (gimple *phi)
      if only a single edge is exectuable use its value.  */
   if (n_executable <= 1)
     result = seen_undef ? seen_undef : sameval;
-  /* If we saw only undefined values create a new undef SSA name to
-     avoid false equivalences.  */
+  /* If we saw only undefined values and VN_TOP use one of the
+     undefined values.  */
   else if (sameval == VN_TOP)
-    {
-      gcc_assert (seen_undef);
-      result = seen_undef;
-    }
+    result = seen_undef ? seen_undef : sameval;
   /* First see if it is equivalent to a phi node in this block.  We prefer
      this as it allows IV elimination - see PRs 66502 and 67167.  */
   else if ((result = vn_phi_lookup (phi)))