Check for equivalences between PHI argument and def.

If a PHI argument on an edge is equivalent with the DEF, then it doesn't
provide any new information, defer processing it unless they are all
equivalences.

	PR tree-optimization/103359
	gcc/
	* gimple-range-fold.cc (fold_using_range::range_of_phi): If arg is
	equivalent to def, don't initially include it's range.

	gcc/testsuite/
	* gcc.dg/pr103359.c: New.
This commit is contained in:
Andrew MacLeod 2021-11-23 14:12:29 -05:00
parent f4e470d44e
commit 661c02e54e
2 changed files with 37 additions and 0 deletions

View File

@ -771,6 +771,7 @@ fold_using_range::range_of_phi (irange &r, gphi *phi, fur_source &src)
tree phi_def = gimple_phi_result (phi);
tree type = gimple_range_type (phi);
int_range_max arg_range;
int_range_max equiv_range;
unsigned x;
if (!type)
@ -794,6 +795,16 @@ fold_using_range::range_of_phi (irange &r, gphi *phi, fur_source &src)
// Get the range of the argument on its edge.
src.get_phi_operand (arg_range, arg, e);
// Likewise, if the incoming PHI argument is equivalent to this
// PHI definition, it provides no new info. Accumulate these ranges
// in case all arguments are equivalences.
if (src.query ()->query_relation (e, arg, phi_def, false) == EQ_EXPR)
{
single_arg = arg;
equiv_range.union_(arg_range);
continue;
}
if (!arg_range.undefined_p ())
{
// Register potential dependencies for stale value tracking.
@ -816,6 +827,11 @@ fold_using_range::range_of_phi (irange &r, gphi *phi, fur_source &src)
break;
}
// If all arguments were equivalences, use the equivalence ranges as no
// arguments were processed.
if (!seen_arg)
r = equiv_range;
// If the PHI boils down to a single effective argument, look at it.
if (single_arg)
{

View File

@ -0,0 +1,21 @@
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-evrp" } */
void foo();
static char a, c;
static int d, e;
static short b(short f, short g) { return f * g; }
int main() {
short h = 4;
for (; d;)
if (h)
if(e) {
if (!b(a & 1 | h, 3))
c = 0;
h = 1;
}
if (c)
foo();
}
/* { dg-final { scan-tree-dump-not "c = 0" "evrp" } } */