On Tue, 9 Jun 2015, Richard Biener wrote:

On Tue, 9 Jun 2015, Richard Biener wrote:

On Tue, 9 Jun 2015, Marc Glisse wrote:

On Tue, 9 Jun 2015, Richard Biener wrote:

Tweaking it so that (6<<X)==0 becomes X>=31 for TYPE_OVERFLOW_WRAPS and
false for TYPE_OVERFLOW_UNDEFINED is probably more controversial.

Hm, yes.  I think signed overflow != shift amount overflow, so testing the
overflow macros for this isn't valid.

Would it be ok to always turn it to X>=31 then? (the value 31 is conveniently
already computed in 'cand')

I think so.

Or even ((unsigned)X - 31) < 1 (I probably got that wrong) to properly
say X>=29 && X<32, that is, preserve the implicit upper bound on X
we have because it is used in a shift.

I don't understand in what sense this preserves the upper bound. I would understand storing a range for X (when it is an SSA_NAME, and it would require a lot of care not to propagate backwards too far), or more simply introducing if(X>=32) __builtin_unreachable();. But you seem to be talking about generating more complicated code so that if someone checks (6<<123)==0 it returns false?

--
Marc Glisse

Reply via email to