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