https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/101932
Backport fb470db7b3a8ce6853e8bf17d235617a2fa79434 Requested by: @sdesmalen-arm >From 1bc684848a555a31d36fe0b3fe3bf263ecb66758 Mon Sep 17 00:00:00 2001 From: Sander de Smalen <sander.desma...@arm.com> Date: Fri, 2 Aug 2024 10:29:08 +0100 Subject: [PATCH] [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) --- .../AArch64/AArch64TargetTransformInfo.cpp | 3 +- .../Inline/AArch64/sme-pstateza-attrs.ll | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp index 45148449dfb82..9630b36b99348 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 816492768cc0f..5e638103a2b06 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