diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc index ce5a0c8155e6..9848d140242f 100644 --- a/gcc/gimple-range-cache.cc +++ b/gcc/gimple-range-cache.cc @@ -1235,6 +1235,13 @@ ranger_cache::fill_block_cache (tree name, basic_block bb, basic_block def_bb) if (!m_gori.has_edge_range_p (equiv_name)) continue; + // PR 108139. It is hazardous to assume an equivalence with + // a PHI is the same value. The PHI may be an equivalence + // via UNDEFINED arguments which is really a one way equivalence. + // PHIDEF == name, but name may not be == PHIDEF. + if (is_a (SSA_NAME_DEF_STMT (equiv_name))) + continue; + // Check if the equiv definition dominates this block if (equiv_bb == bb || (equiv_bb && !dominated_by_p (CDI_DOMINATORS, bb, equiv_bb))) diff --git a/gcc/testsuite/gcc.dg/pr108139.c b/gcc/testsuite/gcc.dg/pr108139.c new file mode 100644 index 000000000000..6f224e3ce629 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr108139.c @@ -0,0 +1,18 @@ +/* { dg-do compile { target int128 } } */ +/* { dg-options "-O1 -ftree-vrp -fdump-tree-vrp" } */ + +int a, b; +int main() { + int c; + if (a > 1) + a++; + while (a) + if (c == b) + c = a; + return 0; +} + + +/* { dg-final { scan-tree-dump-not "Folding predicate" "vrp2" } } */ + +