174 lines · plain
1; RUN: llc -mtriple=arm64-apple-ios15 -aarch64-enable-sink-fold=true %s -o - | FileCheck %s --check-prefixes=CHECK-NOAUTH,CHECK2; RUN: llc -mtriple=arm64-apple-ios15 -aarch64-enable-sink-fold=true -mcpu=apple-a13 %s -o - | FileCheck %s --check-prefixes=CHECK-NOAUTH,CHECK3; RUN: llc -mtriple=arm64e-apple-ios15 -aarch64-enable-sink-fold=true %s -o - | FileCheck %s --check-prefixes=CHECK-AUTH,CHECK4 5; Important details in prologue:6; * x22 is stored just below x297; * Enough stack space is allocated for everything8define swifttailcc void @simple(ptr swiftasync %ctx) "frame-pointer"="all" {9; CHECK-LABEL: simple:10; CHECK: orr x29, x29, #0x10000000000000011; CHECK: sub sp, sp, #3212; CHECK: stp x29, x30, [sp, #16]13 14; CHECK-NOAUTH-DAG: str x22, [sp, #8]15; CHECK-AUTH: add x16, sp, #816; CHECK-AUTH: movk x16, #49946, lsl #4817; CHECK-AUTH: mov x17, x2218; CHECK-AUTH: pacdb x17, x1619; CHECK-AUTH: str x17, [sp, #8]20 21; CHECK-DAG: add x29, sp, #1622; CHECK: .cfi_def_cfa w29, 1623; CHECK: .cfi_offset w30, -824; CHECK: .cfi_offset w29, -1625 26;[...]27 28; CHECK: ldp x29, x30, [sp, #16]29; CHECK: and x29, x29, #0xefffffffffffffff30; CHECK: add sp, sp, #3231 32 ret void33}34 35define swifttailcc void @more_csrs(ptr swiftasync %ctx) "frame-pointer"="all" {36; CHECK-LABEL: more_csrs:37; CHECK: orr x29, x29, #0x10000000000000038; CHECK: str x23, [sp, #-32]!39; CHECK: stp x29, x30, [sp, #16]40 41; CHECK-NOAUTH-DAG: str x22, [sp, #8]42; CHECK-AUTH: add x16, sp, #843; CHECK-AUTH: movk x16, #49946, lsl #4844; CHECK-AUTH: mov x17, x2245; CHECK-AUTH: pacdb x17, x1646; CHECK-AUTH: str x17, [sp, #8]47 48; CHECK-DAG: add x29, sp, #1649; CHECK: .cfi_def_cfa w29, 1650; CHECK: .cfi_offset w30, -851; CHECK: .cfi_offset w29, -1652; CHECK: .cfi_offset w23, -3253 54; [...]55 56; CHECK: ldp x29, x30, [sp, #16]57; CHECK: ldr x23, [sp], #3258; CHECK: and x29, x29, #0xefffffffffffffff59 call void asm sideeffect "", "~{x23}"()60 ret void61}62 63define swifttailcc void @locals(ptr swiftasync %ctx) "frame-pointer"="all" {64; CHECK-LABEL: locals:65; CHECK: orr x29, x29, #0x10000000000000066; CHECK: sub sp, sp, #6467; CHECK: stp x29, x30, [sp, #48]68 69; CHECK-NOAUTH-DAG: str x22, [sp, #40]70; CHECK-AUTH: add x16, sp, #4071; CHECK-AUTH: movk x16, #49946, lsl #4872; CHECK-AUTH: mov x17, x2273; CHECK-AUTH: pacdb x17, x1674; CHECK-AUTH: str x17, [sp, #40]75 76; CHECK-DAG: add x29, sp, #4877; CHECK: .cfi_def_cfa w29, 1678; CHECK: .cfi_offset w30, -879; CHECK: .cfi_offset w29, -1680 81; CHECK: mov x0, sp82; CHECK: bl _bar83 84; [...]85 86; CHECK: ldp x29, x30, [sp, #48]87; CHECK: and x29, x29, #0xefffffffffffffff88; CHECK: add sp, sp, #6489 %var = alloca i32, i32 1090 call void @bar(ptr %var)91 ret void92}93 94define swifttailcc void @use_input_context(ptr swiftasync %ctx, ptr %ptr) "frame-pointer"="all" {95; CHECK-LABEL: use_input_context:96 97; CHECK-NOAUTH: str x22, [sp98; CHECK-AUTH: mov x17, x2299 100; CHECK-NOT: x22101; CHECK: str x22, [x0]102 103 store ptr %ctx, ptr %ptr104 ret void105}106 107define swifttailcc ptr @context_in_func() "frame-pointer"="non-leaf" {108; CHECK-LABEL: context_in_func:109 110; CHECK-NOAUTH: str xzr, [sp, #8]111; CHECK-AUTH: add x16, sp, #8112; CHECK-AUTH: movk x16, #49946, lsl #48113; CHECK-AUTH: mov x17, xzr114; CHECK-AUTH: pacdb x17, x16115; CHECK-AUTH: str x17, [sp, #8]116 117 %ptr = call ptr @llvm.swift.async.context.addr()118 ret ptr %ptr119}120 121define swifttailcc void @write_frame_context(ptr swiftasync %ctx, ptr %newctx) "frame-pointer"="non-leaf" {122; CHECK-LABEL: write_frame_context:123; CHECK: stur x0, [x29, #-8]124 %ptr = call ptr @llvm.swift.async.context.addr()125 store ptr %newctx, ptr %ptr126 ret void127}128 129define swifttailcc void @simple_fp_elim(ptr swiftasync %ctx) "frame-pointer"="non-leaf" {130; CHECK-LABEL: simple_fp_elim:131; CHECK-NOT: orr x29, x29, #0x100000000000000132 133 ret void134}135 136define swifttailcc void @large_frame(ptr swiftasync %ctx) "frame-pointer"="all" {137; CHECK-LABEL: large_frame:138; CHECK: str x28, [sp, #-32]!139; CHECK: stp x29, x30, [sp, #16]140; CHECK-NOAUTH-DAG: str x22, [sp, #8]141; CHECK-DAG: add x29, sp, #16142; CHECK: sub sp, sp, #1024143; [...]144; CHECK: add sp, sp, #1024145; CHECK: ldp x29, x30, [sp, #16]146; CHECK: ldr x28, [sp], #32147; CHECK: ret148 %var = alloca i8, i32 1024149 ret void150}151 152; Important point is that there is just one 8-byte gap in the CSR region (right153; now just above d8) to realign the stack.154define swifttailcc void @two_unpaired_csrs(ptr swiftasync) "frame-pointer"="all" {155; CHECK-LABEL: two_unpaired_csrs:156; CHECK: str d8, [sp, #-48]!157; CHECK: str x19, [sp, #16]158; CHECK: stp x29, x30, [sp, #32]159; CHECK-NOAUTH-DAG: str x22, [sp, #24]160; CHECK-DAG: add x29, sp, #32161 162; CHECK: .cfi_def_cfa w29, 16163; CHECK: .cfi_offset w30, -8164; CHECK: .cfi_offset w29, -16165; CHECK: .cfi_offset w19, -32166; CHECK: .cfi_offset b8, -48167 168 call void asm "","~{x19},~{d8}"()169 call swifttailcc void @bar(ptr undef)170 ret void171}172declare swifttailcc void @bar(ptr)173declare ptr @llvm.swift.async.context.addr()174