Yvan Roux <[email protected]> writes:
> @@ -5454,6 +5454,16 @@ strip_address_mutations (rtx *loc, enum rtx_code
> *outer_code)
> /* Things like SIGN_EXTEND, ZERO_EXTEND and TRUNCATE can be
> used to convert between pointer sizes. */
> loc = &XEXP (*loc, 0);
> + else if (GET_RTX_CLASS (code) == RTX_BITFIELD_OPS)
> + {
> + /* Bitfield operations [SIGN|ZERO]_EXTRACT can be used too. */
> + enum machine_mode mode = GET_MODE(*loc);
> + unsigned HOST_WIDE_INT len = INTVAL (XEXP (*loc, 1));
> + HOST_WIDE_INT pos = INTVAL (XEXP (*loc, 2));
> +
> + if (pos == (BITS_BIG_ENDIAN ? GET_MODE_PRECISION (mode) - len : 0))
> + loc = &XEXP (*loc, 0);
> + }
This means that the other values of "pos" bypass the:
else
return loc;
so you'll get an infinite loop. I think it would be neater to split
this out into:
/* Return true if X is a sign_extract or zero_extract from the least
significant bit. */
static bool
lsb_bitfield_op_p (rtx X)
{
...;
}
else if (lsb_bitfield_op_p (*loc))
loc = &XEXP (*loc, 0);
Looks good to me otherwise FWIW.
Thanks,
Richard