If there is only one argument to a PHI which is defined, an equivalency is
created between the def and the argument. It is safe to consider the def
equal to the argument, but it is dangerous to assume the argument is also
equivalent to the def as there may be branches which change the range on the
path to the PHI on that argument
This patch avoid using that relation in range-on-entry calculations.
PR tree-optimization/108139
gcc/
* gimple-range-cache.cc (ranger_cache::fill_block_cache): Do not
use equivalences originating from PHIS.
gcc/testsuite/
* gcc.dg/pr108139.c: New.
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<gphi *> (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)))
--- /dev/null
+/* { 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" } } */
+
+