Skip to content

Commit 3d5e8e4

Browse files
[PAC][CodeGen] Do not emit trivial 'mov xN, xN' on tail call (#109100)
Under some conditions, a trivial `mov xN xN` instruction was emitted on tail calls. Consider the following code: ``` class Test { public: virtual void f() {} }; void call_f(Test *t) { t->f(); } ``` Correponding assembly: ``` _Z6call_fP4Test: ldr x16, [x0] mov x17, x0 movk x17, #6503, lsl #48 autda x16, x17 ldr x1, [x16] =====> mov x16, x16 movk x16, #54167, lsl #48 braa x1, x16 ``` This patch makes such movs being omitted. Co-authored-by: Anatoly Trosinenko <[email protected]>
1 parent bb5e66e commit 3d5e8e4

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -2510,11 +2510,12 @@ void AArch64AsmPrinter::emitInstruction(const MachineInstr *MI) {
25102510
unsigned DiscReg = AddrDisc;
25112511
if (Disc) {
25122512
if (AddrDisc != AArch64::NoRegister) {
2513-
EmitToStreamer(*OutStreamer, MCInstBuilder(AArch64::ORRXrs)
2514-
.addReg(ScratchReg)
2515-
.addReg(AArch64::XZR)
2516-
.addReg(AddrDisc)
2517-
.addImm(0));
2513+
if (ScratchReg != AddrDisc)
2514+
EmitToStreamer(*OutStreamer, MCInstBuilder(AArch64::ORRXrs)
2515+
.addReg(ScratchReg)
2516+
.addReg(AArch64::XZR)
2517+
.addReg(AddrDisc)
2518+
.addImm(0));
25182519
EmitToStreamer(*OutStreamer, MCInstBuilder(AArch64::MOVKXi)
25192520
.addReg(ScratchReg)
25202521
.addReg(ScratchReg)

llvm/test/CodeGen/AArch64/ptrauth-call.ll

+21
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,27 @@ define i32 @test_tailcall_ib_var(ptr %arg0, ptr %arg1) #0 {
167167
ret i32 %tmp1
168168
}
169169

170+
define void @test_tailcall_omit_mov_x16_x16(ptr %objptr) #0 {
171+
; CHECK-LABEL: test_tailcall_omit_mov_x16_x16:
172+
; CHECK: ldr x16, [x0]
173+
; CHECK: mov x17, x0
174+
; CHECK: movk x17, #6503, lsl #48
175+
; CHECK: autda x16, x17
176+
; CHECK: ldr x1, [x16]
177+
; CHECK: movk x16, #54167, lsl #48
178+
; CHECK: braa x1, x16
179+
%vtable.signed = load ptr, ptr %objptr, align 8
180+
%objptr.int = ptrtoint ptr %objptr to i64
181+
%vtable.discr = tail call i64 @llvm.ptrauth.blend(i64 %objptr.int, i64 6503)
182+
%vtable.signed.int = ptrtoint ptr %vtable.signed to i64
183+
%vtable.unsigned.int = tail call i64 @llvm.ptrauth.auth(i64 %vtable.signed.int, i32 2, i64 %vtable.discr)
184+
%vtable.unsigned = inttoptr i64 %vtable.unsigned.int to ptr
185+
%virt.func.signed = load ptr, ptr %vtable.unsigned, align 8
186+
%virt.func.discr = tail call i64 @llvm.ptrauth.blend(i64 %vtable.unsigned.int, i64 54167)
187+
tail call void %virt.func.signed(ptr %objptr) [ "ptrauth"(i32 0, i64 %virt.func.discr) ]
188+
ret void
189+
}
190+
170191
define i32 @test_call_ia_arg(ptr %arg0, i64 %arg1) #0 {
171192
; DARWIN-LABEL: test_call_ia_arg:
172193
; DARWIN-NEXT: stp x29, x30, [sp, #-16]!

0 commit comments

Comments
 (0)