; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 ; RUN: llc -mtriple arm64e-apple-darwin -o - %s | FileCheck %s ; ; arm64e uses B-key signing via "ptrauth-returns". Test that tail calls ; with FPDiff != 0 use explicit autib x30, x16 (entry SP) instead of ; autibsp (wrong SP), and that FPDiff == 0 still uses autibsp. declare swifttailcc void @callee_async(ptr swiftasync %ctx, i64, i64, i64, i64, i64, i64, i64, i64, i64) declare swifttailcc void @callee_no_stack_args(ptr swiftasync %ctx) ; FPDiff != 0: Must use explicit autib with computed entry SP. define swifttailcc void @test_async_tail_call(ptr swiftasync %ctx) "ptrauth-returns" "ptrauth-auth-traps" "sign-return-address"="all" "frame-pointer"="all" { ; CHECK-LABEL: test_async_tail_call: ; CHECK: ; %bb.0: ; CHECK-NEXT: pacibsp ; CHECK-NEXT: .cfi_negate_ra_state ; CHECK-NEXT: orr x29, x29, #0x1000000000000000 ; CHECK-NEXT: sub sp, sp, #48 ; CHECK-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill ; CHECK-NEXT: add x16, sp, #8 ; CHECK-NEXT: movk x16, #49946, lsl #48 ; CHECK-NEXT: mov x17, x22 ; CHECK-NEXT: pacdb x17, x16 ; CHECK-NEXT: str x17, [sp, #8] ; CHECK-NEXT: add x29, sp, #16 ; CHECK-NEXT: .cfi_def_cfa w29, 32 ; CHECK-NEXT: .cfi_offset w30, -24 ; CHECK-NEXT: .cfi_offset w29, -32 ; CHECK-NEXT: mov w8, #9 ; =0x9 ; CHECK-NEXT: str x8, [x29, #16] ; CHECK-NEXT: mov w0, #1 ; =0x1 ; CHECK-NEXT: mov w1, #2 ; =0x2 ; CHECK-NEXT: mov w2, #3 ; =0x3 ; CHECK-NEXT: mov w3, #4 ; =0x4 ; CHECK-NEXT: mov w4, #5 ; =0x5 ; CHECK-NEXT: mov w5, #6 ; =0x6 ; CHECK-NEXT: mov w6, #7 ; =0x7 ; CHECK-NEXT: mov w7, #8 ; =0x8 ; CHECK-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload ; CHECK-NEXT: and x29, x29, #0xefffffffffffffff ; CHECK-NEXT: add sp, sp, #32 ; CHECK-NEXT: mov x17, x30 ; CHECK-NEXT: add x16, sp, #16 ; CHECK-NEXT: autib1716 ; CHECK-NEXT: mov x30, x17 ; CHECK-NEXT: eor x16, x30, x30, lsl #1 ; CHECK-NEXT: tbz x16, #62, Lauth_success_0 ; CHECK-NEXT: brk #0xc471 ; CHECK-NEXT: Lauth_success_0: ; CHECK-NEXT: b _callee_async musttail call swifttailcc void @callee_async(ptr swiftasync %ctx, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9) ret void } ; FPDiff == 0: autibsp is correct here. define swifttailcc void @test_no_fpdiff_tail_call(ptr swiftasync %ctx) "ptrauth-returns" "ptrauth-auth-traps" "sign-return-address"="all" "frame-pointer"="all" { ; CHECK-LABEL: test_no_fpdiff_tail_call: ; CHECK: ; %bb.0: ; CHECK-NEXT: pacibsp ; CHECK-NEXT: .cfi_negate_ra_state ; CHECK-NEXT: orr x29, x29, #0x1000000000000000 ; CHECK-NEXT: sub sp, sp, #32 ; CHECK-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill ; CHECK-NEXT: add x16, sp, #8 ; CHECK-NEXT: movk x16, #49946, lsl #48 ; CHECK-NEXT: mov x17, x22 ; CHECK-NEXT: pacdb x17, x16 ; CHECK-NEXT: str x17, [sp, #8] ; CHECK-NEXT: add x29, sp, #16 ; CHECK-NEXT: .cfi_def_cfa w29, 16 ; CHECK-NEXT: .cfi_offset w30, -8 ; CHECK-NEXT: .cfi_offset w29, -16 ; CHECK-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload ; CHECK-NEXT: and x29, x29, #0xefffffffffffffff ; CHECK-NEXT: add sp, sp, #32 ; CHECK-NEXT: autibsp ; CHECK-NEXT: eor x16, x30, x30, lsl #1 ; CHECK-NEXT: tbz x16, #62, Lauth_success_1 ; CHECK-NEXT: brk #0xc471 ; CHECK-NEXT: Lauth_success_1: ; CHECK-NEXT: b _callee_no_stack_args musttail call swifttailcc void @callee_no_stack_args(ptr swiftasync %ctx) ret void }