[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