Hi! On Sun, Jul 19, 2020 at 10:42:16AM +0100, Roger Sayle wrote: > This patch to simplify-rtx.c > simplifies (sign_extend:HI (truncate:QI (?shiftrt:HI x 8))) to just > (ashiftrt:HI x 8), as the inner shift already sets the high bits > appropriately.
> The one oddity of the patch is that it tests for > LSHIFTRT as inner shift, as simplify/combine has already canonicalized > this to a logical shift, assuming that the distinction is unimportant > following the truncation. If simplify-rtx does that, that is a bug. But combine will do this, I think that is what you are seeing? Can you verify it already works if the ASHIFTRT is not changed to an LSHIFTRT? > + if (is_a <scalar_int_mode> (mode, &m_mode) > + && is_a <scalar_int_mode> (GET_MODE (op), &n_mode) > + && is_a <scalar_int_mode> (GET_MODE (old_shift), &o_mode) > + && GET_MODE_PRECISION (o_mode) - GET_MODE_PRECISION (n_mode) > + == INTVAL (XEXP (old_shift, 1))) > + { > + rtx new_shift = simplify_gen_binary (ASHIFTRT, > + GET_MODE (old_shift), > + XEXP (old_shift, 0), > + XEXP (old_shift, 1)); > + if (GET_MODE_PRECISION (m_mode) > GET_MODE_PRECISION (o_mode)) > + return simplify_gen_unary (SIGN_EXTEND, mode, new_shift, > + GET_MODE (new_shift)); > + if (mode != GET_MODE (new_shift)) > + return simplify_gen_unary (TRUNCATE, mode, new_shift, > + GET_MODE (new_shift)); > + return new_shift; > + } Yeah looks like it :-) You could say combine should be smarter about this, but this is a valid simplification in itself. So, okay for trunk. Thank you! Segher