From a5f9c27bfc4417224e332392bb81a2d733b2b5bf Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Tue, 17 Nov 2020 10:04:38 -0500 Subject: [PATCH] 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. --- gcc/range-op.cc | 8 ++++++++ gcc/testsuite/gcc.dg/pr83072.c | 14 ++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr83072.c diff --git a/gcc/range-op.cc b/gcc/range-op.cc index b746aadb603..d0adc95527a 100644 --- a/gcc/range-op.cc +++ b/gcc/range-op.cc @@ -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; } diff --git a/gcc/testsuite/gcc.dg/pr83072.c b/gcc/testsuite/gcc.dg/pr83072.c new file mode 100644 index 00000000000..3bed8d89013 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr83072.c @@ -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" } } */