Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Richard. 2019-03-25 Richard Biener <rguent...@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. Index: gcc/testsuite/gcc.dg/torture/pr89789.c =================================================================== --- gcc/testsuite/gcc.dg/torture/pr89789.c (nonexistent) +++ gcc/testsuite/gcc.dg/torture/pr89789.c (working copy) @@ -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; + } + } +} Index: gcc/tree-ssa-sccvn.c =================================================================== --- gcc/tree-ssa-sccvn.c (revision 269906) +++ gcc/tree-ssa-sccvn.c (working copy) @@ -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;