Hi, On Wed, 23 Nov 2016, Segher Boessenkool wrote:
> r242414, for PR77881, introduces some bugs (PR78390, PR78438, PR78477). > It all has the same root cause: that patch makes combine convert every > lowpart subreg of a logical shift right to a zero_extract. This cannot > work at all if it is not a constant shift, Even with non-constant shifts it remains an extract and make_extraction does support variable start positions (which is the shift amount), as does the zero_extract pattern (depending on target of course). > if (GET_CODE (inner) == LSHIFTRT > + && CONST_INT_P (XEXP (inner, 1)) > && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (inner)) > && subreg_lowpart_p (x)) > { > new_rtx = make_compound_operation (XEXP (inner, 0), next_code); > + int width = GET_MODE_PRECISION (GET_MODE (inner)) GET_MODE (new_rtx), because that's the object you're giving to make_extraction, not inner (and not XEXP(inner, 0)). > + - INTVAL (XEXP (inner, 1)); > + if (width > mode_width) > + width = mode_width; > new_rtx = make_extraction (mode, new_rtx, 0, XEXP (inner, 1), > - mode_width, 1, 0, in_code == COMPARE); > + width, 1, 0, in_code == COMPARE); > break; > } Ciao, Michael.