[Lldb-commits] [clang-tools-extra] [clang] [compiler-rt] [llvm] [flang] [libcxx] [lldb] [lld] [libc] [AArch64][SME2] Preserve ZT0 state around function calls (PR #78321)

2024-01-20 Thread Kerry McLaughlin via lldb-commits

https://github.com/kmclaughlin-arm updated 
https://github.com/llvm/llvm-project/pull/78321

>From 11dce217ed307601d0ea1eb5b016b47f80e67786 Mon Sep 17 00:00:00 2001
From: Kerry McLaughlin 
Date: Thu, 11 Jan 2024 17:46:00 +
Subject: [PATCH 1/7] [SME2][Clang] Add tests with ZT0 state

---
 llvm/test/CodeGen/AArch64/sme-zt0-state.ll | 125 +
 1 file changed, 125 insertions(+)
 create mode 100644 llvm/test/CodeGen/AArch64/sme-zt0-state.ll

diff --git a/llvm/test/CodeGen/AArch64/sme-zt0-state.ll 
b/llvm/test/CodeGen/AArch64/sme-zt0-state.ll
new file mode 100644
index 00..ff560681665f8b
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/sme-zt0-state.ll
@@ -0,0 +1,125 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 
UTC_ARGS: --version 4
+; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2 -start-after=simplifycfg 
-enable-tail-merge=false -verify-machineinstrs < %s | FileCheck %s
+
+; Callee with no ZT state
+declare void @no_state_callee();
+
+; Callees with ZT0 state
+declare void @zt0_shared_callee() "aarch64_in_zt0";
+
+; Callees with ZA state
+
+declare void @za_shared_callee() "aarch64_pstate_za_shared";
+declare void @za_zt0_shared_callee() "aarch64_pstate_za_shared" 
"aarch64_in_zt0";
+
+;
+; Private-ZA Callee
+;
+
+; Expect spill & fill of ZT0 around call
+; Expect smstop/smstart za around call
+define void @zt0_in_caller_no_state_callee() "aarch64_in_zt0" nounwind {
+; CHECK-LABEL: zt0_in_caller_no_state_callee:
+; CHECK:   // %bb.0:
+; CHECK-NEXT:str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NEXT:bl no_state_callee
+; CHECK-NEXT:ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NEXT:ret
+  call void @no_state_callee();
+  ret void;
+}
+
+; Expect spill & fill of ZT0 around call
+; Expect setup and restore lazy-save around call
+; Expect smstart za after call
+define void @za_zt0_shared_caller_no_state_callee() "aarch64_pstate_za_shared" 
"aarch64_in_zt0" nounwind {
+; CHECK-LABEL: za_zt0_shared_caller_no_state_callee:
+; CHECK:   // %bb.0:
+; CHECK-NEXT:stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
+; CHECK-NEXT:mov x29, sp
+; CHECK-NEXT:sub sp, sp, #16
+; CHECK-NEXT:rdsvl x8, #1
+; CHECK-NEXT:mov x9, sp
+; CHECK-NEXT:msub x9, x8, x8, x9
+; CHECK-NEXT:mov sp, x9
+; CHECK-NEXT:sub x10, x29, #16
+; CHECK-NEXT:stur wzr, [x29, #-4]
+; CHECK-NEXT:sturh wzr, [x29, #-6]
+; CHECK-NEXT:stur x9, [x29, #-16]
+; CHECK-NEXT:sturh w8, [x29, #-8]
+; CHECK-NEXT:msr TPIDR2_EL0, x10
+; CHECK-NEXT:bl no_state_callee
+; CHECK-NEXT:smstart za
+; CHECK-NEXT:mrs x8, TPIDR2_EL0
+; CHECK-NEXT:sub x0, x29, #16
+; CHECK-NEXT:cbnz x8, .LBB1_2
+; CHECK-NEXT:  // %bb.1:
+; CHECK-NEXT:bl __arm_tpidr2_restore
+; CHECK-NEXT:  .LBB1_2:
+; CHECK-NEXT:msr TPIDR2_EL0, xzr
+; CHECK-NEXT:mov sp, x29
+; CHECK-NEXT:ldp x29, x30, [sp], #16 // 16-byte Folded Reload
+; CHECK-NEXT:ret
+  call void @no_state_callee();
+  ret void;
+}
+
+;
+; Shared-ZA Callee
+;
+
+; Caller and callee have shared ZT0 state, no spill/fill of ZT0 required
+define void @zt0_shared_caller_zt0_shared_callee() "aarch64_in_zt0" nounwind {
+; CHECK-LABEL: zt0_shared_caller_zt0_shared_callee:
+; CHECK:   // %bb.0:
+; CHECK-NEXT:str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NEXT:bl zt0_shared_callee
+; CHECK-NEXT:ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NEXT:ret
+  call void @zt0_shared_callee();
+  ret void;
+}
+
+; Expect spill & fill of ZT0 around call
+define void @za_zt0_shared_caller_za_shared_callee() 
"aarch64_pstate_za_shared" "aarch64_in_zt0" nounwind {
+; CHECK-LABEL: za_zt0_shared_caller_za_shared_callee:
+; CHECK:   // %bb.0:
+; CHECK-NEXT:stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
+; CHECK-NEXT:mov x29, sp
+; CHECK-NEXT:sub sp, sp, #16
+; CHECK-NEXT:rdsvl x8, #1
+; CHECK-NEXT:mov x9, sp
+; CHECK-NEXT:msub x8, x8, x8, x9
+; CHECK-NEXT:mov sp, x8
+; CHECK-NEXT:stur wzr, [x29, #-4]
+; CHECK-NEXT:sturh wzr, [x29, #-6]
+; CHECK-NEXT:stur x8, [x29, #-16]
+; CHECK-NEXT:bl za_shared_callee
+; CHECK-NEXT:mov sp, x29
+; CHECK-NEXT:ldp x29, x30, [sp], #16 // 16-byte Folded Reload
+; CHECK-NEXT:ret
+  call void @za_shared_callee();
+  ret void;
+}
+
+; Caller and callee have shared ZA & ZT0
+define void @za_zt0_shared_caller_za_zt0_shared_callee() 
"aarch64_pstate_za_shared" "aarch64_in_zt0" nounwind {
+; CHECK-LABEL: za_zt0_shared_caller_za_zt0_shared_callee:
+; CHECK:   // %bb.0:
+; CHECK-NEXT:stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
+; CHECK-NEXT:mov x29, sp
+; CHECK-NEXT:sub sp, sp, #16
+; CHECK-NEXT:rdsvl x8, #1
+; CHECK-NEXT:mov x9, sp
+; CHECK-NEXT:msub x8, x8, x8, x9
+; CHECK-NEXT:mov sp, x8
+; CHECK-NEXT:stur wzr, [x29, #-4]
+; CHECK-NEXT:sturh wzr, [x29, #-6]
+; CHECK-NEXT:stur x8, [x29, #-16]
+; CHECK-NEXT:bl za

[Lldb-commits] [clang-tools-extra] [clang] [compiler-rt] [llvm] [flang] [libcxx] [lldb] [lld] [libc] [AArch64][SME2] Preserve ZT0 state around function calls (PR #78321)

2024-01-20 Thread Kerry McLaughlin via lldb-commits

https://github.com/kmclaughlin-arm closed 
https://github.com/llvm/llvm-project/pull/78321
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits