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