[llvm] c050c48 - [llvm][AArch64] Eliminate redundant mov's sandwiching aut's in tail calls (#211105)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 23 09:02:56 PDT 2026
Author: Jon Roelofs
Date: 2026-07-23T09:02:51-07:00
New Revision: c050c487e9edb97ef44f53cb29fe1d8bcddb8f76
URL: https://github.com/llvm/llvm-project/commit/c050c487e9edb97ef44f53cb29fe1d8bcddb8f76
DIFF: https://github.com/llvm/llvm-project/commit/c050c487e9edb97ef44f53cb29fe1d8bcddb8f76.diff
LOG: [llvm][AArch64] Eliminate redundant mov's sandwiching aut's in tail calls (#211105)
When the target has +pauth, we don't have to use the hint space compatible encodings (auti[ab]1716), and instead can directly authenticate lr with auti[ab].
Added:
Modified:
llvm/lib/Target/AArch64/AArch64PointerAuth.cpp
llvm/test/CodeGen/AArch64/arm64e-tail-call-autib.ll
llvm/test/CodeGen/AArch64/pauth-lr-tail-call-fpdiff.ll
llvm/test/CodeGen/AArch64/swifttail-ptrauth.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/AArch64PointerAuth.cpp b/llvm/lib/Target/AArch64/AArch64PointerAuth.cpp
index f527f7c844c22..a9f27dcb706e2 100644
--- a/llvm/lib/Target/AArch64/AArch64PointerAuth.cpp
+++ b/llvm/lib/Target/AArch64/AArch64PointerAuth.cpp
@@ -349,13 +349,17 @@ void AArch64PointerAuthImpl::authenticateLR(
StackOffset::getFixed(-ArgumentStackToRestore), TII,
MachineInstr::FrameDestroy);
- BuildMI(MBB, MBBI, DL, TII->get(AArch64::ORRXrs), AArch64::X17)
- .addReg(AArch64::XZR)
- .addReg(AArch64::LR)
- .addImm(0)
- .setMIFlag(MachineInstr::FrameDestroy);
+ auto emitMOV = [&](Register Dst, Register Src) {
+ BuildMI(MBB, MBBI, DL, TII->get(AArch64::ORRXrs), Dst)
+ .addReg(AArch64::XZR)
+ .addReg(Src)
+ .addImm(0)
+ .setMIFlag(MachineInstr::FrameDestroy);
+ };
if (MFnI->branchProtectionPAuthLR() && Subtarget->hasPAuthLR()) {
+ emitMOV(AArch64::X17, AArch64::LR);
+
assert(PACSym && "No PAC instruction to refer to");
emitEpiloguePACSymOffsetIntoReg(*TII, MBB, MBBI, DL, PACSym,
AArch64::X15);
@@ -364,7 +368,11 @@ void AArch64PointerAuthImpl::authenticateLR(
unsigned AutOpc = UseBKey ? AArch64::AUTIB171615 : AArch64::AUTIA171615;
BuildMI(MBB, MBBI, DL, TII->get(AutOpc))
.setMIFlag(MachineInstr::FrameDestroy);
+
+ emitMOV(AArch64::LR, AArch64::X17);
} else if (MFnI->branchProtectionPAuthLR()) {
+ emitMOV(AArch64::X17, AArch64::LR);
+
assert(PACSym && "No PAC instruction to refer to");
emitEpiloguePACSymOffsetIntoReg(*TII, MBB, MBBI, DL, PACSym,
AArch64::X15);
@@ -381,18 +389,25 @@ void AArch64PointerAuthImpl::authenticateLR(
unsigned AutOpc = UseBKey ? AArch64::AUTIB1716 : AArch64::AUTIA1716;
BuildMI(MBB, MBBI, DL, TII->get(AutOpc))
.setMIFlag(MachineInstr::FrameDestroy);
+
+ emitMOV(AArch64::LR, AArch64::X17);
+ } else if (Subtarget->hasPAuth()) {
+ BuildMI(MBB, MBBI, DL,
+ TII->get(UseBKey ? AArch64::AUTIB : AArch64::AUTIA), AArch64::LR)
+ .addUse(AArch64::LR)
+ .addUse(AArch64::X16)
+ .setMIFlag(MachineInstr::FrameDestroy);
+ emitAUTCFI(MBB, MBBI, EmitAsyncCFI);
} else {
+ emitMOV(AArch64::X17, AArch64::LR);
+
unsigned AutOpc = UseBKey ? AArch64::AUTIB1716 : AArch64::AUTIA1716;
BuildMI(MBB, MBBI, DL, TII->get(AutOpc))
.setMIFlag(MachineInstr::FrameDestroy);
emitAUTCFI(MBB, MBBI, EmitAsyncCFI);
- }
- BuildMI(MBB, MBBI, DL, TII->get(AArch64::ORRXrs), AArch64::LR)
- .addReg(AArch64::XZR)
- .addReg(AArch64::X17)
- .addImm(0)
- .setMIFlag(MachineInstr::FrameDestroy);
+ emitMOV(AArch64::LR, AArch64::X17);
+ }
return;
}
diff --git a/llvm/test/CodeGen/AArch64/arm64e-tail-call-autib.ll b/llvm/test/CodeGen/AArch64/arm64e-tail-call-autib.ll
index d8e22b0c3cb04..bb478b0358c40 100644
--- a/llvm/test/CodeGen/AArch64/arm64e-tail-call-autib.ll
+++ b/llvm/test/CodeGen/AArch64/arm64e-tail-call-autib.ll
@@ -39,9 +39,7 @@ define swifttailcc void @test_async_tail_call(ptr swiftasync %ctx) "ptrauth-retu
; CHECK-NEXT: and x29, x29, #0xefffffffffffffff
; CHECK-NEXT: add sp, sp, #32
; CHECK-NEXT: add x16, sp, #16
-; CHECK-NEXT: mov x17, x30
-; CHECK-NEXT: autib1716
-; CHECK-NEXT: mov x30, x17
+; CHECK-NEXT: autib x30, x16
; CHECK-NEXT: eor x16, x30, x30, lsl #1
; CHECK-NEXT: tbz x16, #62, Lauth_success_0
; CHECK-NEXT: brk #0xc471
diff --git a/llvm/test/CodeGen/AArch64/pauth-lr-tail-call-fp
diff .ll b/llvm/test/CodeGen/AArch64/pauth-lr-tail-call-fp
diff .ll
index fac71d5ec4a59..04e0585a50593 100644
--- a/llvm/test/CodeGen/AArch64/pauth-lr-tail-call-fp
diff .ll
+++ b/llvm/test/CodeGen/AArch64/pauth-lr-tail-call-fp
diff .ll
@@ -61,26 +61,30 @@ define swifttailcc void @tail_call_fp
diff _a_key(ptr swiftasync %ctx) "branch-pro
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; CHECK-NEXT: add x16, sp, #16
-; CHECK-NEXT: mov x17, x30
+; COMPAT-NEXT: mov x17, x30
; COMPAT-NEXT: adrp x15, .Ltmp0
; COMPAT-NEXT: add x15, x15, :lo12:.Ltmp0
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #12
+; COMPAT-NEXT: mov x30, x17
+; V83A-NEXT: mov x17, x30
; V83A-NEXT: adrp x15, .Ltmp0
; V83A-NEXT: add x15, x15, :lo12:.Ltmp0
; V83A-NEXT: hint #39
; V83A-NEXT: autia1716
+; V83A-NEXT: mov x30, x17
+; V9A-NEXT: mov x17, x30
; V9A-NEXT: adrp x15, .Ltmp0
; V9A-NEXT: add x15, x15, :lo12:.Ltmp0
; V9A-NEXT: autia171615
+; V9A-NEXT: mov x30, x17
-; PAUTH-NEXT: autia1716
+; PAUTH-NEXT: autia x30, x16
; PAUTH-NEXT: .cfi_negate_ra_state
-; CHECK-NEXT: mov x30, x17
; CHECK-NEXT: b callee_stack_args
musttail call swifttailcc void @callee_stack_args(ptr swiftasync %ctx, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9)
ret void
@@ -136,26 +140,30 @@ define swifttailcc void @tail_call_fp
diff _b_key(ptr swiftasync %ctx) "branch-pro
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; CHECK-NEXT: add x16, sp, #16
-; CHECK-NEXT: mov x17, x30
+; COMPAT-NEXT: mov x17, x30
; COMPAT-NEXT: adrp x15, .Ltmp1
; COMPAT-NEXT: add x15, x15, :lo12:.Ltmp1
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #14
+; COMPAT-NEXT: mov x30, x17
+; V83A-NEXT: mov x17, x30
; V83A-NEXT: adrp x15, .Ltmp1
; V83A-NEXT: add x15, x15, :lo12:.Ltmp1
; V83A-NEXT: hint #39
; V83A-NEXT: autib1716
+; V83A-NEXT: mov x30, x17
+; V9A-NEXT: mov x17, x30
; V9A-NEXT: adrp x15, .Ltmp1
; V9A-NEXT: add x15, x15, :lo12:.Ltmp1
; V9A-NEXT: autib171615
+; V9A-NEXT: mov x30, x17
-; PAUTH-NEXT: autib1716
+; PAUTH-NEXT: autib x30, x16
; PAUTH-NEXT: .cfi_negate_ra_state
-; CHECK-NEXT: mov x30, x17
; CHECK-NEXT: b callee_stack_args
musttail call swifttailcc void @callee_stack_args(ptr swiftasync %ctx, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9)
ret void
@@ -330,26 +338,30 @@ define swifttailcc void @indirect_tail_call_fp
diff _a_key(ptr swiftasync %ctx, pt
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; CHECK-NEXT: add x16, sp, #16
-; CHECK-NEXT: mov x17, x30
+; COMPAT-NEXT: mov x17, x30
; COMPAT-NEXT: adrp x15, .Ltmp4
; COMPAT-NEXT: add x15, x15, :lo12:.Ltmp4
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #12
+; COMPAT-NEXT: mov x30, x17
+; V83A-NEXT: mov x17, x30
; V83A-NEXT: adrp x15, .Ltmp4
; V83A-NEXT: add x15, x15, :lo12:.Ltmp4
; V83A-NEXT: hint #39
; V83A-NEXT: autia1716
+; V83A-NEXT: mov x30, x17
+; V9A-NEXT: mov x17, x30
; V9A-NEXT: adrp x15, .Ltmp4
; V9A-NEXT: add x15, x15, :lo12:.Ltmp4
; V9A-NEXT: autia171615
+; V9A-NEXT: mov x30, x17
-; PAUTH-NEXT: autia1716
+; PAUTH-NEXT: autia x30, x16
; PAUTH-NEXT: .cfi_negate_ra_state
-; CHECK-NEXT: mov x30, x17
; CHECK-NEXT: br x8
musttail call swifttailcc void %callee(ptr swiftasync %ctx, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9)
ret void
@@ -406,26 +418,30 @@ define swifttailcc void @indirect_tail_call_fp
diff _b_key(ptr swiftasync %ctx, pt
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; CHECK-NEXT: add x16, sp, #16
-; CHECK-NEXT: mov x17, x30
+; COMPAT-NEXT: mov x17, x30
; COMPAT-NEXT: adrp x15, .Ltmp5
; COMPAT-NEXT: add x15, x15, :lo12:.Ltmp5
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #14
+; COMPAT-NEXT: mov x30, x17
+; V83A-NEXT: mov x17, x30
; V83A-NEXT: adrp x15, .Ltmp5
; V83A-NEXT: add x15, x15, :lo12:.Ltmp5
; V83A-NEXT: hint #39
; V83A-NEXT: autib1716
+; V83A-NEXT: mov x30, x17
+; V9A-NEXT: mov x17, x30
; V9A-NEXT: adrp x15, .Ltmp5
; V9A-NEXT: add x15, x15, :lo12:.Ltmp5
; V9A-NEXT: autib171615
+; V9A-NEXT: mov x30, x17
-; PAUTH-NEXT: autib1716
+; PAUTH-NEXT: autib x30, x16
; PAUTH-NEXT: .cfi_negate_ra_state
-; CHECK-NEXT: mov x30, x17
; CHECK-NEXT: br x8
musttail call swifttailcc void %callee(ptr swiftasync %ctx, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9)
ret void
diff --git a/llvm/test/CodeGen/AArch64/swifttail-ptrauth.ll b/llvm/test/CodeGen/AArch64/swifttail-ptrauth.ll
index bf074c4966e4b..18466af6894e0 100644
--- a/llvm/test/CodeGen/AArch64/swifttail-ptrauth.ll
+++ b/llvm/test/CodeGen/AArch64/swifttail-ptrauth.ll
@@ -167,26 +167,30 @@ define swifttailcc void @caller_to8_from0() "branch-protection-pauth-lr" "sign-r
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; CHECK-NEXT: add x16, sp, #16
-; CHECK-NEXT: mov x17, x30
+; COMPAT-NEXT: mov x17, x30
; COMPAT-NEXT: adrp x15, .Ltmp2
; COMPAT-NEXT: add x15, x15, :lo12:.Ltmp2
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #12
+; COMPAT-NEXT: mov x30, x17
+; V83A-NEXT: mov x17, x30
; V83A-NEXT: adrp x15, .Ltmp2
; V83A-NEXT: add x15, x15, :lo12:.Ltmp2
; V83A-NEXT: hint #39
; V83A-NEXT: autia1716
+; V83A-NEXT: mov x30, x17
+; V9A-NEXT: mov x17, x30
; V9A-NEXT: adrp x15, .Ltmp2
; V9A-NEXT: add x15, x15, :lo12:.Ltmp2
; V9A-NEXT: autia171615
+; V9A-NEXT: mov x30, x17
-; PAUTH-NEXT: autia1716
+; PAUTH-NEXT: autia x30, x16
; PAUTH-NEXT: .cfi_negate_ra_state
-; CHECK-NEXT: mov x30, x17
; CHECK-NEXT: b callee_stack8
tail call swifttailcc void @callee_stack8([8 x i64] poison, i64 42)
ret void
More information about the llvm-commits
mailing list