From: Richard Biener Date: Mon, 11 May 2020 11:40:37 +0000 (+0200) Subject: tree-optimization/95049 - fix not terminating RPO VN iteration X-Git-Tag: releases/gcc-9.4.0~700 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0c7ae564f42b605e21001e5e6968a58cc454be9b;p=thirdparty%2Fgcc.git tree-optimization/95049 - fix not terminating RPO VN iteration This rejects lattice changes from one constant to another. 2020-05-11 Richard Biener PR tree-optimization/95049 * tree-ssa-sccvn.c (set_ssa_val_to): Reject lattice transition between different constants. * gcc.dg/torture/pr95049.c: New testcase. (cherry picked from commit 84f4954c38228e4cb3e6f0b5471883e6c2523631) --- diff --git a/gcc/testsuite/gcc.dg/torture/pr95049.c b/gcc/testsuite/gcc.dg/torture/pr95049.c new file mode 100644 index 000000000000..164bfdbdcfc6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr95049.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ + +void a() +{ + for (int b; b; b = !b) + ; +} diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 262bfff9f115..1e7de65dcd97 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -3731,6 +3731,8 @@ set_ssa_val_to (tree from, tree to) vn_ssa_aux_t from_info = VN_INFO (from); tree currval = from_info->valnum; // SSA_VAL (from) poly_int64 toff, coff; + bool curr_undefined = false; + bool curr_invariant = false; /* The only thing we allow as value numbers are ssa_names and invariants. So assert that here. We don't allow VN_TOP @@ -3773,9 +3775,9 @@ set_ssa_val_to (tree from, tree to) } return false; } - bool curr_invariant = is_gimple_min_invariant (currval); - bool curr_undefined = (TREE_CODE (currval) == SSA_NAME - && ssa_undefined_value_p (currval, false)); + curr_invariant = is_gimple_min_invariant (currval); + curr_undefined = (TREE_CODE (currval) == SSA_NAME + && ssa_undefined_value_p (currval, false)); if (currval != VN_TOP && !curr_invariant && !curr_undefined @@ -3830,9 +3832,8 @@ set_and_exit: && !operand_equal_p (currval, to, 0) /* Different undefined SSA names are not actually different. See PR82320 for a testcase were we'd otherwise not terminate iteration. */ - && !(TREE_CODE (currval) == SSA_NAME + && !(curr_undefined && TREE_CODE (to) == SSA_NAME - && ssa_undefined_value_p (currval, false) && ssa_undefined_value_p (to, false)) /* ??? For addresses involving volatile objects or types operand_equal_p does not reliably detect ADDR_EXPRs as equal. We know we are only @@ -3844,6 +3845,22 @@ set_and_exit: == get_addr_base_and_unit_offset (TREE_OPERAND (to, 0), &toff)) && known_eq (coff, toff))) { + if (to != from + && currval != VN_TOP + && !curr_undefined + /* We do not want to allow lattice transitions from one value + to another since that may lead to not terminating iteration + (see PR95049). Since there's no convenient way to check + for the allowed transition of VAL -> PHI (loop entry value, + same on two PHIs, to same PHI result) we restrict the check + to invariants. */ + && curr_invariant + && is_gimple_min_invariant (to)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, " forced VARYING"); + to = from; + } if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, " (changed)\n"); from_info->valnum = to;