[llvm-branch-commits] [llvm] AArch64: Relax x16/x17 constraint on AUT in certain cases. (PR #132857)
Peter Collingbourne via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jul 9 13:46:28 PDT 2025
https://github.com/pcc updated https://github.com/llvm/llvm-project/pull/132857
>From 4eac4350b8a540aba5c5ed658353b4f6abaf329b Mon Sep 17 00:00:00 2001
From: Peter Collingbourne <pcc at google.com>
Date: Thu, 5 Jun 2025 22:15:52 -0700
Subject: [PATCH 1/2] Address comments
Created using spr 1.3.6-beta.1
---
llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp | 6 ++++--
llvm/lib/Target/AArch64/AArch64InstrInfo.td | 3 +--
.../AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll | 4 ++--
llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll | 4 ++--
4 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
index 80924c4858ccc..716cae5395ebc 100644
--- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
+++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
@@ -173,7 +173,7 @@ class AArch64AsmPrinter : public AsmPrinter {
const MachineOperand *AUTAddrDisc,
Register Scratch,
std::optional<AArch64PACKey::ID> PACKey,
- uint64_t PACDisc, unsigned PACAddrDisc);
+ uint64_t PACDisc, Register PACAddrDisc);
// Emit the sequence to compute the discriminator.
//
@@ -1871,6 +1871,8 @@ Register AArch64AsmPrinter::emitPtrauthDiscriminator(uint16_t Disc,
Register AddrDisc,
Register ScratchReg,
bool MayUseAddrAsScratch) {
+ assert(ScratchReg == AArch64::X16 || ScratchReg == AArch64::X17 ||
+ !STI->isX16X17Safer());
// So far we've used NoRegister in pseudos. Now we need real encodings.
if (AddrDisc == AArch64::NoRegister)
AddrDisc = AArch64::XZR;
@@ -2073,7 +2075,7 @@ void AArch64AsmPrinter::emitPtrauthAuthResign(
Register AUTVal, AArch64PACKey::ID AUTKey, uint64_t AUTDisc,
const MachineOperand *AUTAddrDisc, Register Scratch,
std::optional<AArch64PACKey::ID> PACKey, uint64_t PACDisc,
- unsigned PACAddrDisc) {
+ Register PACAddrDisc) {
const bool IsAUTPAC = PACKey.has_value();
// We expand AUT/AUTPAC into a sequence of the form
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
index 37acdc3e9f7cc..caa247c3c2ce4 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -1955,8 +1955,7 @@ let Predicates = [HasPAuth] in {
def AUTxMxN : Pseudo<(outs GPR64:$AuthVal, GPR64common:$Scratch),
(ins GPR64:$Val, i32imm:$Key,
i64imm:$Disc, GPR64:$AddrDisc),
- []>, Sched<[WriteI, ReadI]> {
- let Constraints = "$AuthVal = $Val";
+ [], "$AuthVal = $Val">, Sched<[WriteI, ReadI]> {
let isCodeGenOnly = 1;
let hasSideEffects = 0;
let mayStore = 0;
diff --git a/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll b/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll
index e6651c83af8af..e2aea6df78250 100644
--- a/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll
+++ b/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll
@@ -165,10 +165,10 @@ define i64 @test_resign_blend_and_const(i64 %arg, i64 %arg1) {
; CHECKED-NEXT: mov x17, x16
; CHECKED-NEXT: xpacd x17
; CHECKED-NEXT: cmp x16, x17
-; CHECKED-NEXT: b.eq [[L]]auth_success_[[N2:[0-9]+]]
+; CHECKED-NEXT: b.eq [[L]]auth_success_1
; CHECKED-NEXT: mov x16, x17
; CHECKED-NEXT: b [[L]]resign_end_1
-; CHECKED-NEXT: Lauth_success_[[N2]]:
+; CHECKED-NEXT: Lauth_success_1:
; CHECKED-NEXT: mov x17, #56789
; CHECKED-NEXT: pacdb x16, x17
; CHECKED-NEXT: Lresign_end_1:
diff --git a/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll b/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll
index 47fa3f8e88c41..f95dc5600aec8 100644
--- a/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll
+++ b/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll
@@ -687,10 +687,10 @@ define i64 @test_resign_da_constdisc(i64 %arg, i64 %arg1) {
; CHECKED-NEXT: mov x17, x16
; CHECKED-NEXT: xpacd x17
; CHECKED-NEXT: cmp x16, x17
-; CHECKED-NEXT: b.eq [[L]]auth_success_[[N1:[0-9]+]]
+; CHECKED-NEXT: b.eq [[L]]auth_success_7
; CHECKED-NEXT: mov x16, x17
; CHECKED-NEXT: b [[L]]resign_end_6
-; CHECKED-NEXT: Lauth_success_[[N1]]:
+; CHECKED-NEXT: Lauth_success_7:
; CHECKED-NEXT: mov x17, #256
; CHECKED-NEXT: pacda x16, x17
; CHECKED-NEXT: Lresign_end_6:
>From 01161f76e5fbc64b96300171a5c09962fa9046f8 Mon Sep 17 00:00:00 2001
From: Peter Collingbourne <pcc at google.com>
Date: Wed, 9 Jul 2025 13:46:14 -0700
Subject: [PATCH 2/2] Address comment
Created using spr 1.3.6-beta.1
---
llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
index 4befc321acb3c..3d740a0cb3dc7 100644
--- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
+++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
@@ -178,14 +178,13 @@ class AArch64AsmPrinter : public AsmPrinter {
// Emit the sequence to compute the discriminator.
//
- // ScratchReg should be x16/x17.
- //
- // The returned register is either unmodified AddrDisc or x16/x17.
+ // The returned register is either unmodified AddrDisc or ScratchReg.
//
// If the expanded pseudo is allowed to clobber AddrDisc register, setting
// MayUseAddrAsScratch may save one MOV instruction, provided the address
// is already in x16/x17 (i.e. return x16/x17 which is the *modified* AddrDisc
- // register at the same time):
+ // register at the same time) or the OS doesn't make it safer to use x16/x17
+ // (see AArch64Subtarget::isX16X17Safer()):
//
// mov x17, x16
// movk x17, #1234, lsl #48
More information about the llvm-branch-commits
mailing list