Author: Sander de Smalen Date: 2024-08-10T11:53:55+02:00 New Revision: ad5beb7386ad86da7a568d5c5304a3acbd2b7296
URL: https://github.com/llvm/llvm-project/commit/ad5beb7386ad86da7a568d5c5304a3acbd2b7296 DIFF: https://github.com/llvm/llvm-project/commit/ad5beb7386ad86da7a568d5c5304a3acbd2b7296.diff LOG: [AArch64] Avoid inlining if ZT0 needs preserving. (#101343) Inlining may result in different behaviour when the callee clobbers ZT0, because normally the call-site will have code to preserve ZT0. When inlining the function this code to preserve ZT0 will no longer be emitted, and so the resulting behaviour of the program is changed. (cherry picked from commit fb470db7b3a8ce6853e8bf17d235617a2fa79434) Added: Modified: llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp llvm/test/Transforms/Inline/AArch64/sme-pstateza-attrs.ll Removed: ################################################################################ diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp index 45148449dfb821..9630b36b993484 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp @@ -254,7 +254,8 @@ bool AArch64TTIImpl::areInlineCompatible(const Function *Caller, return false; if (CallerAttrs.requiresLazySave(CalleeAttrs) || - CallerAttrs.requiresSMChange(CalleeAttrs)) { + CallerAttrs.requiresSMChange(CalleeAttrs) || + CallerAttrs.requiresPreservingZT0(CalleeAttrs)) { if (hasPossibleIncompatibleOps(Callee)) return false; } diff --git a/llvm/test/Transforms/Inline/AArch64/sme-pstateza-attrs.ll b/llvm/test/Transforms/Inline/AArch64/sme-pstateza-attrs.ll index 816492768cc0f5..5e638103a2b063 100644 --- a/llvm/test/Transforms/Inline/AArch64/sme-pstateza-attrs.ll +++ b/llvm/test/Transforms/Inline/AArch64/sme-pstateza-attrs.ll @@ -231,6 +231,51 @@ define void @shared_za_caller_private_za_callee_call_tpidr2_restore_dont_inline( ret void } +define void @nonzt0_callee() { +; CHECK-LABEL: define void @nonzt0_callee +; CHECK-SAME: () #[[ATTR0]] { +; CHECK-NEXT: call void asm sideeffect " +; CHECK-NEXT: call void @inlined_body() +; CHECK-NEXT: ret void +; + call void asm sideeffect "; inlineasm", ""() + call void @inlined_body() + ret void +} + +define void @shared_zt0_caller_nonzt0_callee_dont_inline() "aarch64_inout_zt0" { +; CHECK-LABEL: define void @shared_zt0_caller_nonzt0_callee_dont_inline +; CHECK-SAME: () #[[ATTR3:[0-9]+]] { +; CHECK-NEXT: call void @nonzt0_callee() +; CHECK-NEXT: ret void +; + call void @nonzt0_callee() + ret void +} + +define void @shared_zt0_callee() "aarch64_inout_zt0" { +; CHECK-LABEL: define void @shared_zt0_callee +; CHECK-SAME: () #[[ATTR3]] { +; CHECK-NEXT: call void asm sideeffect " +; CHECK-NEXT: call void @inlined_body() +; CHECK-NEXT: ret void +; + call void asm sideeffect "; inlineasm", ""() + call void @inlined_body() + ret void +} + +define void @shared_zt0_caller_shared_zt0_callee_inline() "aarch64_inout_zt0" { +; CHECK-LABEL: define void @shared_zt0_caller_shared_zt0_callee_inline +; CHECK-SAME: () #[[ATTR3]] { +; CHECK-NEXT: call void asm sideeffect " +; CHECK-NEXT: call void @inlined_body() +; CHECK-NEXT: ret void +; + call void @shared_zt0_callee() + ret void +} + declare void @__arm_za_disable() declare void @__arm_tpidr2_save() declare void @__arm_tpidr2_restore(ptr) _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits