On Fri, Feb 12, 2016 at 01:48:36PM +0100, Richard Biener wrote: > But my patch should deal with all this. > > - mode1 = GET_MODE (xop1) != VOIDmode ? GET_MODE (xop1) : mode; > - if (xmode1 != VOIDmode && xmode1 != mode1) > + mode1 = GET_MODE (xop1); > + if (xmode1 != mode1) > { > xop1 = convert_modes (xmode1, mode1, xop1, unsignedp); > mode1 = xmode1; > > so if xop1 is not VOIDmode and already of xmode1 we won't do anything. > But if it is VOIDmode (and xmode1 is not VOIDmode) we'll always > do convert_modes.
The case I'm worried about is if xop1 is a constant in narrower mode (let's say QImode), e.g. -15, unsignedp is 1, and xmode1 is wider. Then previously we'd zero extend it, thus get 0xf1, but with your patch we'll end up with -15 instead, because convert_modes will be called e.g. with (SImode, VOIDmode, xop1, 1) instead of (SImode, QImode, xop1, 1). Dunno if it is just hypothetical or real. Jakub