If the shift amount in operator_lshift::op1_range was zero, an invalid range of [1, 0] was being created.
Pushed. 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; +} -- 2.26.2