https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113281
--- Comment #18 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #17) > (In reply to rguent...@suse.de from comment #16) > > On Wed, 24 Jan 2024, pinskia at gcc dot gnu.org wrote: > > > > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113281 > > > > > > --- Comment #15 from Andrew Pinski <pinskia at gcc dot gnu.org> --- > > > (In reply to Richard Biener from comment #14) > > > > a >= 16 ? 0 : 32872 >> MIN (a, 15) (the MIN is still required to > > > > avoid requiring masking). > > > > > > Note maybe instead of MIN here we use `a & 0xf` since that will more > > > likely be > > > cheaper than a MIN. > > > > But it's incorrect (that's what I did originally). > > But `(a>= 16)? 0: (32872>> (a&0xf))` is correct. > > So is `(a>=16 ? 0 : 32872) >> ( a & 0xf)` . > > Or is it you want to avoid the conditional here. I believe the thing is that Richi's PR110838 changes for RSHIFT_EXPR are correct for arithmetic right shifts and we should keep doing what it does for those. But they are not correct for logical right shifts and they don't handle left shifts. Both logical right shifts and left shifts need to get 0 from the shift counts bigger than new_precision - 1, which can be achieved through one of (or << instead of >>): (op1 >= min_precision ? 0 : op0) >> (op1 & (min_precision - 1)) (op0 & (op1 < min_precision ? -1 : 0)) >> (op1 & (min_precision - 1)) op1 >= min_precision ? 0 : (op0 >> (op1 & (min_precision - 1))) (op0 >> (op1 & (min_precision - 1))) & (op1 < min_precision ? -1 : 0) Which one of these is best? For simplicity of vect_recog_over_widening_pattern probably the first one, unsure about what generates best code (and where).