From 8d6419db2cd99949022cd76cf6b1d0f93be0394b Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 25 Mar 2019 13:53:50 +0000 Subject: [PATCH] re PR tree-optimization/89789 (Compile time hog during RPO VN) 2019-03-25 Richard Biener 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 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr89789.c | 23 +++++++++++++++++++++++ gcc/tree-ssa-sccvn.c | 29 +++++++++++++++++++++++++---- 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr89789.c 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 + + 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 * 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 + + PR tree-optimization/89789 + * gcc.dg/torture/pr89789.c: New testcase. + 2019-03-25 Nathan Sidwell * 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; -- 2.7.4