With -mtrack-speculation, the pattern that was directly expanded by aarch64_restore_za is disabled. Use the helper function instead.
gcc: * config/aarch64/aarch64.cc (aarch64_gen_compare_zero_and_branch): Export. * config/aarch64/aarch64-protos.h (aarch64_gen_compare_zero_and_branch): Declare it. * config/aarch64/aarch64-sme.md (aarch64_restore_za): Use it. * config/aarch64/aarch64.md (*aarch64_cbz<EQL><GPI>): Unexport. --- gcc/config/aarch64/aarch64-protos.h | 3 +++ gcc/config/aarch64/aarch64-sme.md | 3 ++- gcc/config/aarch64/aarch64.cc | 2 +- gcc/config/aarch64/aarch64.md | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index 36bd88593ff..7b9b16bd3bd 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -1281,4 +1281,7 @@ extern bool aarch64_gcs_enabled (); extern unsigned aarch64_data_alignment (const_tree exp, unsigned align); extern unsigned aarch64_stack_alignment (const_tree exp, unsigned align); +extern rtx aarch64_gen_compare_zero_and_branch (rtx_code code, rtx x, + rtx_code_label *label); + #endif /* GCC_AARCH64_PROTOS_H */ diff --git a/gcc/config/aarch64/aarch64-sme.md b/gcc/config/aarch64/aarch64-sme.md index 6b1a747a0f4..0123ea0e234 100644 --- a/gcc/config/aarch64/aarch64-sme.md +++ b/gcc/config/aarch64/aarch64-sme.md @@ -400,7 +400,8 @@ auto label = gen_label_rtx (); auto tpidr2 = gen_rtx_REG (DImode, R16_REGNUM); emit_insn (gen_aarch64_read_tpidr2 (tpidr2)); - auto jump = emit_likely_jump_insn (gen_aarch64_cbznedi1 (tpidr2, label)); + auto pat = aarch64_gen_compare_zero_and_branch (NE, tpidr2, label); + auto jump = emit_likely_jump_insn (pat); JUMP_LABEL (jump) = label; aarch64_restore_za (operands[0]); diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 120c2c1835e..9c35f679d28 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -2885,7 +2885,7 @@ aarch64_gen_compare_reg_maybe_ze (RTX_CODE code, rtx x, rtx y, /* Generate conditional branch to LABEL, comparing X to 0 using CODE. Return the jump instruction. */ -static rtx +rtx aarch64_gen_compare_zero_and_branch (rtx_code code, rtx x, rtx_code_label *label) { diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 2d86a02dea1..3da5bc2122d 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -804,7 +804,7 @@ ) ;; For an EQ/NE comparison against zero, emit `CBZ`/`CBNZ` -(define_insn "aarch64_cbz<optab><mode>1" +(define_insn "*aarch64_cbz<optab><mode>" [(set (pc) (if_then_else (EQL (match_operand:GPI 0 "register_operand" "r") (const_int 0)) (label_ref (match_operand 1)) -- 2.34.1