Later patches allow using SVE modes in ldp/stp with -msve-vector-bits=128, so we need to make sure that we don't use SVE addressing modes when printing the address for the ldp/stp.
This patch does that. Bootstrapped/regtested as a series on aarch64-linux-gnu, OK for trunk? gcc/ChangeLog: * config/aarch64/aarch64.cc (aarch64_print_address_internal): Handle SVE modes when printing ldp/stp addresses. --- gcc/config/aarch64/aarch64.cc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index abd029887e5..4820fac67a1 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -12661,6 +12661,9 @@ aarch64_print_address_internal (FILE *f, machine_mode mode, rtx x, return false; } + const bool load_store_pair_p = (type == ADDR_QUERY_LDP_STP + || type == ADDR_QUERY_LDP_STP_N); + if (aarch64_classify_address (&addr, x, mode, true, type)) switch (addr.type) { @@ -12672,7 +12675,15 @@ aarch64_print_address_internal (FILE *f, machine_mode mode, rtx x, } vec_flags = aarch64_classify_vector_mode (mode); - if (vec_flags & VEC_ANY_SVE) + if ((vec_flags & VEC_ANY_SVE) + && load_store_pair_p + && !addr.const_offset.is_constant ()) + { + output_operand_lossage ("poly offset in ldp/stp address"); + return false; + } + + if ((vec_flags & VEC_ANY_SVE) && !load_store_pair_p) { HOST_WIDE_INT vnum = exact_div (addr.const_offset,