On Wed, Oct 14, 2015 at 12:45 PM, Marc Glisse <marc.gli...@inria.fr> wrote: > On Wed, 14 Oct 2015, Richard Biener wrote: > >>> +/* Fold (a * (1 << b)) into (a << b) */ >>> +(simplify >>> + (mult:c @0 (convert? (lshift integer_onep@1 @2))) >>> + (if (! FLOAT_TYPE_P (type) >>> + && tree_nop_conversion_p (type, TREE_TYPE (@2))) >>> + (lshift @0 (convert @2)))) >>> >>> You don't need/want to convert @2 (fold-const doesn't convert, does it?), >>> and you don't need to check for tree_nop_conversion_p. >> >> >> I think for long x and x * (long)(1u << b) you need to do because the >> result for b == 33 would be different. > > > - that check should be with TREE_TYPE (@1)
of course > - 1u << 33 is undefined, isn't it? Is it? I thought it were fine for unsigned. Not sure if we should exploit this undefinedness here. Btw, if it were a truncating conversion then the resulting shift could be invalid if @2 is too big (but not too big for the wider shift). So either way I think we should only allow nop conversions here (as fold-const.c did). Richard. > x * (int)(1ul << b), which for b=33 should yield 0, would give the undefined > x << b so some check does seem needed indeed. > > -- > Marc Glisse