[llvm] [AArch64][SME] Implement the SME ABI (ZA state management) in Machine IR (PR #149062)

Gaƫtan Bossu via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 18 01:03:04 PDT 2025


================
@@ -1,53 +1,133 @@
-; RUN: opt -S -mtriple=aarch64-linux-gnu -aarch64-sme-abi %s | FileCheck %s
-; RUN: opt -S -mtriple=aarch64-linux-gnu -aarch64-sme-abi -aarch64-sme-abi %s | FileCheck %s
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -O0 -mtriple=aarch64-linux-gnu -mattr=+sme -verify-machineinstrs < %s | FileCheck %s
+; RUN: llc -O0 -mtriple=aarch64-linux-gnu -mattr=+sme -verify-machineinstrs -aarch64-new-sme-abi < %s | FileCheck %s --check-prefix=CHECK-NEWLOWERING
 
 declare void @shared_za_callee() "aarch64_inout_za"
 
 define void @private_za() "aarch64_new_za" {
-; CHECK-LABEL: @private_za(
-; CHECK-NEXT:  prelude:
-; CHECK-NEXT:    [[TPIDR2:%.*]] = call i64 @llvm.aarch64.sme.get.tpidr2()
-; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i64 [[TPIDR2]], 0
-; CHECK-NEXT:    br i1 [[CMP]], label [[SAVE_ZA:%.*]], label [[TMP0:%.*]]
-; CHECK:       save.za:
-; CHECK-NEXT:    call aarch64_sme_preservemost_from_x0 void @__arm_tpidr2_save()
-; CHECK-NEXT:    call void @llvm.aarch64.sme.set.tpidr2(i64 0)
-; CHECK-NEXT:    br label [[TMP0]]
-; CHECK:       0:
-; CHECK-NEXT:    call void @llvm.aarch64.sme.za.enable()
-; CHECK-NEXT:    call void @llvm.aarch64.sme.zero(i32 255)
-; CHECK-NEXT:    call void @shared_za_callee()
-; CHECK-NEXT:    call void @llvm.aarch64.sme.za.disable()
-; CHECK-NEXT:    ret void
+; CHECK-LABEL: private_za:
+; CHECK:       // %bb.0: // %prelude
+; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    .cfi_offset w30, -16
+; CHECK-NEXT:    rdsvl x8, #1
+; CHECK-NEXT:    mrs x8, TPIDR2_EL0
+; CHECK-NEXT:    cbz x8, .LBB0_2
----------------
gbossu wrote:

AFAIU, this is checking whether a lazy save buffer has been set up. In that case, ZA the `aarch64_new_za` function needs to commit the lazy save. We do not check for the `active` state, so I'm guessing it is completely safe to call `smstart za` when ZA is already active.

https://github.com/llvm/llvm-project/pull/149062


More information about the llvm-commits mailing list