xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/swifterror.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs < %s -mtriple=x86_64-apple-darwin | FileCheck --check-prefix=CHECK-APPLE %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -O0 < %s -mtriple=x86_64-apple-darwin | FileCheck --check-prefix=CHECK-O0 %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdeclare i8* @malloc(i64)
5*9880d681SAndroid Build Coastguard Workerdeclare void @free(i8*)
6*9880d681SAndroid Build Coastguard Worker%swift_error = type {i64, i8}
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; This tests the basic usage of a swifterror parameter. "foo" is the function
9*9880d681SAndroid Build Coastguard Worker; that takes a swifterror parameter and "caller" is the caller of "foo".
10*9880d681SAndroid Build Coastguard Workerdefine float @foo(%swift_error** swifterror %error_ptr_ref) {
11*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: foo:
12*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movl $16, %edi
13*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: malloc
14*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movb $1, 8(%rax)
15*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movq %rax, %r12
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: foo:
18*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movl $16
19*9880d681SAndroid Build Coastguard Worker; CHECK-O0: malloc
20*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movb $1, 8(%rax)
21*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq %{{.*}}, %r12
22*9880d681SAndroid Build Coastguard Workerentry:
23*9880d681SAndroid Build Coastguard Worker  %call = call i8* @malloc(i64 16)
24*9880d681SAndroid Build Coastguard Worker  %call.0 = bitcast i8* %call to %swift_error*
25*9880d681SAndroid Build Coastguard Worker  store %swift_error* %call.0, %swift_error** %error_ptr_ref
26*9880d681SAndroid Build Coastguard Worker  %tmp = getelementptr inbounds i8, i8* %call, i64 8
27*9880d681SAndroid Build Coastguard Worker  store i8 1, i8* %tmp
28*9880d681SAndroid Build Coastguard Worker  ret float 1.0
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker; "caller" calls "foo" that takes a swifterror parameter.
32*9880d681SAndroid Build Coastguard Workerdefine float @caller(i8* %error_ref) {
33*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: caller:
34*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: xorl %r12d, %r12d
35*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: callq {{.*}}foo
36*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: testq %r12, %r12
37*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: jne
38*9880d681SAndroid Build Coastguard Worker; Access part of the error object and save it to error_ref
39*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movb 8(%r12)
40*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movq %r12, %rdi
41*9880d681SAndroid Build Coastguard Worker; CHECK_APPLE: callq {{.*}}free
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: caller:
44*9880d681SAndroid Build Coastguard Worker; CHECK-O0: xorl
45*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movl %{{.*}}, %r12d
46*9880d681SAndroid Build Coastguard Worker; CHECK-O0: callq {{.*}}foo
47*9880d681SAndroid Build Coastguard Worker; CHECK-O0: jne
48*9880d681SAndroid Build Coastguard Workerentry:
49*9880d681SAndroid Build Coastguard Worker  %error_ptr_ref = alloca swifterror %swift_error*
50*9880d681SAndroid Build Coastguard Worker  store %swift_error* null, %swift_error** %error_ptr_ref
51*9880d681SAndroid Build Coastguard Worker  %call = call float @foo(%swift_error** swifterror %error_ptr_ref)
52*9880d681SAndroid Build Coastguard Worker  %error_from_foo = load %swift_error*, %swift_error** %error_ptr_ref
53*9880d681SAndroid Build Coastguard Worker  %had_error_from_foo = icmp ne %swift_error* %error_from_foo, null
54*9880d681SAndroid Build Coastguard Worker  %tmp = bitcast %swift_error* %error_from_foo to i8*
55*9880d681SAndroid Build Coastguard Worker  br i1 %had_error_from_foo, label %handler, label %cont
56*9880d681SAndroid Build Coastguard Workercont:
57*9880d681SAndroid Build Coastguard Worker  %v1 = getelementptr inbounds %swift_error, %swift_error* %error_from_foo, i64 0, i32 1
58*9880d681SAndroid Build Coastguard Worker  %t = load i8, i8* %v1
59*9880d681SAndroid Build Coastguard Worker  store i8 %t, i8* %error_ref
60*9880d681SAndroid Build Coastguard Worker  br label %handler
61*9880d681SAndroid Build Coastguard Workerhandler:
62*9880d681SAndroid Build Coastguard Worker  call void @free(i8* %tmp)
63*9880d681SAndroid Build Coastguard Worker  ret float 1.0
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; "caller2" is the caller of "foo", it calls "foo" inside a loop.
67*9880d681SAndroid Build Coastguard Workerdefine float @caller2(i8* %error_ref) {
68*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: caller2:
69*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: xorl %r12d, %r12d
70*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: callq {{.*}}foo
71*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: testq %r12, %r12
72*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: jne
73*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: ucomiss
74*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: jbe
75*9880d681SAndroid Build Coastguard Worker; Access part of the error object and save it to error_ref
76*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movb 8(%r12)
77*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movq %r12, %rdi
78*9880d681SAndroid Build Coastguard Worker; CHECK_APPLE: callq {{.*}}free
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: caller2:
81*9880d681SAndroid Build Coastguard Worker; CHECK-O0: xorl
82*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movl %{{.*}}, %r12d
83*9880d681SAndroid Build Coastguard Worker; CHECK-O0: callq {{.*}}foo
84*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq %r12, [[ID:%[a-z]+]]
85*9880d681SAndroid Build Coastguard Worker; CHECK-O0: cmpq $0, [[ID]]
86*9880d681SAndroid Build Coastguard Worker; CHECK-O0: jne
87*9880d681SAndroid Build Coastguard Workerentry:
88*9880d681SAndroid Build Coastguard Worker  %error_ptr_ref = alloca swifterror %swift_error*
89*9880d681SAndroid Build Coastguard Worker  br label %bb_loop
90*9880d681SAndroid Build Coastguard Workerbb_loop:
91*9880d681SAndroid Build Coastguard Worker  store %swift_error* null, %swift_error** %error_ptr_ref
92*9880d681SAndroid Build Coastguard Worker  %call = call float @foo(%swift_error** swifterror %error_ptr_ref)
93*9880d681SAndroid Build Coastguard Worker  %error_from_foo = load %swift_error*, %swift_error** %error_ptr_ref
94*9880d681SAndroid Build Coastguard Worker  %had_error_from_foo = icmp ne %swift_error* %error_from_foo, null
95*9880d681SAndroid Build Coastguard Worker  %tmp = bitcast %swift_error* %error_from_foo to i8*
96*9880d681SAndroid Build Coastguard Worker  br i1 %had_error_from_foo, label %handler, label %cont
97*9880d681SAndroid Build Coastguard Workercont:
98*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %call, 1.000000e+00
99*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %bb_end, label %bb_loop
100*9880d681SAndroid Build Coastguard Workerbb_end:
101*9880d681SAndroid Build Coastguard Worker  %v1 = getelementptr inbounds %swift_error, %swift_error* %error_from_foo, i64 0, i32 1
102*9880d681SAndroid Build Coastguard Worker  %t = load i8, i8* %v1
103*9880d681SAndroid Build Coastguard Worker  store i8 %t, i8* %error_ref
104*9880d681SAndroid Build Coastguard Worker  br label %handler
105*9880d681SAndroid Build Coastguard Workerhandler:
106*9880d681SAndroid Build Coastguard Worker  call void @free(i8* %tmp)
107*9880d681SAndroid Build Coastguard Worker  ret float 1.0
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; "foo_if" is a function that takes a swifterror parameter, it sets swifterror
111*9880d681SAndroid Build Coastguard Worker; under a certain condition.
112*9880d681SAndroid Build Coastguard Workerdefine float @foo_if(%swift_error** swifterror %error_ptr_ref, i32 %cc) {
113*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: foo_if:
114*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: testl %edi, %edi
115*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: je
116*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movl $16, %edi
117*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: malloc
118*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movb $1, 8(%rax)
119*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movq %rax, %r12
120*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-NOT: %r12
121*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: ret
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: foo_if:
124*9880d681SAndroid Build Coastguard Worker; CHECK-O0: cmpl $0
125*9880d681SAndroid Build Coastguard Worker; spill to stack
126*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq %r12, {{.*}}(%rsp)
127*9880d681SAndroid Build Coastguard Worker; CHECK-O0: je
128*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movl $16,
129*9880d681SAndroid Build Coastguard Worker; CHECK-O0: malloc
130*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq %rax, [[ID:%[a-z]+]]
131*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: movb $1, 8(%rax)
132*9880d681SAndroid Build Coastguard Worker; CHECK-O0-DAG: movq [[ID]], %r12
133*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ret
134*9880d681SAndroid Build Coastguard Worker; reload from stack
135*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq {{.*}}(%rsp), %r12
136*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ret
137*9880d681SAndroid Build Coastguard Workerentry:
138*9880d681SAndroid Build Coastguard Worker  %cond = icmp ne i32 %cc, 0
139*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %gen_error, label %normal
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workergen_error:
142*9880d681SAndroid Build Coastguard Worker  %call = call i8* @malloc(i64 16)
143*9880d681SAndroid Build Coastguard Worker  %call.0 = bitcast i8* %call to %swift_error*
144*9880d681SAndroid Build Coastguard Worker  store %swift_error* %call.0, %swift_error** %error_ptr_ref
145*9880d681SAndroid Build Coastguard Worker  %tmp = getelementptr inbounds i8, i8* %call, i64 8
146*9880d681SAndroid Build Coastguard Worker  store i8 1, i8* %tmp
147*9880d681SAndroid Build Coastguard Worker  ret float 1.0
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workernormal:
150*9880d681SAndroid Build Coastguard Worker  ret float 0.0
151*9880d681SAndroid Build Coastguard Worker}
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker; "foo_loop" is a function that takes a swifterror parameter, it sets swifterror
154*9880d681SAndroid Build Coastguard Worker; under a certain condition inside a loop.
155*9880d681SAndroid Build Coastguard Workerdefine float @foo_loop(%swift_error** swifterror %error_ptr_ref, i32 %cc, float %cc2) {
156*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: foo_loop:
157*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movq %r12, %rax
158*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: testl
159*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: je
160*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movl $16, %edi
161*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: malloc
162*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movb $1, 8(%rax)
163*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: ucomiss
164*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: jbe
165*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movq %rax, %r12
166*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: ret
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: foo_loop:
169*9880d681SAndroid Build Coastguard Worker; spill to stack
170*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq %r12, {{.*}}(%rsp)
171*9880d681SAndroid Build Coastguard Worker; CHECK-O0: cmpl $0
172*9880d681SAndroid Build Coastguard Worker; CHECK-O0: je
173*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movl $16,
174*9880d681SAndroid Build Coastguard Worker; CHECK-O0: malloc
175*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq %rax, [[ID:%[a-z]+]]
176*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movb $1, 8([[ID]])
177*9880d681SAndroid Build Coastguard Worker; CHECK-O0: jbe
178*9880d681SAndroid Build Coastguard Worker; reload from stack
179*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq {{.*}}(%rsp), %r12
180*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ret
181*9880d681SAndroid Build Coastguard Workerentry:
182*9880d681SAndroid Build Coastguard Worker  br label %bb_loop
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerbb_loop:
185*9880d681SAndroid Build Coastguard Worker  %cond = icmp ne i32 %cc, 0
186*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %gen_error, label %bb_cont
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workergen_error:
189*9880d681SAndroid Build Coastguard Worker  %call = call i8* @malloc(i64 16)
190*9880d681SAndroid Build Coastguard Worker  %call.0 = bitcast i8* %call to %swift_error*
191*9880d681SAndroid Build Coastguard Worker  store %swift_error* %call.0, %swift_error** %error_ptr_ref
192*9880d681SAndroid Build Coastguard Worker  %tmp = getelementptr inbounds i8, i8* %call, i64 8
193*9880d681SAndroid Build Coastguard Worker  store i8 1, i8* %tmp
194*9880d681SAndroid Build Coastguard Worker  br label %bb_cont
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Workerbb_cont:
197*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %cc2, 1.000000e+00
198*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %bb_end, label %bb_loop
199*9880d681SAndroid Build Coastguard Workerbb_end:
200*9880d681SAndroid Build Coastguard Worker  ret float 0.0
201*9880d681SAndroid Build Coastguard Worker}
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Worker%struct.S = type { i32, i32, i32, i32, i32, i32 }
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker; "foo_sret" is a function that takes a swifterror parameter, it also has a sret
206*9880d681SAndroid Build Coastguard Worker; parameter.
207*9880d681SAndroid Build Coastguard Workerdefine void @foo_sret(%struct.S* sret %agg.result, i32 %val1, %swift_error** swifterror %error_ptr_ref) {
208*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: foo_sret:
209*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movq %rdi, %{{.*}}
210*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movl $16, %edi
211*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: malloc
212*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movb $1, 8(%rax)
213*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movl %{{.*}}, 4(%{{.*}})
214*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movq %rax, %r12
215*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movq %{{.*}}, %rax
216*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-NOT: x19
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: foo_sret:
219*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movl $16,
220*9880d681SAndroid Build Coastguard Worker; spill sret to stack
221*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq %rdi,
222*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq {{.*}}, %rdi
223*9880d681SAndroid Build Coastguard Worker; CHECK-O0: malloc
224*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movb $1, 8(%rax)
225*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movl %{{.*}}, 4(%{{.*}})
226*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq %{{.*}}, %r12
227*9880d681SAndroid Build Coastguard Worker; reload sret from stack
228*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq {{.*}}(%rsp), %rax
229*9880d681SAndroid Build Coastguard Worker; CHECK-O0: ret
230*9880d681SAndroid Build Coastguard Workerentry:
231*9880d681SAndroid Build Coastguard Worker  %call = call i8* @malloc(i64 16)
232*9880d681SAndroid Build Coastguard Worker  %call.0 = bitcast i8* %call to %swift_error*
233*9880d681SAndroid Build Coastguard Worker  store %swift_error* %call.0, %swift_error** %error_ptr_ref
234*9880d681SAndroid Build Coastguard Worker  %tmp = getelementptr inbounds i8, i8* %call, i64 8
235*9880d681SAndroid Build Coastguard Worker  store i8 1, i8* %tmp
236*9880d681SAndroid Build Coastguard Worker  %v2 = getelementptr inbounds %struct.S, %struct.S* %agg.result, i32 0, i32 1
237*9880d681SAndroid Build Coastguard Worker  store i32 %val1, i32* %v2
238*9880d681SAndroid Build Coastguard Worker  ret void
239*9880d681SAndroid Build Coastguard Worker}
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Worker; "caller3" calls "foo_sret" that takes a swifterror parameter.
242*9880d681SAndroid Build Coastguard Workerdefine float @caller3(i8* %error_ref) {
243*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: caller3:
244*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movl $1, %esi
245*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: xorl %r12d, %r12d
246*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: callq {{.*}}foo_sret
247*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: testq %r12, %r12
248*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: jne
249*9880d681SAndroid Build Coastguard Worker; Access part of the error object and save it to error_ref
250*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movb 8(%r12),
251*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movb %{{.*}},
252*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movq %r12, %rdi
253*9880d681SAndroid Build Coastguard Worker; CHECK_APPLE: callq {{.*}}free
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: caller3:
256*9880d681SAndroid Build Coastguard Worker; CHECK-O0: xorl
257*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movl {{.*}}, %r12d
258*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movl $1, %esi
259*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq {{.*}}, %rdi
260*9880d681SAndroid Build Coastguard Worker; CHECK-O0: callq {{.*}}foo_sret
261*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq %r12,
262*9880d681SAndroid Build Coastguard Worker; CHECK-O0: cmpq $0
263*9880d681SAndroid Build Coastguard Worker; CHECK-O0: jne
264*9880d681SAndroid Build Coastguard Worker; Access part of the error object and save it to error_ref
265*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movb 8(%{{.*}}),
266*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movb %{{.*}},
267*9880d681SAndroid Build Coastguard Worker; reload from stack
268*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movq {{.*}}(%rsp), %rdi
269*9880d681SAndroid Build Coastguard Worker; CHECK-O0: callq {{.*}}free
270*9880d681SAndroid Build Coastguard Workerentry:
271*9880d681SAndroid Build Coastguard Worker  %s = alloca %struct.S, align 8
272*9880d681SAndroid Build Coastguard Worker  %error_ptr_ref = alloca swifterror %swift_error*
273*9880d681SAndroid Build Coastguard Worker  store %swift_error* null, %swift_error** %error_ptr_ref
274*9880d681SAndroid Build Coastguard Worker  call void @foo_sret(%struct.S* sret %s, i32 1, %swift_error** swifterror %error_ptr_ref)
275*9880d681SAndroid Build Coastguard Worker  %error_from_foo = load %swift_error*, %swift_error** %error_ptr_ref
276*9880d681SAndroid Build Coastguard Worker  %had_error_from_foo = icmp ne %swift_error* %error_from_foo, null
277*9880d681SAndroid Build Coastguard Worker  %tmp = bitcast %swift_error* %error_from_foo to i8*
278*9880d681SAndroid Build Coastguard Worker  br i1 %had_error_from_foo, label %handler, label %cont
279*9880d681SAndroid Build Coastguard Workercont:
280*9880d681SAndroid Build Coastguard Worker  %v1 = getelementptr inbounds %swift_error, %swift_error* %error_from_foo, i64 0, i32 1
281*9880d681SAndroid Build Coastguard Worker  %t = load i8, i8* %v1
282*9880d681SAndroid Build Coastguard Worker  store i8 %t, i8* %error_ref
283*9880d681SAndroid Build Coastguard Worker  br label %handler
284*9880d681SAndroid Build Coastguard Workerhandler:
285*9880d681SAndroid Build Coastguard Worker  call void @free(i8* %tmp)
286*9880d681SAndroid Build Coastguard Worker  ret float 1.0
287*9880d681SAndroid Build Coastguard Worker}
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Worker; This is a caller with multiple swifterror values, it calls "foo" twice, each
290*9880d681SAndroid Build Coastguard Worker; time with a different swifterror value, from "alloca swifterror".
291*9880d681SAndroid Build Coastguard Workerdefine float @caller_with_multiple_swifterror_values(i8* %error_ref, i8* %error_ref2) {
292*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE-LABEL: caller_with_multiple_swifterror_values:
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Worker; The first swifterror value:
295*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: xorl %r12d, %r12d
296*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: callq {{.*}}foo
297*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: testq %r12, %r12
298*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: jne
299*9880d681SAndroid Build Coastguard Worker; Access part of the error object and save it to error_ref
300*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movb 8(%r12)
301*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movq %r12, %rdi
302*9880d681SAndroid Build Coastguard Worker; CHECK_APPLE: callq {{.*}}free
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard Worker; The second swifterror value:
305*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: xorl %r12d, %r12d
306*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: callq {{.*}}foo
307*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: testq %r12, %r12
308*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: jne
309*9880d681SAndroid Build Coastguard Worker; Access part of the error object and save it to error_ref
310*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movb 8(%r12)
311*9880d681SAndroid Build Coastguard Worker; CHECK-APPLE: movq %r12, %rdi
312*9880d681SAndroid Build Coastguard Worker; CHECK_APPLE: callq {{.*}}free
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker; CHECK-O0-LABEL: caller_with_multiple_swifterror_values:
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Worker; The first swifterror value:
317*9880d681SAndroid Build Coastguard Worker; CHECK-O0: xorl
318*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movl %{{.*}}, %r12d
319*9880d681SAndroid Build Coastguard Worker; CHECK-O0: callq {{.*}}foo
320*9880d681SAndroid Build Coastguard Worker; CHECK-O0: jne
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker; The second swifterror value:
323*9880d681SAndroid Build Coastguard Worker; CHECK-O0: xorl
324*9880d681SAndroid Build Coastguard Worker; CHECK-O0: movl %{{.*}}, %r12d
325*9880d681SAndroid Build Coastguard Worker; CHECK-O0: callq {{.*}}foo
326*9880d681SAndroid Build Coastguard Worker; CHECK-O0: jne
327*9880d681SAndroid Build Coastguard Workerentry:
328*9880d681SAndroid Build Coastguard Worker  %error_ptr_ref = alloca swifterror %swift_error*
329*9880d681SAndroid Build Coastguard Worker  store %swift_error* null, %swift_error** %error_ptr_ref
330*9880d681SAndroid Build Coastguard Worker  %call = call float @foo(%swift_error** swifterror %error_ptr_ref)
331*9880d681SAndroid Build Coastguard Worker  %error_from_foo = load %swift_error*, %swift_error** %error_ptr_ref
332*9880d681SAndroid Build Coastguard Worker  %had_error_from_foo = icmp ne %swift_error* %error_from_foo, null
333*9880d681SAndroid Build Coastguard Worker  %tmp = bitcast %swift_error* %error_from_foo to i8*
334*9880d681SAndroid Build Coastguard Worker  br i1 %had_error_from_foo, label %handler, label %cont
335*9880d681SAndroid Build Coastguard Workercont:
336*9880d681SAndroid Build Coastguard Worker  %v1 = getelementptr inbounds %swift_error, %swift_error* %error_from_foo, i64 0, i32 1
337*9880d681SAndroid Build Coastguard Worker  %t = load i8, i8* %v1
338*9880d681SAndroid Build Coastguard Worker  store i8 %t, i8* %error_ref
339*9880d681SAndroid Build Coastguard Worker  br label %handler
340*9880d681SAndroid Build Coastguard Workerhandler:
341*9880d681SAndroid Build Coastguard Worker  call void @free(i8* %tmp)
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Worker  %error_ptr_ref2 = alloca swifterror %swift_error*
344*9880d681SAndroid Build Coastguard Worker  store %swift_error* null, %swift_error** %error_ptr_ref2
345*9880d681SAndroid Build Coastguard Worker  %call2 = call float @foo(%swift_error** swifterror %error_ptr_ref2)
346*9880d681SAndroid Build Coastguard Worker  %error_from_foo2 = load %swift_error*, %swift_error** %error_ptr_ref2
347*9880d681SAndroid Build Coastguard Worker  %had_error_from_foo2 = icmp ne %swift_error* %error_from_foo2, null
348*9880d681SAndroid Build Coastguard Worker  %bitcast2 = bitcast %swift_error* %error_from_foo2 to i8*
349*9880d681SAndroid Build Coastguard Worker  br i1 %had_error_from_foo2, label %handler2, label %cont2
350*9880d681SAndroid Build Coastguard Workercont2:
351*9880d681SAndroid Build Coastguard Worker  %v2 = getelementptr inbounds %swift_error, %swift_error* %error_from_foo2, i64 0, i32 1
352*9880d681SAndroid Build Coastguard Worker  %t2 = load i8, i8* %v2
353*9880d681SAndroid Build Coastguard Worker  store i8 %t2, i8* %error_ref2
354*9880d681SAndroid Build Coastguard Worker  br label %handler2
355*9880d681SAndroid Build Coastguard Workerhandler2:
356*9880d681SAndroid Build Coastguard Worker  call void @free(i8* %bitcast2)
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Worker  ret float 1.0
359*9880d681SAndroid Build Coastguard Worker}
360