On 10/19/20 4:22 PM, Jakub Jelinek wrote:
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.
Sounds good.
Tested on x86-64 Linux.
Pushed.
Special case shifting by zero in operator_rshift::op1_range.
gcc/ChangeLog:
* range-op.cc (operator_rshift::op1_range): Special case
shifting by zero.
diff --git a/gcc/range-op.cc b/gcc/range-op.cc
index 0efa00186e8..40d45b1ce47 100644
--- a/gcc/range-op.cc
+++ b/gcc/range-op.cc
@@ -1633,6 +1633,11 @@ operator_rshift::op1_range (irange &r,
wi::uhwi (prec, TYPE_PRECISION (TREE_TYPE (shift))),
UNSIGNED))
return false;
+ if (wi::to_wide (shift) == 0)
+ {
+ r = lhs;
+ return true;
+ }
// Folding the original operation may discard some impossible
// ranges from the LHS.