aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-03-25 13:53:50 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-03-25 13:53:50 +0000
commit8d6419db2cd99949022cd76cf6b1d0f93be0394b (patch)
tree3cd097e459f74ad756f2e348123284a774b9b32f
parentbe5ce04a6135e0aee4187ec1a1f167f403e0f856 (diff)
downloadgcc-8d6419db2cd99949022cd76cf6b1d0f93be0394b.zip
gcc-8d6419db2cd99949022cd76cf6b1d0f93be0394b.tar.gz
gcc-8d6419db2cd99949022cd76cf6b1d0f93be0394b.tar.bz2
re PR tree-optimization/89789 (Compile time hog during RPO VN)
2019-03-25 Richard Biener <rguenther@suse.de> PR tree-optimization/89789 * tree-ssa-sccvn.c (set_ssa_val_to): Do not allow lattice changes from non-undefined back to undefined. * gcc.dg/torture/pr89789.c: New testcase. From-SVN: r269917
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr89789.c23
-rw-r--r--gcc/tree-ssa-sccvn.c29
4 files changed, 59 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d2db34b..3f72f50 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-03-25 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/89789
+ * tree-ssa-sccvn.c (set_ssa_val_to): Do not allow lattice
+ changes from non-undefined back to undefined.
+
2019-03-25 Thomas Otto <thomas.otto@pdv-fs.de>
* dwarf2out.c (comp_dir_string): cached_wd could be set to both a
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5aead43..7e1978b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-03-25 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/89789
+ * gcc.dg/torture/pr89789.c: New testcase.
+
2019-03-25 Nathan Sidwell <nathan@acm.org>
* g++.dg/abi/lambda-static-1.C: New.
diff --git a/gcc/testsuite/gcc.dg/torture/pr89789.c b/gcc/testsuite/gcc.dg/torture/pr89789.c
new file mode 100644
index 0000000..2c19fab
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr89789.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+int x2;
+
+void
+m2 (void)
+{
+ goto gg;
+
+ int fz, vh = 0;
+
+ for (fz = 0; fz < 1; ++fz)
+ {
+ vh ^= x2;
+
+ if (0)
+ {
+gg:
+ x2 %= 1;
+ x2 += vh;
+ }
+ }
+}
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 81604d2..872f904 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -3746,10 +3746,13 @@ set_ssa_val_to (tree from, tree to)
}
return false;
}
- else if (currval != VN_TOP
- && ! is_gimple_min_invariant (currval)
- && ! ssa_undefined_value_p (currval, false)
- && is_gimple_min_invariant (to))
+ bool curr_invariant = is_gimple_min_invariant (currval);
+ bool curr_undefined = (TREE_CODE (currval) == SSA_NAME
+ && ssa_undefined_value_p (currval, false));
+ if (currval != VN_TOP
+ && !curr_invariant
+ && !curr_undefined
+ && is_gimple_min_invariant (to))
{
if (dump_file && (dump_flags & TDF_DETAILS))
{
@@ -3764,6 +3767,24 @@ set_ssa_val_to (tree from, tree to)
}
to = from;
}
+ else if (currval != VN_TOP
+ && !curr_undefined
+ && TREE_CODE (to) == SSA_NAME
+ && ssa_undefined_value_p (to, false))
+ {
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, "Forcing VARYING instead of changing "
+ "value number of ");
+ print_generic_expr (dump_file, from);
+ fprintf (dump_file, " from ");
+ print_generic_expr (dump_file, currval);
+ fprintf (dump_file, " (non-undefined) to ");
+ print_generic_expr (dump_file, to);
+ fprintf (dump_file, " (undefined)\n");
+ }
+ to = from;
+ }
else if (TREE_CODE (to) == SSA_NAME
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (to))
to = from;