xref: /llvm-project/llvm/test/CodeGen/X86/swift-async.ll (revision 2f448bf509432c1a19ec46ab8cbc7353c03c6280)
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