; RUN: llc -mtriple aarch64 -o - %s \ ; RUN: -aarch64-authenticated-lr-check-method=xpac-hint \ ; RUN: -stop-before=aarch64-ptrauth \ ; RUN: | FileCheck --check-prefix=MIR %s ; RUN: llc -mtriple aarch64 -o - %s -asm-verbose=0 \ ; RUN: -aarch64-authenticated-lr-check-method=xpac-hint \ ; RUN: | FileCheck --check-prefix=ASM %s 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" ;; Test that expansion of AUTH_TCRETURN does not crash due to unavailability of ;; neither x16 nor x17 as a scratch register. define i32 @test_scratch_reg_nobti(ptr %callee, ptr %addr) #0 { entry: ;; Force spilling of LR tail call void asm sideeffect "", "~{lr}"() ;; Clobber x0-x15 and x18-x29. This is rather fragile but it was observed to ;; trick regalloc into allocating both x16 and x17 as inputs of AUTH_TCRETURN. tail call void asm sideeffect "", "~{x0},~{x1},~{x2},~{x3},~{x4},~{x5},~{x6},~{x7},~{x8},~{x9},~{x10},~{x11},~{x12},~{x13},~{x14},~{x15}"() tail call void asm sideeffect "", "~{x18},~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28},~{fp}"() %addr.i = ptrtoint ptr %addr to i64 %call = tail call i32 %callee() #1 [ "ptrauth"(i32 0, i64 %addr.i) ] ret i32 %call } ;; Ensure the specific tail call pseudo instruction is used. ; MIR-LABEL: name: test_scratch_reg_nobti ; MIR: AUTH_TCRETURN{{ }} ; ; ASM-LABEL: test_scratch_reg_nobti: ; ASM-NEXT: pacibsp ; ASM-NEXT: sub sp, sp, #112 ; ASM-NEXT: stp x29, x30, [sp, #16] ; ASM-NEXT: mov x16, x1 ; ASM-NEXT: stp x28, x27, [sp, #32] ; ASM-NEXT: stp x26, x25, [sp, #48] ; ASM-NEXT: stp x24, x23, [sp, #64] ; ASM-NEXT: stp x22, x21, [sp, #80] ; ASM-NEXT: stp x20, x19, [sp, #96] ; ASM-NEXT: str x0, [sp, #8] ; ASM-NEXT: //APP ; ASM-NEXT: //NO_APP ; ASM-NEXT: //APP ; ASM-NEXT: //NO_APP ; ASM-NEXT: //APP ; ASM-NEXT: //NO_APP ; ASM-NEXT: ldr x0, [sp, #8] ; ASM-NEXT: ldp x20, x19, [sp, #96] ; ASM-NEXT: ldp x22, x21, [sp, #80] ; ASM-NEXT: ldp x24, x23, [sp, #64] ; ASM-NEXT: ldp x26, x25, [sp, #48] ; ASM-NEXT: ldp x28, x27, [sp, #32] ; ASM-NEXT: ldp x29, x30, [sp, #16] ; ASM-NEXT: add sp, sp, #112 ; ASM-NEXT: autibsp ; ASM-NEXT: eor x17, x30, x30, lsl #1 ; ASM-NEXT: tbz x17, #62, .Lauth_success_0 ; ASM-NEXT: brk #0xc471 ; ASM-NEXT: .Lauth_success_0: ; ASM-NEXT: braa x0, x16 ; ASM-NEXT: .Lfunc_end0: ;; The same for AUTH_TCRETURN_BTI. define i32 @test_scratch_reg_bti(ptr %callee, ptr %addr) "branch-target-enforcement" #0 { entry: ;; Force spilling of LR tail call void asm sideeffect "", "~{lr}"() ;; Clobber x0-x15 and x18-x29. This is rather fragile but it was observed to ;; trick regalloc into allocating both x16 and x17 as inputs of AUTH_TCRETURN_BTI. tail call void asm sideeffect "", "~{x0},~{x1},~{x2},~{x3},~{x4},~{x5},~{x6},~{x7},~{x8},~{x9},~{x10},~{x11},~{x12},~{x13},~{x14},~{x15}"() tail call void asm sideeffect "", "~{x18},~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28},~{fp}"() %addr.i = ptrtoint ptr %addr to i64 %call = tail call i32 %callee() #1 [ "ptrauth"(i32 0, i64 %addr.i) ] ret i32 %call } ;; Ensure the specific tail call pseudo instruction is used. ; MIR-LABEL: name: test_scratch_reg_bti ; MIR: AUTH_TCRETURN_BTI ; ; ASM-LABEL: test_scratch_reg_bti: ; ASM-NEXT: pacibsp ; ASM-NEXT: sub sp, sp, #112 ; ASM-NEXT: stp x29, x30, [sp, #16] ; ASM-NEXT: mov x16, x0 ; ASM-NEXT: stp x28, x27, [sp, #32] ; ASM-NEXT: stp x26, x25, [sp, #48] ; ASM-NEXT: stp x24, x23, [sp, #64] ; ASM-NEXT: stp x22, x21, [sp, #80] ; ASM-NEXT: stp x20, x19, [sp, #96] ; ASM-NEXT: str x1, [sp, #8] ; ASM-NEXT: //APP ; ASM-NEXT: //NO_APP ; ASM-NEXT: //APP ; ASM-NEXT: //NO_APP ; ASM-NEXT: //APP ; ASM-NEXT: //NO_APP ; ASM-NEXT: ldr x0, [sp, #8] ; ASM-NEXT: ldp x20, x19, [sp, #96] ; ASM-NEXT: ldp x22, x21, [sp, #80] ; ASM-NEXT: ldp x24, x23, [sp, #64] ; ASM-NEXT: ldp x26, x25, [sp, #48] ; ASM-NEXT: ldp x28, x27, [sp, #32] ; ASM-NEXT: ldp x29, x30, [sp, #16] ; ASM-NEXT: add sp, sp, #112 ; ASM-NEXT: autibsp ; ASM-NEXT: eor x17, x30, x30, lsl #1 ; ASM-NEXT: tbz x17, #62, .Lauth_success_1 ; ASM-NEXT: brk #0xc471 ; ASM-NEXT: .Lauth_success_1: ; ASM-NEXT: braa x16, x0 ; ASM-NEXT: .Lfunc_end1: attributes #0 = { nounwind "ptrauth-auth-traps" "ptrauth-calls" "ptrauth-returns" "target-features"="+pauth" }