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