Don't use PHI equivalences in range-on-entry.

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.
This commit is contained in:
Andrew MacLeod 2022-12-16 16:53:31 -05:00
parent 05b7cf52e1
commit 0bdd2261c2
2 changed files with 25 additions and 0 deletions

View File

@ -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<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)))

View File

@ -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" } } */