When we simplify a NARY during PHI translation we have to make sure to not inject not available operands into it given that might violate the valueization hook constraints and we'd pick up invalid context-sensitive data in further simplification or as in this case later ICE when we try to insert the expression.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/118895 * tree-ssa-sccvn.cc (vn_nary_build_or_lookup_1): Only allow CSE if we can verify the result is available. * gcc.dg/pr118895.c: New testcase. --- gcc/testsuite/gcc.dg/pr118895.c | 13 +++++++++++++ gcc/tree-ssa-sccvn.cc | 13 ++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr118895.c diff --git a/gcc/testsuite/gcc.dg/pr118895.c b/gcc/testsuite/gcc.dg/pr118895.c new file mode 100644 index 00000000000..ca61d2cc1b1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr118895.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +unsigned long a; +void fn1() +{ + unsigned long e = a; + int c = e; + int d = c < 100 ? c : 0; + if (d + (int)e & 608) + while (e & 608) + e <<= 1; +} diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc index 8bb45780a98..146840664e2 100644 --- a/gcc/tree-ssa-sccvn.cc +++ b/gcc/tree-ssa-sccvn.cc @@ -366,6 +366,10 @@ static vn_ssa_aux_t last_pushed_avail; correct. */ static vn_tables_t valid_info; +/* Global RPO state for access from hooks. */ +static class eliminate_dom_walker *rpo_avail; +basic_block vn_context_bb; + /* Valueization hook for simplify_replace_tree. Valueize NAME if it is an SSA name, otherwise just return it. */ @@ -2501,7 +2505,10 @@ vn_nary_build_or_lookup_1 (gimple_match_op *res_op, bool insert, bool res = false; if (i == res_op->num_ops) { - mprts_hook = vn_lookup_simplify_result; + /* Do not leak not available operands into the simplified expression + when called from PRE context. */ + if (rpo_avail) + mprts_hook = vn_lookup_simplify_result; res = res_op->resimplify (NULL, vn_valueize); mprts_hook = NULL; } @@ -2684,10 +2691,6 @@ public: vn_avail *m_avail_freelist; }; -/* Global RPO state for access from hooks. */ -static eliminate_dom_walker *rpo_avail; -basic_block vn_context_bb; - /* Return true if BASE1 and BASE2 can be adjusted so they have the same address and adjust *OFFSET1 and *OFFSET2 accordingly. Otherwise return false. */ -- 2.43.0