On Mon, Oct 19, 2020 at 10:19:48AM -0400, Andrew MacLeod via Gcc-patches wrote:
> On 10/19/20 5:38 AM, Aldy Hernandez wrote:
> > If the shift amount in operator_lshift::op1_range was zero, an invalid range
> > of [1, 0] was being created.
>
> Should we do the same thing with rshift::op1_range?    ie, return the LHS
> if the shift is 0 instead of trying to figure it out....
Shift by 0 is a noop, so yes, for all of left/right shifts and rotates
the result range should be the range of the first operand.
> > gcc/ChangeLog:
> >
> > PR tree-optimization/97467
> > * range-op.cc (operator_lshift::op1_range): Handle shifts by 0.
> >
> > gcc/testsuite/ChangeLog:
> >
> > * gcc.dg/pr97467.c: New test.
> > ---
> > gcc/range-op.cc | 5 +++++
> > gcc/testsuite/gcc.dg/pr97467.c | 16 ++++++++++++++++
> > 2 files changed, 21 insertions(+)
> > create mode 100644 gcc/testsuite/gcc.dg/pr97467.c
> >
> > diff --git a/gcc/range-op.cc b/gcc/range-op.cc
> > index 0efa00186e8..30d2a4d3987 100644
> > --- a/gcc/range-op.cc
> > +++ b/gcc/range-op.cc
> > @@ -1579,6 +1579,11 @@ operator_lshift::op1_range (irange &r,
> > wide_int shift = wi::to_wide (shift_amount);
> > if (wi::lt_p (shift, 0, SIGNED))
> > return false;
> > + if (shift == 0)
> > + {
> > + r = lhs;
> > + return true;
> > + }
> > // Work completely in unsigned mode to start.
> > tree utype = type;
> > diff --git a/gcc/testsuite/gcc.dg/pr97467.c b/gcc/testsuite/gcc.dg/pr97467.c
> > new file mode 100644
> > index 00000000000..dcbd218f733
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/pr97467.c
> > @@ -0,0 +1,16 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-Os" } */
> > +
> > +int a;
> > +long b;
> > +unsigned int c = 1;
> > +
> > +int main () {
> > + int e;
> > + for (; c <= 0; c++) {
> > + int f = 0;
> > + b = e;
> > + a = f || b << c;
> > + }
> > + return 0;
> > +}
Jakub