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:
parent
c2cf58f0e3
commit
a5f9c27bfc
2 changed files with 22 additions and 0 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
14
gcc/testsuite/gcc.dg/pr83072.c
Normal file
14
gcc/testsuite/gcc.dg/pr83072.c
Normal 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" } } */
|
Loading…
Add table
Reference in a new issue