[llvm] [AArch64][PAC] Don't skip global legalization for AUTH_TCRETURN (PR #182513)

via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 3 23:05:15 PST 2026


https://github.com/eleviant updated https://github.com/llvm/llvm-project/pull/182513

>From 331c8ed6f926e7ca6cdd189e3b0b08ea08165119 Mon Sep 17 00:00:00 2001
From: Evgeny Leviant <eleviant at accesssoftek.com>
Date: Fri, 20 Feb 2026 16:18:19 +0100
Subject: [PATCH] [AArch64][PAC] Don't skip global legalization for
 AUTH_TCRETURN

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.
---
 llvm/lib/Target/AArch64/AArch64ISelLowering.cpp  |  2 +-
 .../CodeGen/AArch64/ptrauth-tail-call-global.ll  | 16 ++++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/CodeGen/AArch64/ptrauth-tail-call-global.ll

diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index dd5e593edda4b..936f2275a121f 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);
     }
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..18b6ba470d8cc
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/ptrauth-tail-call-global.ll
@@ -0,0 +1,16 @@
+; RUN: llc --mattr=+pauth -filetype=asm < %s | FileCheck %s
+
+; CHECK:         adrp    x0, :got:global
+; CHECK-NEXT:    ldr     x0, [x0, :got_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 = global ptr null
+
+define dso_local void @foo() local_unnamed_addr {
+entry:
+  tail call void @global() [ "ptrauth"(i32 0, i64 0) ]
+  ret void
+}



More information about the llvm-commits mailing list