diff options
author | Richard Biener <rguenther@suse.de> | 2019-03-25 13:53:50 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-03-25 13:53:50 +0000 |
commit | 8d6419db2cd99949022cd76cf6b1d0f93be0394b (patch) | |
tree | 3cd097e459f74ad756f2e348123284a774b9b32f | |
parent | be5ce04a6135e0aee4187ec1a1f167f403e0f856 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr89789.c | 23 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 29 |
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; |