@@ -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+
170191define 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