Andrew Pinski <[email protected]> writes:
> Right now in simplify_subreg, there is code to try to simplify for word_mode
> with the binary bitwise operators. The unary bitwise operator is not handle,
> this causes an odd mix match and the new self testing code that was added with
> r16-2614-g965564eafb721f was not expecting.
>
> The self testing code was for testing the newly added code but since there
> was already code that handles word_mode, we hit the mismatch but only
> for targets where word_mode is SImode (or smaller).
>
> This adds the code to handle `not` in a similar fashion as the other
> bitwise operators for word_mode.
>
> Bootstrapped and tested on x86_64-linux-gnu.
>
> PR rtl-optimization/121308
> gcc/ChangeLog:
>
> * simplify-rtx.cc (simplify_context::simplify_subreg): Handle
> subreg of `not` with word_mode to make it symmetric with the
> other bitwise operators.
>
> Signed-off-by: Andrew Pinski <[email protected]>
> ---
> gcc/simplify-rtx.cc | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc
> index 442da9f40fa..0e12cf9657b 100644
> --- a/gcc/simplify-rtx.cc
> +++ b/gcc/simplify-rtx.cc
> @@ -8344,6 +8344,14 @@ simplify_context::simplify_subreg (machine_mode
> outermode, rtx op,
> return simplify_gen_binary (GET_CODE (op), outermode, op0, op1);
> }
>
> + /* Attempt to simplify WORD_MODE SUBREGs of unary bitwise expression. */
> + if (outermode == word_mode && GET_CODE (op) == NOT)
I think we want the "&& SCALAR_INT_MODE_P (innermode)" too.
OK with that change, and thanks for the fix.
Richard
> + {
> + rtx op0 = simplify_subreg (outermode, XEXP (op, 0), innermode, byte);
> + if (op0)
> + return simplify_gen_unary (GET_CODE (op), outermode, op0, outermode);
> + }
> +
> scalar_int_mode int_outermode, int_innermode;
> if (is_a <scalar_int_mode> (outermode, &int_outermode)
> && is_a <scalar_int_mode> (innermode, &int_innermode)