[llvm] [AArch64][PAC] Don't skip global legalization for AUTH_TCRETURN (PR #182513)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 20 07:36:54 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-aarch64
Author: None (eleviant)
<details>
<summary>Changes</summary>
The 77bcab835aca1 folds llvm.ptrauth.reassign intrinsic in case intrinsic discriminant and key match those in call ptrauth bundle. However assertion is now fired in AArch64AsmPrinter when PAC is enabled and we're tail calling a global, because AUTH_TCRETURN expects address to be stored in register.
---
Full diff: https://github.com/llvm/llvm-project/pull/182513.diff
2 Files Affected:
- (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp (+2-2)
- (added) llvm/test/CodeGen/AArch64/ptrauth-tail-call-global.ll (+18)
``````````diff
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index dd5e593edda4b..98b2e2b22d037 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -10414,7 +10414,7 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
if (OpFlags & AArch64II::MO_GOT) {
Callee = DAG.getTargetGlobalAddress(CalledGlobal, DL, PtrVT, 0, OpFlags);
Callee = DAG.getNode(AArch64ISD::LOADgot, DL, PtrVT, Callee);
- } else {
+ } else if (!CLI.PAI || !IsTailCall) {
const GlobalValue *GV = G->getGlobal();
Callee = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0, OpFlags);
}
@@ -10426,7 +10426,7 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
if (UseGot) {
Callee = DAG.getTargetExternalSymbol(Sym, PtrVT, AArch64II::MO_GOT);
Callee = DAG.getNode(AArch64ISD::LOADgot, DL, PtrVT, Callee);
- } else {
+ } else if (!CLI.PAI || !IsTailCall) {
Callee = DAG.getTargetExternalSymbol(Sym, PtrVT, 0);
}
}
diff --git a/llvm/test/CodeGen/AArch64/ptrauth-tail-call-global.ll b/llvm/test/CodeGen/AArch64/ptrauth-tail-call-global.ll
new file mode 100644
index 0000000000000..082dd257e3441
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/ptrauth-tail-call-global.ll
@@ -0,0 +1,18 @@
+; RUN: llc --mattr=+pauth -filetype=asm < %s | FileCheck %s
+
+; CHECK: adrp x0, global
+; CHECK-NEXT: add x0, x0, :lo12:global
+; CHECK-NEXT: braaz x0
+
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
+target triple = "aarch64-unknown-linux-pauthtest"
+
+ at global = dso_local local_unnamed_addr global [256 x i8] zeroinitializer, align 16
+
+define dso_local void @_Z3foov() local_unnamed_addr {
+entry:
+ tail call void @global() [ "ptrauth"(i32 0, i64 0) ]
+ ret void
+}
+
``````````
</details>
https://github.com/llvm/llvm-project/pull/182513
More information about the llvm-commits
mailing list