Jackson Woodruff <jackson.woodr...@foss.arm.com> writes:
> diff --git a/gcc/config/aarch64/aarch64-simd.md 
> b/gcc/config/aarch64/aarch64-simd.md
> index 
> 74de9b8c89dd5e4e3d87504594c969de0e0128ce..ce1b981fc005edf48a401a456def2a37cf9d9022
>  100644
> --- a/gcc/config/aarch64/aarch64-simd.md
> +++ b/gcc/config/aarch64/aarch64-simd.md
> @@ -23,7 +23,10 @@
>       (match_operand:VALL_F16 1 "general_operand" ""))]
>    "TARGET_SIMD"
>    "
> -    if (GET_CODE (operands[0]) == MEM)
> +    if (GET_CODE (operands[0]) == MEM
> +     && !(aarch64_simd_imm_zero (operands[1], <MODE>mode)
> +          && aarch64_legitimate_address_p (<MODE>mode, operands[0],
> +                                           PARALLEL, 1)))
>        operands[1] = force_reg (<MODE>mode, operands[1]);

Sorry for only noticing now, but the call to aarch64_legitimate_address_p
is asking whether the MEM itself is a legitimate LDP/STP address.  Also,
it might be better to pass false for strict_p, since this can be called
before RA.  So maybe:

    if (GET_CODE (operands[0]) == MEM
        && !(aarch64_simd_imm_zero (operands[1], <MODE>mode)
             && aarch64_mem_pair_operand (operands[0], <MODE>mode)))

?

Thanks,
Richard

Reply via email to