[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