summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2017-09-15 09:19:36 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2017-09-15 09:19:36 +0000
commit0340b0d489a469b3d441f83e04ea40262e98ba8e (patch)
treed30a6dd766b27849dc68b70824bcd0b2d0b7534f
parentdca0c3a8b3845de69af0ea2ea559bdea92dc5700 (diff)
downloadgcc-0340b0d489a469b3d441f83e04ea40262e98ba8e.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@252796 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr82217.c32
-rw-r--r--gcc/tree-ssa-sccvn.c9
4 files changed, 46 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4711d4e16c1..65bfc163f5a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b47923b3802..cd3f7a96c0d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..471f474aab3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr82217.c
@@ -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;
+}
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 44618daedce..0b0c5106d30 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -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)))