IOR with nonzero, range cannot contain 0.

Remove zero from IOR ranges with non-zero masks.

	gcc/
	PR tree-optimization/83072
	* range-op.cc (wi_optimize_and_or): Remove zero from IOR range when
	mask is non-zero.
	gcc/testsuite/
	* gcc.dg/pr83072.c: New.
This commit is contained in:
Andrew MacLeod 2020-11-17 10:04:38 -05:00
parent c2cf58f0e3
commit a5f9c27bfc
2 changed files with 22 additions and 0 deletions

View File

@ -2163,6 +2163,14 @@ wi_optimize_and_or (irange &r,
else
gcc_unreachable ();
value_range_with_overflow (r, type, res_lb, res_ub);
// Furthermore, if the mask is non-zero, an IOR cannot contain zero.
if (code == BIT_IOR_EXPR && wi::ne_p (mask, 0))
{
int_range<2> tmp;
tmp.set_nonzero (type);
r.intersect (tmp);
}
return true;
}

View File

@ -0,0 +1,14 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-evrp -fno-tree-ccp -fno-tree-forwprop -fno-tree-fre" } */
void kill (void);
int f(int c){
c |= 1;
if (c == 0)
kill ();
return c;
}
/* { dg-final { scan-tree-dump-not "kill" "evrp" } } */