1; RUN: llc -mtriple=x86_64-apple-macosx12.0 %s -o - | FileCheck %s 2; RUN: llc -mtriple=i686-apple-darwin %s -o - | FileCheck %s --check-prefix=CHECK-32 3 4 5define void @simple(ptr swiftasync %ctx) "frame-pointer"="all" { 6; CHECK-LABEL: simple: 7; CHECK: btsq $60, %rbp 8; CHECK: pushq %rbp 9; CHECK: pushq %r14 10; CHECK: leaq 8(%rsp), %rbp 11; CHECK: pushq 12; [...] 13 14; CHECK: addq $16, %rsp 15; CHECK: popq %rbp 16; CHECK: btrq $60, %rbp 17; CHECK: retq 18 19; CHECK-32-LABEL: simple: 20; CHECK-32: movl 8(%ebp), [[TMP:%.*]] 21; CHECK-32: movl [[TMP]], {{.*}}(%ebp) 22 23 ret void 24} 25 26define void @more_csrs(ptr swiftasync %ctx) "frame-pointer"="all" { 27; CHECK-LABEL: more_csrs: 28; CHECK: btsq $60, %rbp 29; CHECK: pushq %rbp 30; CHECK: .cfi_offset %rbp, -16 31; CHECK: pushq %r14 32; CHECK: leaq 8(%rsp), %rbp 33; CHECK: subq $8, %rsp 34; CHECK: pushq %r15 35; CHECK: .cfi_offset %r15, -40 36 37; [...] 38 39; CHECK: popq %r15 40; CHECK: addq $16, %rsp 41; CHECK: popq %rbp 42; CHECK: btrq $60, %rbp 43; CHECK: retq 44 call void asm sideeffect "", "~{r15}"() 45 ret void 46} 47 48define void @locals(ptr swiftasync %ctx) "frame-pointer"="all" { 49; CHECK-LABEL: locals: 50; CHECK: btsq $60, %rbp 51; CHECK: pushq %rbp 52; CHECK: .cfi_def_cfa_offset 16 53; CHECK: .cfi_offset %rbp, -16 54; CHECK: pushq %r14 55; CHECK: leaq 8(%rsp), %rbp 56; CHECK: .cfi_def_cfa_register %rbp 57; CHECK: subq $56, %rsp 58 59; CHECK: leaq -48(%rbp), %rdi 60; CHECK: callq _bar 61 62; CHECK: addq $48, %rsp 63; CHECK: addq $16, %rsp 64; CHECK: popq %rbp 65; CHECK: btrq $60, %rbp 66; CHECK: retq 67 68 %var = alloca i32, i32 10 69 call void @bar(ptr %var) 70 ret void 71} 72 73define void @use_input_context(ptr swiftasync %ctx, ptr %ptr) "frame-pointer"="all" { 74; CHECK-LABEL: use_input_context: 75; CHECK: movq %r14, (%rdi) 76 77 store ptr %ctx, ptr %ptr 78 ret void 79} 80 81define ptr @context_in_func() "frame-pointer"="non-leaf" { 82; CHECK-LABEL: context_in_func: 83; CHECK: leaq -8(%rbp), %rax 84 85; CHECK-32-LABEL: context_in_func 86; CHECK-32: movl %esp, %eax 87 88 %ptr = call ptr @llvm.swift.async.context.addr() 89 ret ptr %ptr 90} 91 92define void @write_frame_context(ptr swiftasync %ctx, ptr %newctx) "frame-pointer"="non-leaf" { 93; CHECK-LABEL: write_frame_context: 94; CHECK: movq %rbp, [[TMP:%.*]] 95; CHECK: subq $8, [[TMP]] 96; CHECK: movq %rdi, ([[TMP]]) 97 98 %ptr = call ptr @llvm.swift.async.context.addr() 99 store ptr %newctx, ptr %ptr 100 ret void 101} 102 103define void @simple_fp_elim(ptr swiftasync %ctx) "frame-pointer"="non-leaf" { 104; CHECK-LABEL: simple_fp_elim: 105; CHECK-NOT: btsq 106 107 ret void 108} 109 110declare void @bar(ptr) 111declare ptr @llvm.swift.async.context.addr() 112