On Thu, Nov 26, 2020 at 09:21:53AM +0000, Richard Biener wrote:
> Btw, when looking I figured that int_const_binop loses the sign
> of arg2 when folding a signed shift by an unsigned shift amount
> and thus these out-of-bound shifts get interpreted as signed
> by wide_int_binop even though they are not.  That said,
> 
>     case RSHIFT_EXPR:
>       if (wi::neg_p (arg2))
>         return false;
> 
> will, for wide_int, always return true for values with MSB set
> (we implicitely pass SIGNED to the signop operand here).  That
> will now yield "inconsistent" behavior for X >> 1000 vs
> X >> -1u for example.  The old behavior wasn't really better
> in principle but consistent in the final result.  A fix would
> be to pass in an explicit sign of the second argument.

Or return false; even if arg2 is bigger or equal to precision (and we should
have the precision from the precision of arg1).
That would be my preference, but I think we want first the path isolation
changes.

        Jakub

Reply via email to