[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / llvm / test / CodeGen / X86 / swifterror.ll
blob88b81f12f4d67f6ef702982da6a91d04a863e614
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp
2 ; RUN: llc -verify-machineinstrs < %s -mtriple=x86_64-apple-darwin -disable-block-placement | FileCheck --check-prefix=CHECK-APPLE %s
3 ; RUN: llc -verify-machineinstrs -O0 < %s -mtriple=x86_64-apple-darwin -disable-block-placement | FileCheck --check-prefix=CHECK-O0 %s
4 ; RUN: llc -verify-machineinstrs < %s -mtriple=i386-apple-darwin -disable-block-placement | FileCheck --check-prefix=CHECK-i386 %s
6 declare ptr @malloc(i64)
7 declare void @free(ptr)
8 %swift_error = type {i64, i8}
10 ; This tests the basic usage of a swifterror parameter. "foo" is the function
11 ; that takes a swifterror parameter and "caller" is the caller of "foo".
12 define float @foo(ptr swifterror %error_ptr_ref) {
13 ; CHECK-APPLE-LABEL: foo:
14 ; CHECK-APPLE:       ## %bb.0: ## %entry
15 ; CHECK-APPLE-NEXT:    pushq %rax
16 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
17 ; CHECK-APPLE-NEXT:    movl $16, %edi
18 ; CHECK-APPLE-NEXT:    callq _malloc
19 ; CHECK-APPLE-NEXT:    movb $1, 8(%rax)
20 ; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
21 ; CHECK-APPLE-NEXT:    movq %rax, %r12
22 ; CHECK-APPLE-NEXT:    popq %rax
23 ; CHECK-APPLE-NEXT:    retq
25 ; CHECK-O0-LABEL: foo:
26 ; CHECK-O0:       ## %bb.0: ## %entry
27 ; CHECK-O0-NEXT:    pushq %rax
28 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
29 ; CHECK-O0-NEXT:    movl $16, %edi
30 ; CHECK-O0-NEXT:    callq _malloc
31 ; CHECK-O0-NEXT:    movq %rax, %r12
32 ; CHECK-O0-NEXT:    movb $1, 8(%rax)
33 ; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
34 ; CHECK-O0-NEXT:    popq %rax
35 ; CHECK-O0-NEXT:    retq
37 ; CHECK-i386-LABEL: foo:
38 ; CHECK-i386:       ## %bb.0: ## %entry
39 ; CHECK-i386-NEXT:    pushl %esi
40 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8
41 ; CHECK-i386-NEXT:    subl $8, %esp
42 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
43 ; CHECK-i386-NEXT:    .cfi_offset %esi, -8
44 ; CHECK-i386-NEXT:    movl 16(%esp), %esi
45 ; CHECK-i386-NEXT:    movl $0, 4(%esp)
46 ; CHECK-i386-NEXT:    movl $16, (%esp)
47 ; CHECK-i386-NEXT:    calll _malloc
48 ; CHECK-i386-NEXT:    movl %eax, (%esi)
49 ; CHECK-i386-NEXT:    movb $1, 8(%eax)
50 ; CHECK-i386-NEXT:    fld1
51 ; CHECK-i386-NEXT:    addl $8, %esp
52 ; CHECK-i386-NEXT:    popl %esi
53 ; CHECK-i386-NEXT:    retl
55 entry:
56   %call = call ptr @malloc(i64 16)
57   store ptr %call, ptr %error_ptr_ref
58   %tmp = getelementptr inbounds i8, ptr %call, i64 8
59   store i8 1, ptr %tmp
60   ret float 1.0
63 ; "caller" calls "foo" that takes a swifterror parameter.
64 define float @caller(ptr %error_ref) {
65 ; CHECK-APPLE-LABEL: caller:
66 ; CHECK-APPLE:       ## %bb.0: ## %entry
67 ; CHECK-APPLE-NEXT:    pushq %r12
68 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
69 ; CHECK-APPLE-NEXT:    pushq %rbx
70 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 24
71 ; CHECK-APPLE-NEXT:    pushq %rax
72 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 32
73 ; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -24
74 ; CHECK-APPLE-NEXT:    .cfi_offset %r12, -16
75 ; CHECK-APPLE-NEXT:    movq %rdi, %rbx
76 ; CHECK-APPLE-NEXT:    xorl %r12d, %r12d
77 ; CHECK-APPLE-NEXT:    callq _foo
78 ; CHECK-APPLE-NEXT:    movq %r12, %rdi
79 ; CHECK-APPLE-NEXT:    testq %r12, %r12
80 ; CHECK-APPLE-NEXT:    jne LBB1_2
81 ; CHECK-APPLE-NEXT:  ## %bb.1: ## %cont
82 ; CHECK-APPLE-NEXT:    movzbl 8(%rdi), %eax
83 ; CHECK-APPLE-NEXT:    movb %al, (%rbx)
84 ; CHECK-APPLE-NEXT:  LBB1_2: ## %handler
85 ; CHECK-APPLE-NEXT:    callq _free
86 ; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
87 ; CHECK-APPLE-NEXT:    addq $8, %rsp
88 ; CHECK-APPLE-NEXT:    popq %rbx
89 ; CHECK-APPLE-NEXT:    popq %r12
90 ; CHECK-APPLE-NEXT:    retq
92 ; CHECK-O0-LABEL: caller:
93 ; CHECK-O0:       ## %bb.0: ## %entry
94 ; CHECK-O0-NEXT:    pushq %r12
95 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
96 ; CHECK-O0-NEXT:    subq $32, %rsp
97 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 48
98 ; CHECK-O0-NEXT:    .cfi_offset %r12, -16
99 ; CHECK-O0-NEXT:    ## implicit-def: $rax
100 ; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
101 ; CHECK-O0-NEXT:    xorl %eax, %eax
102 ; CHECK-O0-NEXT:    movl %eax, %r12d
103 ; CHECK-O0-NEXT:    callq _foo
104 ; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
105 ; CHECK-O0-NEXT:    cmpq $0, %r12
106 ; CHECK-O0-NEXT:    jne LBB1_2
107 ; CHECK-O0-NEXT:  ## %bb.1: ## %cont
108 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload
109 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
110 ; CHECK-O0-NEXT:    movb 8(%rcx), %cl
111 ; CHECK-O0-NEXT:    movb %cl, (%rax)
112 ; CHECK-O0-NEXT:  LBB1_2: ## %handler
113 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload
114 ; CHECK-O0-NEXT:    callq _free
115 ; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
116 ; CHECK-O0-NEXT:    addq $32, %rsp
117 ; CHECK-O0-NEXT:    popq %r12
118 ; CHECK-O0-NEXT:    retq
120 ; CHECK-i386-LABEL: caller:
121 ; CHECK-i386:       ## %bb.0: ## %entry
122 ; CHECK-i386-NEXT:    subl $12, %esp
123 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
124 ; CHECK-i386-NEXT:    movl $0, 8(%esp)
125 ; CHECK-i386-NEXT:    leal 8(%esp), %eax
126 ; CHECK-i386-NEXT:    movl %eax, (%esp)
127 ; CHECK-i386-NEXT:    calll _foo
128 ; CHECK-i386-NEXT:    fstp %st(0)
129 ; CHECK-i386-NEXT:    movl 8(%esp), %eax
130 ; CHECK-i386-NEXT:    testl %eax, %eax
131 ; CHECK-i386-NEXT:    jne LBB1_2
132 ; CHECK-i386-NEXT:  ## %bb.1: ## %cont
133 ; CHECK-i386-NEXT:    movl 16(%esp), %ecx
134 ; CHECK-i386-NEXT:    movzbl 8(%eax), %edx
135 ; CHECK-i386-NEXT:    movb %dl, (%ecx)
136 ; CHECK-i386-NEXT:  LBB1_2: ## %handler
137 ; CHECK-i386-NEXT:    movl %eax, (%esp)
138 ; CHECK-i386-NEXT:    calll _free
139 ; CHECK-i386-NEXT:    fld1
140 ; CHECK-i386-NEXT:    addl $12, %esp
141 ; CHECK-i386-NEXT:    retl
142 ; Access part of the error object and save it to error_ref
144 entry:
145   %error_ptr_ref = alloca swifterror ptr
146   store ptr null, ptr %error_ptr_ref
147   %call = call float @foo(ptr swifterror %error_ptr_ref)
148   %error_from_foo = load ptr, ptr %error_ptr_ref
149   %had_error_from_foo = icmp ne ptr %error_from_foo, null
150   br i1 %had_error_from_foo, label %handler, label %cont
151 cont:
152   %v1 = getelementptr inbounds %swift_error, ptr %error_from_foo, i64 0, i32 1
153   %t = load i8, ptr %v1
154   store i8 %t, ptr %error_ref
155   br label %handler
156 handler:
157   call void @free(ptr %error_from_foo)
158   ret float 1.0
161 ; "caller2" is the caller of "foo", it calls "foo" inside a loop.
162 define float @caller2(ptr %error_ref) {
163 ; CHECK-APPLE-LABEL: caller2:
164 ; CHECK-APPLE:       ## %bb.0: ## %entry
165 ; CHECK-APPLE-NEXT:    pushq %r12
166 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
167 ; CHECK-APPLE-NEXT:    pushq %rbx
168 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 24
169 ; CHECK-APPLE-NEXT:    pushq %rax
170 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 32
171 ; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -24
172 ; CHECK-APPLE-NEXT:    .cfi_offset %r12, -16
173 ; CHECK-APPLE-NEXT:    movq %rdi, %rbx
174 ; CHECK-APPLE-NEXT:  LBB2_1: ## %bb_loop
175 ; CHECK-APPLE-NEXT:    ## =>This Inner Loop Header: Depth=1
176 ; CHECK-APPLE-NEXT:    xorl %r12d, %r12d
177 ; CHECK-APPLE-NEXT:    callq _foo
178 ; CHECK-APPLE-NEXT:    testq %r12, %r12
179 ; CHECK-APPLE-NEXT:    jne LBB2_4
180 ; CHECK-APPLE-NEXT:  ## %bb.2: ## %cont
181 ; CHECK-APPLE-NEXT:    ## in Loop: Header=BB2_1 Depth=1
182 ; CHECK-APPLE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
183 ; CHECK-APPLE-NEXT:    jbe LBB2_1
184 ; CHECK-APPLE-NEXT:  ## %bb.3: ## %bb_end
185 ; CHECK-APPLE-NEXT:    movzbl 8(%r12), %eax
186 ; CHECK-APPLE-NEXT:    movb %al, (%rbx)
187 ; CHECK-APPLE-NEXT:  LBB2_4: ## %handler
188 ; CHECK-APPLE-NEXT:    movq %r12, %rdi
189 ; CHECK-APPLE-NEXT:    callq _free
190 ; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
191 ; CHECK-APPLE-NEXT:    addq $8, %rsp
192 ; CHECK-APPLE-NEXT:    popq %rbx
193 ; CHECK-APPLE-NEXT:    popq %r12
194 ; CHECK-APPLE-NEXT:    retq
196 ; CHECK-O0-LABEL: caller2:
197 ; CHECK-O0:       ## %bb.0: ## %entry
198 ; CHECK-O0-NEXT:    pushq %r12
199 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
200 ; CHECK-O0-NEXT:    subq $32, %rsp
201 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 48
202 ; CHECK-O0-NEXT:    .cfi_offset %r12, -16
203 ; CHECK-O0-NEXT:    ## implicit-def: $rax
204 ; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
205 ; CHECK-O0-NEXT:  LBB2_1: ## %bb_loop
206 ; CHECK-O0-NEXT:    ## =>This Inner Loop Header: Depth=1
207 ; CHECK-O0-NEXT:    xorl %eax, %eax
208 ; CHECK-O0-NEXT:    movl %eax, %r12d
209 ; CHECK-O0-NEXT:    callq _foo
210 ; CHECK-O0-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill
211 ; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
212 ; CHECK-O0-NEXT:    cmpq $0, %r12
213 ; CHECK-O0-NEXT:    jne LBB2_4
214 ; CHECK-O0-NEXT:  ## %bb.2: ## %cont
215 ; CHECK-O0-NEXT:    ## in Loop: Header=BB2_1 Depth=1
216 ; CHECK-O0-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Reload
217 ; CHECK-O0-NEXT:    ## xmm0 = mem[0],zero,zero,zero
218 ; CHECK-O0-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
219 ; CHECK-O0-NEXT:    ucomiss %xmm1, %xmm0
220 ; CHECK-O0-NEXT:    jbe LBB2_1
221 ; CHECK-O0-NEXT:  ## %bb.3: ## %bb_end
222 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload
223 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
224 ; CHECK-O0-NEXT:    movb 8(%rcx), %cl
225 ; CHECK-O0-NEXT:    movb %cl, (%rax)
226 ; CHECK-O0-NEXT:  LBB2_4: ## %handler
227 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload
228 ; CHECK-O0-NEXT:    callq _free
229 ; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
230 ; CHECK-O0-NEXT:    addq $32, %rsp
231 ; CHECK-O0-NEXT:    popq %r12
232 ; CHECK-O0-NEXT:    retq
234 ; CHECK-i386-LABEL: caller2:
235 ; CHECK-i386:       ## %bb.0: ## %entry
236 ; CHECK-i386-NEXT:    pushl %edi
237 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8
238 ; CHECK-i386-NEXT:    pushl %esi
239 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 12
240 ; CHECK-i386-NEXT:    subl $20, %esp
241 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 32
242 ; CHECK-i386-NEXT:    .cfi_offset %esi, -12
243 ; CHECK-i386-NEXT:    .cfi_offset %edi, -8
244 ; CHECK-i386-NEXT:    movl 32(%esp), %esi
245 ; CHECK-i386-NEXT:    leal 16(%esp), %edi
246 ; CHECK-i386-NEXT:    fld1
247 ; CHECK-i386-NEXT:    fstps {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Spill
248 ; CHECK-i386-NEXT:  LBB2_1: ## %bb_loop
249 ; CHECK-i386-NEXT:    ## =>This Inner Loop Header: Depth=1
250 ; CHECK-i386-NEXT:    movl $0, 16(%esp)
251 ; CHECK-i386-NEXT:    movl %edi, (%esp)
252 ; CHECK-i386-NEXT:    calll _foo
253 ; CHECK-i386-NEXT:    movl 16(%esp), %ecx
254 ; CHECK-i386-NEXT:    testl %ecx, %ecx
255 ; CHECK-i386-NEXT:    jne LBB2_4
256 ; CHECK-i386-NEXT:  ## %bb.2: ## %cont
257 ; CHECK-i386-NEXT:    ## in Loop: Header=BB2_1 Depth=1
258 ; CHECK-i386-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Reload
259 ; CHECK-i386-NEXT:    fxch %st(1)
260 ; CHECK-i386-NEXT:    fucompp
261 ; CHECK-i386-NEXT:    fnstsw %ax
262 ; CHECK-i386-NEXT:    ## kill: def $ah killed $ah killed $ax
263 ; CHECK-i386-NEXT:    sahf
264 ; CHECK-i386-NEXT:    jbe LBB2_1
265 ; CHECK-i386-NEXT:  ## %bb.3: ## %bb_end
266 ; CHECK-i386-NEXT:    movzbl 8(%ecx), %eax
267 ; CHECK-i386-NEXT:    movb %al, (%esi)
268 ; CHECK-i386-NEXT:    fldz
269 ; CHECK-i386-NEXT:  LBB2_4: ## %handler
270 ; CHECK-i386-NEXT:    fstp %st(0)
271 ; CHECK-i386-NEXT:    movl %ecx, (%esp)
272 ; CHECK-i386-NEXT:    calll _free
273 ; CHECK-i386-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Reload
274 ; CHECK-i386-NEXT:    addl $20, %esp
275 ; CHECK-i386-NEXT:    popl %esi
276 ; CHECK-i386-NEXT:    popl %edi
277 ; CHECK-i386-NEXT:    retl
278 ; Access part of the error object and save it to error_ref
280 entry:
281   %error_ptr_ref = alloca swifterror ptr
282   br label %bb_loop
283 bb_loop:
284   store ptr null, ptr %error_ptr_ref
285   %call = call float @foo(ptr swifterror %error_ptr_ref)
286   %error_from_foo = load ptr, ptr %error_ptr_ref
287   %had_error_from_foo = icmp ne ptr %error_from_foo, null
288   br i1 %had_error_from_foo, label %handler, label %cont
289 cont:
290   %cmp = fcmp ogt float %call, 1.000000e+00
291   br i1 %cmp, label %bb_end, label %bb_loop
292 bb_end:
293   %v1 = getelementptr inbounds %swift_error, ptr %error_from_foo, i64 0, i32 1
294   %t = load i8, ptr %v1
295   store i8 %t, ptr %error_ref
296   br label %handler
297 handler:
298   call void @free(ptr %error_from_foo)
299   ret float 1.0
302 ; "foo_if" is a function that takes a swifterror parameter, it sets swifterror
303 ; under a certain condition.
304 define float @foo_if(ptr swifterror %error_ptr_ref, i32 %cc) {
305 ; CHECK-APPLE-LABEL: foo_if:
306 ; CHECK-APPLE:       ## %bb.0: ## %entry
307 ; CHECK-APPLE-NEXT:    testl %edi, %edi
308 ; CHECK-APPLE-NEXT:    je LBB3_2
309 ; CHECK-APPLE-NEXT:  ## %bb.1: ## %gen_error
310 ; CHECK-APPLE-NEXT:    pushq %rax
311 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
312 ; CHECK-APPLE-NEXT:    movl $16, %edi
313 ; CHECK-APPLE-NEXT:    callq _malloc
314 ; CHECK-APPLE-NEXT:    movb $1, 8(%rax)
315 ; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
316 ; CHECK-APPLE-NEXT:    movq %rax, %r12
317 ; CHECK-APPLE-NEXT:    popq %rax
318 ; CHECK-APPLE-NEXT:    retq
319 ; CHECK-APPLE-NEXT:  LBB3_2: ## %normal
320 ; CHECK-APPLE-NEXT:    xorps %xmm0, %xmm0
321 ; CHECK-APPLE-NEXT:    retq
323 ; CHECK-O0-LABEL: foo_if:
324 ; CHECK-O0:       ## %bb.0: ## %entry
325 ; CHECK-O0-NEXT:    pushq %rax
326 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
327 ; CHECK-O0-NEXT:    movq %r12, (%rsp) ## 8-byte Spill
328 ; CHECK-O0-NEXT:    cmpl $0, %edi
329 ; CHECK-O0-NEXT:    je LBB3_2
330 ; CHECK-O0-NEXT:  ## %bb.1: ## %gen_error
331 ; CHECK-O0-NEXT:    movl $16, %edi
332 ; CHECK-O0-NEXT:    callq _malloc
333 ; CHECK-O0-NEXT:    movq %rax, %r12
334 ; CHECK-O0-NEXT:    movb $1, 8(%rax)
335 ; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
336 ; CHECK-O0-NEXT:    popq %rax
337 ; CHECK-O0-NEXT:    retq
338 ; CHECK-O0-NEXT:  LBB3_2: ## %normal
339 ; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload
340 ; CHECK-O0-NEXT:    xorps %xmm0, %xmm0
341 ; CHECK-O0-NEXT:    popq %rax
342 ; CHECK-O0-NEXT:    retq
344 ; CHECK-i386-LABEL: foo_if:
345 ; CHECK-i386:       ## %bb.0: ## %entry
346 ; CHECK-i386-NEXT:    pushl %esi
347 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8
348 ; CHECK-i386-NEXT:    subl $8, %esp
349 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
350 ; CHECK-i386-NEXT:    .cfi_offset %esi, -8
351 ; CHECK-i386-NEXT:    cmpl $0, 20(%esp)
352 ; CHECK-i386-NEXT:    je LBB3_2
353 ; CHECK-i386-NEXT:  ## %bb.1: ## %gen_error
354 ; CHECK-i386-NEXT:    movl 16(%esp), %esi
355 ; CHECK-i386-NEXT:    movl $0, 4(%esp)
356 ; CHECK-i386-NEXT:    movl $16, (%esp)
357 ; CHECK-i386-NEXT:    calll _malloc
358 ; CHECK-i386-NEXT:    movl %eax, (%esi)
359 ; CHECK-i386-NEXT:    movb $1, 8(%eax)
360 ; CHECK-i386-NEXT:    fld1
361 ; CHECK-i386-NEXT:    jmp LBB3_3
362 ; CHECK-i386-NEXT:  LBB3_2: ## %normal
363 ; CHECK-i386-NEXT:    fldz
364 ; CHECK-i386-NEXT:  LBB3_3: ## %normal
365 ; CHECK-i386-NEXT:    addl $8, %esp
366 ; CHECK-i386-NEXT:    popl %esi
367 ; CHECK-i386-NEXT:    retl
369 ; spill to stack
370 ; reload from stack
371 entry:
372   %cond = icmp ne i32 %cc, 0
373   br i1 %cond, label %gen_error, label %normal
375 gen_error:
376   %call = call ptr @malloc(i64 16)
377   store ptr %call, ptr %error_ptr_ref
378   %tmp = getelementptr inbounds i8, ptr %call, i64 8
379   store i8 1, ptr %tmp
380   ret float 1.0
382 normal:
383   ret float 0.0
386 ; "foo_loop" is a function that takes a swifterror parameter, it sets swifterror
387 ; under a certain condition inside a loop.
388 define float @foo_loop(ptr swifterror %error_ptr_ref, i32 %cc, float %cc2) {
389 ; CHECK-APPLE-LABEL: foo_loop:
390 ; CHECK-APPLE:       ## %bb.0: ## %entry
391 ; CHECK-APPLE-NEXT:    pushq %rbx
392 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
393 ; CHECK-APPLE-NEXT:    subq $16, %rsp
394 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 32
395 ; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -16
396 ; CHECK-APPLE-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill
397 ; CHECK-APPLE-NEXT:    movl %edi, %ebx
398 ; CHECK-APPLE-NEXT:    movq %r12, %rax
399 ; CHECK-APPLE-NEXT:  LBB4_1: ## %bb_loop
400 ; CHECK-APPLE-NEXT:    ## =>This Inner Loop Header: Depth=1
401 ; CHECK-APPLE-NEXT:    testl %ebx, %ebx
402 ; CHECK-APPLE-NEXT:    je LBB4_3
403 ; CHECK-APPLE-NEXT:  ## %bb.2: ## %gen_error
404 ; CHECK-APPLE-NEXT:    ## in Loop: Header=BB4_1 Depth=1
405 ; CHECK-APPLE-NEXT:    movl $16, %edi
406 ; CHECK-APPLE-NEXT:    callq _malloc
407 ; CHECK-APPLE-NEXT:    movb $1, 8(%rax)
408 ; CHECK-APPLE-NEXT:  LBB4_3: ## %bb_cont
409 ; CHECK-APPLE-NEXT:    ## in Loop: Header=BB4_1 Depth=1
410 ; CHECK-APPLE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Reload
411 ; CHECK-APPLE-NEXT:    ## xmm0 = mem[0],zero,zero,zero
412 ; CHECK-APPLE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
413 ; CHECK-APPLE-NEXT:    jbe LBB4_1
414 ; CHECK-APPLE-NEXT:  ## %bb.4: ## %bb_end
415 ; CHECK-APPLE-NEXT:    xorps %xmm0, %xmm0
416 ; CHECK-APPLE-NEXT:    movq %rax, %r12
417 ; CHECK-APPLE-NEXT:    addq $16, %rsp
418 ; CHECK-APPLE-NEXT:    popq %rbx
419 ; CHECK-APPLE-NEXT:    retq
421 ; CHECK-O0-LABEL: foo_loop:
422 ; CHECK-O0:       ## %bb.0: ## %entry
423 ; CHECK-O0-NEXT:    subq $40, %rsp
424 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 48
425 ; CHECK-O0-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill
426 ; CHECK-O0-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill
427 ; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
428 ; CHECK-O0-NEXT:    jmp LBB4_1
429 ; CHECK-O0-NEXT:  LBB4_1: ## %bb_loop
430 ; CHECK-O0-NEXT:    ## =>This Inner Loop Header: Depth=1
431 ; CHECK-O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx ## 4-byte Reload
432 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload
433 ; CHECK-O0-NEXT:    cmpl $0, %ecx
434 ; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
435 ; CHECK-O0-NEXT:    je LBB4_3
436 ; CHECK-O0-NEXT:  ## %bb.2: ## %gen_error
437 ; CHECK-O0-NEXT:    ## in Loop: Header=BB4_1 Depth=1
438 ; CHECK-O0-NEXT:    movl $16, %edi
439 ; CHECK-O0-NEXT:    callq _malloc
440 ; CHECK-O0-NEXT:    movq %rax, %rcx
441 ; CHECK-O0-NEXT:    movb $1, 8(%rcx)
442 ; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
443 ; CHECK-O0-NEXT:  LBB4_3: ## %bb_cont
444 ; CHECK-O0-NEXT:    ## in Loop: Header=BB4_1 Depth=1
445 ; CHECK-O0-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Reload
446 ; CHECK-O0-NEXT:    ## xmm0 = mem[0],zero,zero,zero
447 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload
448 ; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
449 ; CHECK-O0-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
450 ; CHECK-O0-NEXT:    ucomiss %xmm1, %xmm0
451 ; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
452 ; CHECK-O0-NEXT:    jbe LBB4_1
453 ; CHECK-O0-NEXT:  ## %bb.4: ## %bb_end
454 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload
455 ; CHECK-O0-NEXT:    xorps %xmm0, %xmm0
456 ; CHECK-O0-NEXT:    addq $40, %rsp
457 ; CHECK-O0-NEXT:    retq
459 ; CHECK-i386-LABEL: foo_loop:
460 ; CHECK-i386:       ## %bb.0: ## %entry
461 ; CHECK-i386-NEXT:    pushl %edi
462 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8
463 ; CHECK-i386-NEXT:    pushl %esi
464 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 12
465 ; CHECK-i386-NEXT:    subl $20, %esp
466 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 32
467 ; CHECK-i386-NEXT:    .cfi_offset %esi, -12
468 ; CHECK-i386-NEXT:    .cfi_offset %edi, -8
469 ; CHECK-i386-NEXT:    flds 40(%esp)
470 ; CHECK-i386-NEXT:    fstps {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Spill
471 ; CHECK-i386-NEXT:    movl 36(%esp), %esi
472 ; CHECK-i386-NEXT:    movl 32(%esp), %edi
473 ; CHECK-i386-NEXT:    fld1
474 ; CHECK-i386-NEXT:    fstps {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Spill
475 ; CHECK-i386-NEXT:  LBB4_1: ## %bb_loop
476 ; CHECK-i386-NEXT:    ## =>This Inner Loop Header: Depth=1
477 ; CHECK-i386-NEXT:    testl %esi, %esi
478 ; CHECK-i386-NEXT:    je LBB4_3
479 ; CHECK-i386-NEXT:  ## %bb.2: ## %gen_error
480 ; CHECK-i386-NEXT:    ## in Loop: Header=BB4_1 Depth=1
481 ; CHECK-i386-NEXT:    movl $0, 4(%esp)
482 ; CHECK-i386-NEXT:    movl $16, (%esp)
483 ; CHECK-i386-NEXT:    calll _malloc
484 ; CHECK-i386-NEXT:    movl %eax, (%edi)
485 ; CHECK-i386-NEXT:    movb $1, 8(%eax)
486 ; CHECK-i386-NEXT:  LBB4_3: ## %bb_cont
487 ; CHECK-i386-NEXT:    ## in Loop: Header=BB4_1 Depth=1
488 ; CHECK-i386-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Reload
489 ; CHECK-i386-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Reload
490 ; CHECK-i386-NEXT:    fxch %st(1)
491 ; CHECK-i386-NEXT:    fucompp
492 ; CHECK-i386-NEXT:    fnstsw %ax
493 ; CHECK-i386-NEXT:    ## kill: def $ah killed $ah killed $ax
494 ; CHECK-i386-NEXT:    sahf
495 ; CHECK-i386-NEXT:    jbe LBB4_1
496 ; CHECK-i386-NEXT:  ## %bb.4: ## %bb_end
497 ; CHECK-i386-NEXT:    fldz
498 ; CHECK-i386-NEXT:    addl $20, %esp
499 ; CHECK-i386-NEXT:    popl %esi
500 ; CHECK-i386-NEXT:    popl %edi
501 ; CHECK-i386-NEXT:    retl
503 ; spill to stack
504 ; reload from stack
505 entry:
506   br label %bb_loop
508 bb_loop:
509   %cond = icmp ne i32 %cc, 0
510   br i1 %cond, label %gen_error, label %bb_cont
512 gen_error:
513   %call = call ptr @malloc(i64 16)
514   store ptr %call, ptr %error_ptr_ref
515   %tmp = getelementptr inbounds i8, ptr %call, i64 8
516   store i8 1, ptr %tmp
517   br label %bb_cont
519 bb_cont:
520   %cmp = fcmp ogt float %cc2, 1.000000e+00
521   br i1 %cmp, label %bb_end, label %bb_loop
522 bb_end:
523   ret float 0.0
526 %struct.S = type { i32, i32, i32, i32, i32, i32 }
528 ; "foo_sret" is a function that takes a swifterror parameter, it also has a sret
529 ; parameter.
530 define void @foo_sret(ptr sret(%struct.S) %agg.result, i32 %val1, ptr swifterror %error_ptr_ref) {
531 ; CHECK-APPLE-LABEL: foo_sret:
532 ; CHECK-APPLE:       ## %bb.0: ## %entry
533 ; CHECK-APPLE-NEXT:    pushq %rbp
534 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
535 ; CHECK-APPLE-NEXT:    pushq %rbx
536 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 24
537 ; CHECK-APPLE-NEXT:    pushq %rax
538 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 32
539 ; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -24
540 ; CHECK-APPLE-NEXT:    .cfi_offset %rbp, -16
541 ; CHECK-APPLE-NEXT:    movl %esi, %ebp
542 ; CHECK-APPLE-NEXT:    movq %rdi, %rbx
543 ; CHECK-APPLE-NEXT:    movl $16, %edi
544 ; CHECK-APPLE-NEXT:    callq _malloc
545 ; CHECK-APPLE-NEXT:    movb $1, 8(%rax)
546 ; CHECK-APPLE-NEXT:    movl %ebp, 4(%rbx)
547 ; CHECK-APPLE-NEXT:    movq %rax, %r12
548 ; CHECK-APPLE-NEXT:    movq %rbx, %rax
549 ; CHECK-APPLE-NEXT:    addq $8, %rsp
550 ; CHECK-APPLE-NEXT:    popq %rbx
551 ; CHECK-APPLE-NEXT:    popq %rbp
552 ; CHECK-APPLE-NEXT:    retq
554 ; CHECK-O0-LABEL: foo_sret:
555 ; CHECK-O0:       ## %bb.0: ## %entry
556 ; CHECK-O0-NEXT:    subq $24, %rsp
557 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 32
558 ; CHECK-O0-NEXT:    movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill
559 ; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
560 ; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
561 ; CHECK-O0-NEXT:    movl $16, %edi
562 ; CHECK-O0-NEXT:    callq _malloc
563 ; CHECK-O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %esi ## 4-byte Reload
564 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload
565 ; CHECK-O0-NEXT:    movq %rax, %rcx
566 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload
567 ; CHECK-O0-NEXT:    movq %rcx, %r12
568 ; CHECK-O0-NEXT:    movb $1, 8(%rcx)
569 ; CHECK-O0-NEXT:    movl %esi, 4(%rdi)
570 ; CHECK-O0-NEXT:    addq $24, %rsp
571 ; CHECK-O0-NEXT:    retq
573 ; CHECK-i386-LABEL: foo_sret:
574 ; CHECK-i386:       ## %bb.0: ## %entry
575 ; CHECK-i386-NEXT:    pushl %ebx
576 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8
577 ; CHECK-i386-NEXT:    pushl %edi
578 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 12
579 ; CHECK-i386-NEXT:    pushl %esi
580 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
581 ; CHECK-i386-NEXT:    subl $16, %esp
582 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 32
583 ; CHECK-i386-NEXT:    .cfi_offset %esi, -16
584 ; CHECK-i386-NEXT:    .cfi_offset %edi, -12
585 ; CHECK-i386-NEXT:    .cfi_offset %ebx, -8
586 ; CHECK-i386-NEXT:    movl 32(%esp), %esi
587 ; CHECK-i386-NEXT:    movl 36(%esp), %edi
588 ; CHECK-i386-NEXT:    movl 40(%esp), %ebx
589 ; CHECK-i386-NEXT:    movl $0, 4(%esp)
590 ; CHECK-i386-NEXT:    movl $16, (%esp)
591 ; CHECK-i386-NEXT:    calll _malloc
592 ; CHECK-i386-NEXT:    movl %eax, (%ebx)
593 ; CHECK-i386-NEXT:    movb $1, 8(%eax)
594 ; CHECK-i386-NEXT:    movl %edi, 4(%esi)
595 ; CHECK-i386-NEXT:    movl %esi, %eax
596 ; CHECK-i386-NEXT:    addl $16, %esp
597 ; CHECK-i386-NEXT:    popl %esi
598 ; CHECK-i386-NEXT:    popl %edi
599 ; CHECK-i386-NEXT:    popl %ebx
600 ; CHECK-i386-NEXT:    retl $4
602 ; spill sret to stack
603 ; reload sret from stack
604 entry:
605   %call = call ptr @malloc(i64 16)
606   store ptr %call, ptr %error_ptr_ref
607   %tmp = getelementptr inbounds i8, ptr %call, i64 8
608   store i8 1, ptr %tmp
609   %v2 = getelementptr inbounds %struct.S, ptr %agg.result, i32 0, i32 1
610   store i32 %val1, ptr %v2
611   ret void
614 ; "caller3" calls "foo_sret" that takes a swifterror parameter.
615 define float @caller3(ptr %error_ref) {
616 ; CHECK-APPLE-LABEL: caller3:
617 ; CHECK-APPLE:       ## %bb.0: ## %entry
618 ; CHECK-APPLE-NEXT:    pushq %r12
619 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
620 ; CHECK-APPLE-NEXT:    pushq %rbx
621 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 24
622 ; CHECK-APPLE-NEXT:    subq $40, %rsp
623 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 64
624 ; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -24
625 ; CHECK-APPLE-NEXT:    .cfi_offset %r12, -16
626 ; CHECK-APPLE-NEXT:    movq %rdi, %rbx
627 ; CHECK-APPLE-NEXT:    leaq 8(%rsp), %rdi
628 ; CHECK-APPLE-NEXT:    movl $1, %esi
629 ; CHECK-APPLE-NEXT:    xorl %r12d, %r12d
630 ; CHECK-APPLE-NEXT:    callq _foo_sret
631 ; CHECK-APPLE-NEXT:    movq %r12, %rdi
632 ; CHECK-APPLE-NEXT:    testq %r12, %r12
633 ; CHECK-APPLE-NEXT:    jne LBB6_2
634 ; CHECK-APPLE-NEXT:  ## %bb.1: ## %cont
635 ; CHECK-APPLE-NEXT:    movzbl 8(%rdi), %eax
636 ; CHECK-APPLE-NEXT:    movb %al, (%rbx)
637 ; CHECK-APPLE-NEXT:  LBB6_2: ## %handler
638 ; CHECK-APPLE-NEXT:    callq _free
639 ; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
640 ; CHECK-APPLE-NEXT:    addq $40, %rsp
641 ; CHECK-APPLE-NEXT:    popq %rbx
642 ; CHECK-APPLE-NEXT:    popq %r12
643 ; CHECK-APPLE-NEXT:    retq
645 ; CHECK-O0-LABEL: caller3:
646 ; CHECK-O0:       ## %bb.0: ## %entry
647 ; CHECK-O0-NEXT:    pushq %r12
648 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
649 ; CHECK-O0-NEXT:    subq $48, %rsp
650 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 64
651 ; CHECK-O0-NEXT:    .cfi_offset %r12, -16
652 ; CHECK-O0-NEXT:    ## implicit-def: $rax
653 ; CHECK-O0-NEXT:    movq %rdi, (%rsp) ## 8-byte Spill
654 ; CHECK-O0-NEXT:    xorl %eax, %eax
655 ; CHECK-O0-NEXT:    movl %eax, %r12d
656 ; CHECK-O0-NEXT:    leaq 24(%rsp), %rdi
657 ; CHECK-O0-NEXT:    movl $1, %esi
658 ; CHECK-O0-NEXT:    callq _foo_sret
659 ; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
660 ; CHECK-O0-NEXT:    cmpq $0, %r12
661 ; CHECK-O0-NEXT:    jne LBB6_2
662 ; CHECK-O0-NEXT:  ## %bb.1: ## %cont
663 ; CHECK-O0-NEXT:    movq (%rsp), %rax ## 8-byte Reload
664 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
665 ; CHECK-O0-NEXT:    movb 8(%rcx), %cl
666 ; CHECK-O0-NEXT:    movb %cl, (%rax)
667 ; CHECK-O0-NEXT:  LBB6_2: ## %handler
668 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload
669 ; CHECK-O0-NEXT:    callq _free
670 ; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
671 ; CHECK-O0-NEXT:    addq $48, %rsp
672 ; CHECK-O0-NEXT:    popq %r12
673 ; CHECK-O0-NEXT:    retq
675 ; CHECK-i386-LABEL: caller3:
676 ; CHECK-i386:       ## %bb.0: ## %entry
677 ; CHECK-i386-NEXT:    subl $44, %esp
678 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 48
679 ; CHECK-i386-NEXT:    movl $0, 12(%esp)
680 ; CHECK-i386-NEXT:    leal 12(%esp), %eax
681 ; CHECK-i386-NEXT:    movl %eax, 8(%esp)
682 ; CHECK-i386-NEXT:    leal 16(%esp), %eax
683 ; CHECK-i386-NEXT:    movl %eax, (%esp)
684 ; CHECK-i386-NEXT:    movl $1, 4(%esp)
685 ; CHECK-i386-NEXT:    calll _foo_sret
686 ; CHECK-i386-NEXT:    subl $4, %esp
687 ; CHECK-i386-NEXT:    movl 12(%esp), %eax
688 ; CHECK-i386-NEXT:    testl %eax, %eax
689 ; CHECK-i386-NEXT:    jne LBB6_2
690 ; CHECK-i386-NEXT:  ## %bb.1: ## %cont
691 ; CHECK-i386-NEXT:    movl 48(%esp), %ecx
692 ; CHECK-i386-NEXT:    movzbl 8(%eax), %edx
693 ; CHECK-i386-NEXT:    movb %dl, (%ecx)
694 ; CHECK-i386-NEXT:  LBB6_2: ## %handler
695 ; CHECK-i386-NEXT:    movl %eax, (%esp)
696 ; CHECK-i386-NEXT:    calll _free
697 ; CHECK-i386-NEXT:    fld1
698 ; CHECK-i386-NEXT:    addl $44, %esp
699 ; CHECK-i386-NEXT:    retl
700 ; Access part of the error object and save it to error_ref
702 ; Access part of the error object and save it to error_ref
703 ; reload from stack
704 entry:
705   %s = alloca %struct.S, align 8
706   %error_ptr_ref = alloca swifterror ptr
707   store ptr null, ptr %error_ptr_ref
708   call void @foo_sret(ptr sret(%struct.S) %s, i32 1, ptr swifterror %error_ptr_ref)
709   %error_from_foo = load ptr, ptr %error_ptr_ref
710   %had_error_from_foo = icmp ne ptr %error_from_foo, null
711   br i1 %had_error_from_foo, label %handler, label %cont
712 cont:
713   %v1 = getelementptr inbounds %swift_error, ptr %error_from_foo, i64 0, i32 1
714   %t = load i8, ptr %v1
715   store i8 %t, ptr %error_ref
716   br label %handler
717 handler:
718   call void @free(ptr %error_from_foo)
719   ret float 1.0
722 ; This is a caller with multiple swifterror values, it calls "foo" twice, each
723 ; time with a different swifterror value, from "alloca swifterror".
724 define float @caller_with_multiple_swifterror_values(ptr %error_ref, ptr %error_ref2) {
725 ; CHECK-APPLE-LABEL: caller_with_multiple_swifterror_values:
726 ; CHECK-APPLE:       ## %bb.0: ## %entry
727 ; CHECK-APPLE-NEXT:    pushq %rbp
728 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
729 ; CHECK-APPLE-NEXT:    .cfi_offset %rbp, -16
730 ; CHECK-APPLE-NEXT:    movq %rsp, %rbp
731 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_register %rbp
732 ; CHECK-APPLE-NEXT:    pushq %r14
733 ; CHECK-APPLE-NEXT:    pushq %r12
734 ; CHECK-APPLE-NEXT:    pushq %rbx
735 ; CHECK-APPLE-NEXT:    pushq %rax
736 ; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -40
737 ; CHECK-APPLE-NEXT:    .cfi_offset %r12, -32
738 ; CHECK-APPLE-NEXT:    .cfi_offset %r14, -24
739 ; CHECK-APPLE-NEXT:    movq %rsi, %r14
740 ; CHECK-APPLE-NEXT:    movq %rdi, %rbx
741 ; CHECK-APPLE-NEXT:    xorl %r12d, %r12d
742 ; CHECK-APPLE-NEXT:    callq _foo
743 ; CHECK-APPLE-NEXT:    movq %r12, %rdi
744 ; CHECK-APPLE-NEXT:    testq %r12, %r12
745 ; CHECK-APPLE-NEXT:    jne LBB7_2
746 ; CHECK-APPLE-NEXT:  ## %bb.1: ## %cont
747 ; CHECK-APPLE-NEXT:    movzbl 8(%rdi), %eax
748 ; CHECK-APPLE-NEXT:    movb %al, (%rbx)
749 ; CHECK-APPLE-NEXT:  LBB7_2: ## %handler
750 ; CHECK-APPLE-NEXT:    callq _free
751 ; CHECK-APPLE-NEXT:    movq %rsp, %rax
752 ; CHECK-APPLE-NEXT:    addq $-16, %rax
753 ; CHECK-APPLE-NEXT:    movq %rax, %rsp
754 ; CHECK-APPLE-NEXT:    xorl %r12d, %r12d
755 ; CHECK-APPLE-NEXT:    callq _foo
756 ; CHECK-APPLE-NEXT:    movq %r12, %rdi
757 ; CHECK-APPLE-NEXT:    testq %r12, %r12
758 ; CHECK-APPLE-NEXT:    jne LBB7_4
759 ; CHECK-APPLE-NEXT:  ## %bb.3: ## %cont2
760 ; CHECK-APPLE-NEXT:    movzbl 8(%rdi), %eax
761 ; CHECK-APPLE-NEXT:    movb %al, (%r14)
762 ; CHECK-APPLE-NEXT:  LBB7_4: ## %handler2
763 ; CHECK-APPLE-NEXT:    callq _free
764 ; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
765 ; CHECK-APPLE-NEXT:    leaq -24(%rbp), %rsp
766 ; CHECK-APPLE-NEXT:    popq %rbx
767 ; CHECK-APPLE-NEXT:    popq %r12
768 ; CHECK-APPLE-NEXT:    popq %r14
769 ; CHECK-APPLE-NEXT:    popq %rbp
770 ; CHECK-APPLE-NEXT:    retq
772 ; CHECK-O0-LABEL: caller_with_multiple_swifterror_values:
773 ; CHECK-O0:       ## %bb.0: ## %entry
774 ; CHECK-O0-NEXT:    pushq %rbp
775 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
776 ; CHECK-O0-NEXT:    .cfi_offset %rbp, -16
777 ; CHECK-O0-NEXT:    movq %rsp, %rbp
778 ; CHECK-O0-NEXT:    .cfi_def_cfa_register %rbp
779 ; CHECK-O0-NEXT:    pushq %r12
780 ; CHECK-O0-NEXT:    subq $40, %rsp
781 ; CHECK-O0-NEXT:    .cfi_offset %r12, -24
782 ; CHECK-O0-NEXT:    ## implicit-def: $rax
783 ; CHECK-O0-NEXT:    ## implicit-def: $rax
784 ; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
785 ; CHECK-O0-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
786 ; CHECK-O0-NEXT:    xorl %eax, %eax
787 ; CHECK-O0-NEXT:    movl %eax, %r12d
788 ; CHECK-O0-NEXT:    callq _foo
789 ; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
790 ; CHECK-O0-NEXT:    cmpq $0, %r12
791 ; CHECK-O0-NEXT:    jne LBB7_2
792 ; CHECK-O0-NEXT:  ## %bb.1: ## %cont
793 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload
794 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
795 ; CHECK-O0-NEXT:    movb 8(%rcx), %cl
796 ; CHECK-O0-NEXT:    movb %cl, (%rax)
797 ; CHECK-O0-NEXT:  LBB7_2: ## %handler
798 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload
799 ; CHECK-O0-NEXT:    callq _free
800 ; CHECK-O0-NEXT:    movq %rsp, %rax
801 ; CHECK-O0-NEXT:    addq $-16, %rax
802 ; CHECK-O0-NEXT:    movq %rax, %rsp
803 ; CHECK-O0-NEXT:    xorl %eax, %eax
804 ; CHECK-O0-NEXT:    movl %eax, %r12d
805 ; CHECK-O0-NEXT:    callq _foo
806 ; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
807 ; CHECK-O0-NEXT:    cmpq $0, %r12
808 ; CHECK-O0-NEXT:    jne LBB7_4
809 ; CHECK-O0-NEXT:  ## %bb.3: ## %cont2
810 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload
811 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
812 ; CHECK-O0-NEXT:    movb 8(%rcx), %cl
813 ; CHECK-O0-NEXT:    movb %cl, (%rax)
814 ; CHECK-O0-NEXT:  LBB7_4: ## %handler2
815 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload
816 ; CHECK-O0-NEXT:    callq _free
817 ; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
818 ; CHECK-O0-NEXT:    leaq -8(%rbp), %rsp
819 ; CHECK-O0-NEXT:    popq %r12
820 ; CHECK-O0-NEXT:    popq %rbp
821 ; CHECK-O0-NEXT:    retq
823 ; CHECK-i386-LABEL: caller_with_multiple_swifterror_values:
824 ; CHECK-i386:       ## %bb.0: ## %entry
825 ; CHECK-i386-NEXT:    pushl %ebp
826 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8
827 ; CHECK-i386-NEXT:    .cfi_offset %ebp, -8
828 ; CHECK-i386-NEXT:    movl %esp, %ebp
829 ; CHECK-i386-NEXT:    .cfi_def_cfa_register %ebp
830 ; CHECK-i386-NEXT:    pushl %esi
831 ; CHECK-i386-NEXT:    pushl %eax
832 ; CHECK-i386-NEXT:    .cfi_offset %esi, -12
833 ; CHECK-i386-NEXT:    movl $0, -8(%ebp)
834 ; CHECK-i386-NEXT:    subl $12, %esp
835 ; CHECK-i386-NEXT:    leal -8(%ebp), %eax
836 ; CHECK-i386-NEXT:    pushl %eax
837 ; CHECK-i386-NEXT:    calll _foo
838 ; CHECK-i386-NEXT:    fstp %st(0)
839 ; CHECK-i386-NEXT:    addl $16, %esp
840 ; CHECK-i386-NEXT:    movl -8(%ebp), %eax
841 ; CHECK-i386-NEXT:    testl %eax, %eax
842 ; CHECK-i386-NEXT:    jne LBB7_2
843 ; CHECK-i386-NEXT:  ## %bb.1: ## %cont
844 ; CHECK-i386-NEXT:    movl 8(%ebp), %ecx
845 ; CHECK-i386-NEXT:    movzbl 8(%eax), %edx
846 ; CHECK-i386-NEXT:    movb %dl, (%ecx)
847 ; CHECK-i386-NEXT:  LBB7_2: ## %handler
848 ; CHECK-i386-NEXT:    subl $12, %esp
849 ; CHECK-i386-NEXT:    pushl %eax
850 ; CHECK-i386-NEXT:    calll _free
851 ; CHECK-i386-NEXT:    addl $16, %esp
852 ; CHECK-i386-NEXT:    movl %esp, %esi
853 ; CHECK-i386-NEXT:    leal -16(%esi), %eax
854 ; CHECK-i386-NEXT:    movl %eax, %esp
855 ; CHECK-i386-NEXT:    movl $0, -16(%esi)
856 ; CHECK-i386-NEXT:    subl $12, %esp
857 ; CHECK-i386-NEXT:    pushl %eax
858 ; CHECK-i386-NEXT:    calll _foo
859 ; CHECK-i386-NEXT:    fstp %st(0)
860 ; CHECK-i386-NEXT:    addl $16, %esp
861 ; CHECK-i386-NEXT:    movl -16(%esi), %eax
862 ; CHECK-i386-NEXT:    testl %eax, %eax
863 ; CHECK-i386-NEXT:    jne LBB7_4
864 ; CHECK-i386-NEXT:  ## %bb.3: ## %cont2
865 ; CHECK-i386-NEXT:    movl 12(%ebp), %ecx
866 ; CHECK-i386-NEXT:    movzbl 8(%eax), %edx
867 ; CHECK-i386-NEXT:    movb %dl, (%ecx)
868 ; CHECK-i386-NEXT:  LBB7_4: ## %handler2
869 ; CHECK-i386-NEXT:    subl $12, %esp
870 ; CHECK-i386-NEXT:    pushl %eax
871 ; CHECK-i386-NEXT:    calll _free
872 ; CHECK-i386-NEXT:    addl $16, %esp
873 ; CHECK-i386-NEXT:    fld1
874 ; CHECK-i386-NEXT:    leal -4(%ebp), %esp
875 ; CHECK-i386-NEXT:    popl %esi
876 ; CHECK-i386-NEXT:    popl %ebp
877 ; CHECK-i386-NEXT:    retl
879 ; The first swifterror value:
880 ; Access part of the error object and save it to error_ref
882 ; The second swifterror value:
883 ; Access part of the error object and save it to error_ref
886 ; The first swifterror value:
888 ; The second swifterror value:
889 entry:
890   %error_ptr_ref = alloca swifterror ptr
891   store ptr null, ptr %error_ptr_ref
892   %call = call float @foo(ptr swifterror %error_ptr_ref)
893   %error_from_foo = load ptr, ptr %error_ptr_ref
894   %had_error_from_foo = icmp ne ptr %error_from_foo, null
895   br i1 %had_error_from_foo, label %handler, label %cont
896 cont:
897   %v1 = getelementptr inbounds %swift_error, ptr %error_from_foo, i64 0, i32 1
898   %t = load i8, ptr %v1
899   store i8 %t, ptr %error_ref
900   br label %handler
901 handler:
902   call void @free(ptr %error_from_foo)
904   %error_ptr_ref2 = alloca swifterror ptr
905   store ptr null, ptr %error_ptr_ref2
906   %call2 = call float @foo(ptr swifterror %error_ptr_ref2)
907   %error_from_foo2 = load ptr, ptr %error_ptr_ref2
908   %had_error_from_foo2 = icmp ne ptr %error_from_foo2, null
909   br i1 %had_error_from_foo2, label %handler2, label %cont2
910 cont2:
911   %v2 = getelementptr inbounds %swift_error, ptr %error_from_foo2, i64 0, i32 1
912   %t2 = load i8, ptr %v2
913   store i8 %t2, ptr %error_ref2
914   br label %handler2
915 handler2:
916   call void @free(ptr %error_from_foo2)
918   ret float 1.0
921 %swift.refcounted = type opaque
923 ; This test checks that we don't create bad phi nodes as part of swifterror
924 ; isel. We used to fail machine ir verification.
925 ; CHECK-APPLE: _swifterror_isel
926 ; CHECK-O0: _swifterror_isel
927 define void @swifterror_isel(ptr) {
928 ; CHECK-APPLE-LABEL: swifterror_isel:
929 ; CHECK-APPLE:       ## %bb.0: ## %entry
930 ; CHECK-APPLE-NEXT:    pushq %r13
931 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
932 ; CHECK-APPLE-NEXT:    pushq %r12
933 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 24
934 ; CHECK-APPLE-NEXT:    pushq %rax
935 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 32
936 ; CHECK-APPLE-NEXT:    .cfi_offset %r12, -24
937 ; CHECK-APPLE-NEXT:    .cfi_offset %r13, -16
938 ; CHECK-APPLE-NEXT:    xorl %eax, %eax
939 ; CHECK-APPLE-NEXT:    testb %al, %al
940 ; CHECK-APPLE-NEXT:    jne LBB8_3
941 ; CHECK-APPLE-NEXT:  ## %bb.1: ## %.preheader
942 ; CHECK-APPLE-NEXT:    movq %rdi, %r13
943 ; CHECK-APPLE-NEXT:    ## implicit-def: $di
944 ; CHECK-APPLE-NEXT:    ## implicit-def: $r12
945 ; CHECK-APPLE-NEXT:  LBB8_2: ## =>This Inner Loop Header: Depth=1
946 ; CHECK-APPLE-NEXT:    callq *%rax
947 ; CHECK-APPLE-NEXT:    movzwl (%rax), %edi
948 ; CHECK-APPLE-NEXT:    jmp LBB8_2
949 ; CHECK-APPLE-NEXT:  LBB8_3:
950 ; CHECK-APPLE-NEXT:    addq $8, %rsp
951 ; CHECK-APPLE-NEXT:    popq %r12
952 ; CHECK-APPLE-NEXT:    popq %r13
953 ; CHECK-APPLE-NEXT:    retq
955 ; CHECK-O0-LABEL: swifterror_isel:
956 ; CHECK-O0:       ## %bb.0: ## %entry
957 ; CHECK-O0-NEXT:    pushq %r13
958 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
959 ; CHECK-O0-NEXT:    pushq %r12
960 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 24
961 ; CHECK-O0-NEXT:    subq $40, %rsp
962 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 64
963 ; CHECK-O0-NEXT:    .cfi_offset %r12, -24
964 ; CHECK-O0-NEXT:    .cfi_offset %r13, -16
965 ; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
966 ; CHECK-O0-NEXT:    ## implicit-def: $al
967 ; CHECK-O0-NEXT:    testb $1, %al
968 ; CHECK-O0-NEXT:    ## implicit-def: $ax
969 ; CHECK-O0-NEXT:    ## implicit-def: $r12
970 ; CHECK-O0-NEXT:    jne LBB8_2
971 ; CHECK-O0-NEXT:  LBB8_1: ## =>This Inner Loop Header: Depth=1
972 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload
973 ; CHECK-O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax ## 2-byte Reload
974 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 ## 8-byte Reload
975 ; CHECK-O0-NEXT:    ## implicit-def: $edi
976 ; CHECK-O0-NEXT:    movw %ax, %di
977 ; CHECK-O0-NEXT:    ## implicit-def: $rax
978 ; CHECK-O0-NEXT:    callq *%rax
979 ; CHECK-O0-NEXT:    ## implicit-def: $rax
980 ; CHECK-O0-NEXT:    movw (%rax), %ax
981 ; CHECK-O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
982 ; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
983 ; CHECK-O0-NEXT:    jmp LBB8_1
984 ; CHECK-O0-NEXT:  LBB8_2:
985 ; CHECK-O0-NEXT:    addq $40, %rsp
986 ; CHECK-O0-NEXT:    popq %r12
987 ; CHECK-O0-NEXT:    popq %r13
988 ; CHECK-O0-NEXT:    retq
990 ; CHECK-i386-LABEL: swifterror_isel:
991 ; CHECK-i386:       ## %bb.0: ## %entry
992 ; CHECK-i386-NEXT:    pushl %edi
993 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8
994 ; CHECK-i386-NEXT:    pushl %esi
995 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 12
996 ; CHECK-i386-NEXT:    subl $20, %esp
997 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 32
998 ; CHECK-i386-NEXT:    .cfi_offset %esi, -12
999 ; CHECK-i386-NEXT:    .cfi_offset %edi, -8
1000 ; CHECK-i386-NEXT:    xorl %eax, %eax
1001 ; CHECK-i386-NEXT:    testb %al, %al
1002 ; CHECK-i386-NEXT:    jne LBB8_3
1003 ; CHECK-i386-NEXT:  ## %bb.1: ## %.preheader
1004 ; CHECK-i386-NEXT:    movl 32(%esp), %esi
1005 ; CHECK-i386-NEXT:    leal 16(%esp), %edi
1006 ; CHECK-i386-NEXT:    ## implicit-def: $ax
1007 ; CHECK-i386-NEXT:  LBB8_2: ## =>This Inner Loop Header: Depth=1
1008 ; CHECK-i386-NEXT:    movl %edi, 8(%esp)
1009 ; CHECK-i386-NEXT:    movl %esi, 4(%esp)
1010 ; CHECK-i386-NEXT:    movl %eax, (%esp)
1011 ; CHECK-i386-NEXT:    calll *%eax
1012 ; CHECK-i386-NEXT:    movzwl (%eax), %eax
1013 ; CHECK-i386-NEXT:    jmp LBB8_2
1014 ; CHECK-i386-NEXT:  LBB8_3:
1015 ; CHECK-i386-NEXT:    addl $20, %esp
1016 ; CHECK-i386-NEXT:    popl %esi
1017 ; CHECK-i386-NEXT:    popl %edi
1018 ; CHECK-i386-NEXT:    retl
1019 entry:
1020   %swifterror = alloca swifterror ptr, align 8
1021   br i1 undef, label %5, label %1
1023   %2 = phi i16 [ %4, %1 ], [ undef, %entry ]
1024   %3 = call i1 undef(i16 %2, ptr swiftself %0, ptr nocapture swifterror %swifterror)
1025   %4 = load i16, ptr undef, align 2
1026   br label %1
1028   ret void
1031 ; This tests the basic usage of a swifterror parameter with swiftcc.
1032 define swiftcc float @foo_swiftcc(ptr swifterror %error_ptr_ref) {
1033 ; CHECK-APPLE-LABEL: foo_swiftcc:
1034 ; CHECK-APPLE:       ## %bb.0: ## %entry
1035 ; CHECK-APPLE-NEXT:    pushq %rax
1036 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
1037 ; CHECK-APPLE-NEXT:    movl $16, %edi
1038 ; CHECK-APPLE-NEXT:    callq _malloc
1039 ; CHECK-APPLE-NEXT:    movb $1, 8(%rax)
1040 ; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1041 ; CHECK-APPLE-NEXT:    movq %rax, %r12
1042 ; CHECK-APPLE-NEXT:    popq %rax
1043 ; CHECK-APPLE-NEXT:    retq
1045 ; CHECK-O0-LABEL: foo_swiftcc:
1046 ; CHECK-O0:       ## %bb.0: ## %entry
1047 ; CHECK-O0-NEXT:    pushq %rax
1048 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
1049 ; CHECK-O0-NEXT:    movl $16, %edi
1050 ; CHECK-O0-NEXT:    callq _malloc
1051 ; CHECK-O0-NEXT:    movq %rax, %r12
1052 ; CHECK-O0-NEXT:    movb $1, 8(%rax)
1053 ; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1054 ; CHECK-O0-NEXT:    popq %rax
1055 ; CHECK-O0-NEXT:    retq
1057 ; CHECK-i386-LABEL: foo_swiftcc:
1058 ; CHECK-i386:       ## %bb.0: ## %entry
1059 ; CHECK-i386-NEXT:    pushl %esi
1060 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8
1061 ; CHECK-i386-NEXT:    subl $8, %esp
1062 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
1063 ; CHECK-i386-NEXT:    .cfi_offset %esi, -8
1064 ; CHECK-i386-NEXT:    movl 16(%esp), %esi
1065 ; CHECK-i386-NEXT:    movl $0, 4(%esp)
1066 ; CHECK-i386-NEXT:    movl $16, (%esp)
1067 ; CHECK-i386-NEXT:    calll _malloc
1068 ; CHECK-i386-NEXT:    movl %eax, (%esi)
1069 ; CHECK-i386-NEXT:    movb $1, 8(%eax)
1070 ; CHECK-i386-NEXT:    fld1
1071 ; CHECK-i386-NEXT:    addl $8, %esp
1072 ; CHECK-i386-NEXT:    popl %esi
1073 ; CHECK-i386-NEXT:    retl
1076 entry:
1077   %call = call ptr @malloc(i64 16)
1078   store ptr %call, ptr %error_ptr_ref
1079   %tmp = getelementptr inbounds i8, ptr %call, i64 8
1080   store i8 1, ptr %tmp
1081   ret float 1.0
1084 declare swiftcc float @moo(ptr swifterror)
1086 ; Test parameter forwarding.
1087 define swiftcc float @forward_swifterror(ptr swifterror %error_ptr_ref) {
1088 ; CHECK-APPLE-LABEL: forward_swifterror:
1089 ; CHECK-APPLE:       ## %bb.0: ## %entry
1090 ; CHECK-APPLE-NEXT:    pushq %rax
1091 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
1092 ; CHECK-APPLE-NEXT:    callq _moo
1093 ; CHECK-APPLE-NEXT:    popq %rax
1094 ; CHECK-APPLE-NEXT:    retq
1096 ; CHECK-O0-LABEL: forward_swifterror:
1097 ; CHECK-O0:       ## %bb.0: ## %entry
1098 ; CHECK-O0-NEXT:    pushq %rax
1099 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
1100 ; CHECK-O0-NEXT:    callq _moo
1101 ; CHECK-O0-NEXT:    popq %rax
1102 ; CHECK-O0-NEXT:    retq
1104 ; CHECK-i386-LABEL: forward_swifterror:
1105 ; CHECK-i386:       ## %bb.0: ## %entry
1106 ; CHECK-i386-NEXT:    subl $12, %esp
1107 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
1108 ; CHECK-i386-NEXT:    movl 16(%esp), %eax
1109 ; CHECK-i386-NEXT:    movl %eax, (%esp)
1110 ; CHECK-i386-NEXT:    calll _moo
1111 ; CHECK-i386-NEXT:    addl $12, %esp
1112 ; CHECK-i386-NEXT:    retl
1115 entry:
1116   %call = call swiftcc float @moo(ptr swifterror %error_ptr_ref)
1117   ret float %call
1120 define swiftcc float @conditionally_forward_swifterror(ptr swifterror %error_ptr_ref, i32 %cc) {
1121 ; CHECK-APPLE-LABEL: conditionally_forward_swifterror:
1122 ; CHECK-APPLE:       ## %bb.0: ## %entry
1123 ; CHECK-APPLE-NEXT:    testl %edi, %edi
1124 ; CHECK-APPLE-NEXT:    je LBB11_2
1125 ; CHECK-APPLE-NEXT:  ## %bb.1: ## %gen_error
1126 ; CHECK-APPLE-NEXT:    pushq %rax
1127 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
1128 ; CHECK-APPLE-NEXT:    callq _moo
1129 ; CHECK-APPLE-NEXT:    popq %rax
1130 ; CHECK-APPLE-NEXT:    retq
1131 ; CHECK-APPLE-NEXT:  LBB11_2: ## %normal
1132 ; CHECK-APPLE-NEXT:    xorps %xmm0, %xmm0
1133 ; CHECK-APPLE-NEXT:    retq
1135 ; CHECK-O0-LABEL: conditionally_forward_swifterror:
1136 ; CHECK-O0:       ## %bb.0: ## %entry
1137 ; CHECK-O0-NEXT:    pushq %rax
1138 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
1139 ; CHECK-O0-NEXT:    movq %r12, (%rsp) ## 8-byte Spill
1140 ; CHECK-O0-NEXT:    cmpl $0, %edi
1141 ; CHECK-O0-NEXT:    je LBB11_2
1142 ; CHECK-O0-NEXT:  ## %bb.1: ## %gen_error
1143 ; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload
1144 ; CHECK-O0-NEXT:    callq _moo
1145 ; CHECK-O0-NEXT:    popq %rax
1146 ; CHECK-O0-NEXT:    retq
1147 ; CHECK-O0-NEXT:  LBB11_2: ## %normal
1148 ; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload
1149 ; CHECK-O0-NEXT:    xorps %xmm0, %xmm0
1150 ; CHECK-O0-NEXT:    popq %rax
1151 ; CHECK-O0-NEXT:    retq
1153 ; CHECK-i386-LABEL: conditionally_forward_swifterror:
1154 ; CHECK-i386:       ## %bb.0: ## %entry
1155 ; CHECK-i386-NEXT:    subl $12, %esp
1156 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
1157 ; CHECK-i386-NEXT:    cmpl $0, 20(%esp)
1158 ; CHECK-i386-NEXT:    je LBB11_2
1159 ; CHECK-i386-NEXT:  ## %bb.1: ## %gen_error
1160 ; CHECK-i386-NEXT:    movl 16(%esp), %eax
1161 ; CHECK-i386-NEXT:    movl %eax, (%esp)
1162 ; CHECK-i386-NEXT:    calll _moo
1163 ; CHECK-i386-NEXT:    addl $12, %esp
1164 ; CHECK-i386-NEXT:    retl
1165 ; CHECK-i386-NEXT:  LBB11_2: ## %normal
1166 ; CHECK-i386-NEXT:    fldz
1167 ; CHECK-i386-NEXT:    addl $12, %esp
1168 ; CHECK-i386-NEXT:    retl
1174 entry:
1175   %cond = icmp ne i32 %cc, 0
1176   br i1 %cond, label %gen_error, label %normal
1178 gen_error:
1179   %call = call swiftcc float @moo(ptr swifterror %error_ptr_ref)
1180   ret float %call
1182 normal:
1183   ret float 0.0
1186 ; Check that we don't blow up on tail calling swifterror argument functions.
1187 define float @tailcallswifterror(ptr swifterror %error_ptr_ref) {
1188 ; CHECK-APPLE-LABEL: tailcallswifterror:
1189 ; CHECK-APPLE:       ## %bb.0: ## %entry
1190 ; CHECK-APPLE-NEXT:    pushq %rax
1191 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
1192 ; CHECK-APPLE-NEXT:    callq _tailcallswifterror
1193 ; CHECK-APPLE-NEXT:    popq %rax
1194 ; CHECK-APPLE-NEXT:    retq
1196 ; CHECK-O0-LABEL: tailcallswifterror:
1197 ; CHECK-O0:       ## %bb.0: ## %entry
1198 ; CHECK-O0-NEXT:    pushq %rax
1199 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
1200 ; CHECK-O0-NEXT:    callq _tailcallswifterror
1201 ; CHECK-O0-NEXT:    popq %rax
1202 ; CHECK-O0-NEXT:    retq
1204 ; CHECK-i386-LABEL: tailcallswifterror:
1205 ; CHECK-i386:       ## %bb.0: ## %entry
1206 ; CHECK-i386-NEXT:    jmp _tailcallswifterror ## TAILCALL
1207 entry:
1208   %0 = tail call float @tailcallswifterror(ptr swifterror %error_ptr_ref)
1209   ret float %0
1211 define swiftcc float @tailcallswifterror_swiftcc(ptr swifterror %error_ptr_ref) {
1212 ; CHECK-APPLE-LABEL: tailcallswifterror_swiftcc:
1213 ; CHECK-APPLE:       ## %bb.0: ## %entry
1214 ; CHECK-APPLE-NEXT:    pushq %rax
1215 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
1216 ; CHECK-APPLE-NEXT:    callq _tailcallswifterror_swiftcc
1217 ; CHECK-APPLE-NEXT:    popq %rax
1218 ; CHECK-APPLE-NEXT:    retq
1220 ; CHECK-O0-LABEL: tailcallswifterror_swiftcc:
1221 ; CHECK-O0:       ## %bb.0: ## %entry
1222 ; CHECK-O0-NEXT:    pushq %rax
1223 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
1224 ; CHECK-O0-NEXT:    callq _tailcallswifterror_swiftcc
1225 ; CHECK-O0-NEXT:    popq %rax
1226 ; CHECK-O0-NEXT:    retq
1228 ; CHECK-i386-LABEL: tailcallswifterror_swiftcc:
1229 ; CHECK-i386:       ## %bb.0: ## %entry
1230 ; CHECK-i386-NEXT:    jmp _tailcallswifterror_swiftcc ## TAILCALL
1231 entry:
1232   %0 = tail call swiftcc float @tailcallswifterror_swiftcc(ptr swifterror %error_ptr_ref)
1233   ret float %0
1236 ; Check that we can handle an empty function with swifterror argument.
1237 define swiftcc {i32, i32, i32} @empty_swiftcc({i32, i32, i32} , ptr swifterror %error_ptr_ref) {
1238 ; CHECK-APPLE-LABEL: empty_swiftcc:
1239 ; CHECK-APPLE:       ## %bb.0: ## %entry
1240 ; CHECK-APPLE-NEXT:    movl %edx, %ecx
1241 ; CHECK-APPLE-NEXT:    movl %esi, %edx
1242 ; CHECK-APPLE-NEXT:    movl %edi, %eax
1243 ; CHECK-APPLE-NEXT:    retq
1245 ; CHECK-O0-LABEL: empty_swiftcc:
1246 ; CHECK-O0:       ## %bb.0: ## %entry
1247 ; CHECK-O0-NEXT:    movl %edx, %ecx
1248 ; CHECK-O0-NEXT:    movl %esi, %edx
1249 ; CHECK-O0-NEXT:    movl %edi, %eax
1250 ; CHECK-O0-NEXT:    retq
1252 ; CHECK-i386-LABEL: empty_swiftcc:
1253 ; CHECK-i386:       ## %bb.0: ## %entry
1254 ; CHECK-i386-NEXT:    movl 4(%esp), %eax
1255 ; CHECK-i386-NEXT:    movl 8(%esp), %edx
1256 ; CHECK-i386-NEXT:    movl 12(%esp), %ecx
1257 ; CHECK-i386-NEXT:    retl
1258 entry:
1259   ret {i32, i32, i32} %0
1262 ; Make sure we can handle the case when isel generates new machine basic blocks.
1263 define swiftcc void @dont_crash_on_new_isel_blocks(ptr nocapture swifterror, i1, ptr) {
1264 ; CHECK-APPLE-LABEL: dont_crash_on_new_isel_blocks:
1265 ; CHECK-APPLE:       ## %bb.0: ## %entry
1266 ; CHECK-APPLE-NEXT:    xorl %eax, %eax
1267 ; CHECK-APPLE-NEXT:    testb %al, %al
1268 ; CHECK-APPLE-NEXT:    jne LBB15_2
1269 ; CHECK-APPLE-NEXT:  ## %bb.1: ## %entry
1270 ; CHECK-APPLE-NEXT:    testb $1, %dil
1271 ; CHECK-APPLE-NEXT:  LBB15_2: ## %cont
1272 ; CHECK-APPLE-NEXT:    pushq %rax
1273 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
1274 ; CHECK-APPLE-NEXT:    callq *%rax
1275 ; CHECK-APPLE-NEXT:    popq %rax
1276 ; CHECK-APPLE-NEXT:    retq
1278 ; CHECK-O0-LABEL: dont_crash_on_new_isel_blocks:
1279 ; CHECK-O0:       ## %bb.0: ## %entry
1280 ; CHECK-O0-NEXT:    pushq %rax
1281 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
1282 ; CHECK-O0-NEXT:    movq %r12, (%rsp) ## 8-byte Spill
1283 ; CHECK-O0-NEXT:    movb %dil, %al
1284 ; CHECK-O0-NEXT:    orb $0, %al
1285 ; CHECK-O0-NEXT:    testb $1, %al
1286 ; CHECK-O0-NEXT:    jne LBB15_2
1287 ; CHECK-O0-NEXT:  ## %bb.1: ## %falsebb
1288 ; CHECK-O0-NEXT:  LBB15_2: ## %cont
1289 ; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload
1290 ; CHECK-O0-NEXT:    ## implicit-def: $rax
1291 ; CHECK-O0-NEXT:    callq *%rax
1292 ; CHECK-O0-NEXT:    popq %rax
1293 ; CHECK-O0-NEXT:    retq
1295 ; CHECK-i386-LABEL: dont_crash_on_new_isel_blocks:
1296 ; CHECK-i386:       ## %bb.0: ## %entry
1297 ; CHECK-i386-NEXT:    xorl %eax, %eax
1298 ; CHECK-i386-NEXT:    testb %al, %al
1299 ; CHECK-i386-NEXT:    jne LBB15_2
1300 ; CHECK-i386-NEXT:  ## %bb.1: ## %entry
1301 ; CHECK-i386-NEXT:    testb $1, 8(%esp)
1302 ; CHECK-i386-NEXT:  LBB15_2: ## %cont
1303 ; CHECK-i386-NEXT:    jmpl *%eax ## TAILCALL
1304 entry:
1305   %3 = or i1 false, %1
1306   br i1 %3, label %cont, label %falsebb
1308 falsebb:
1309   %4 = load ptr, ptr %2, align 8
1310   br label %cont
1312 cont:
1313   tail call swiftcc void undef(ptr nocapture swifterror %0)
1314   ret void
1317 define swiftcc void @swifterror_clobber(ptr nocapture swifterror %err) {
1318 ; CHECK-APPLE-LABEL: swifterror_clobber:
1319 ; CHECK-APPLE:       ## %bb.0:
1320 ; CHECK-APPLE-NEXT:    movq %r12, %rax
1321 ; CHECK-APPLE-NEXT:    ## InlineAsm Start
1322 ; CHECK-APPLE-NEXT:    nop
1323 ; CHECK-APPLE-NEXT:    ## InlineAsm End
1324 ; CHECK-APPLE-NEXT:    movq %rax, %r12
1325 ; CHECK-APPLE-NEXT:    retq
1327 ; CHECK-O0-LABEL: swifterror_clobber:
1328 ; CHECK-O0:       ## %bb.0:
1329 ; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1330 ; CHECK-O0-NEXT:    ## InlineAsm Start
1331 ; CHECK-O0-NEXT:    nop
1332 ; CHECK-O0-NEXT:    ## InlineAsm End
1333 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload
1334 ; CHECK-O0-NEXT:    retq
1336 ; CHECK-i386-LABEL: swifterror_clobber:
1337 ; CHECK-i386:       ## %bb.0:
1338 ; CHECK-i386-NEXT:    ## InlineAsm Start
1339 ; CHECK-i386-NEXT:    nop
1340 ; CHECK-i386-NEXT:    ## InlineAsm End
1341 ; CHECK-i386-NEXT:    retl
1342   call void asm sideeffect "nop", "~{r12}"()
1343   ret void
1346 define swiftcc void @swifterror_reg_clobber(ptr nocapture %err) {
1347 ; CHECK-APPLE-LABEL: swifterror_reg_clobber:
1348 ; CHECK-APPLE:       ## %bb.0:
1349 ; CHECK-APPLE-NEXT:    pushq %r12
1350 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
1351 ; CHECK-APPLE-NEXT:    .cfi_offset %r12, -16
1352 ; CHECK-APPLE-NEXT:    ## InlineAsm Start
1353 ; CHECK-APPLE-NEXT:    nop
1354 ; CHECK-APPLE-NEXT:    ## InlineAsm End
1355 ; CHECK-APPLE-NEXT:    popq %r12
1356 ; CHECK-APPLE-NEXT:    retq
1358 ; CHECK-O0-LABEL: swifterror_reg_clobber:
1359 ; CHECK-O0:       ## %bb.0:
1360 ; CHECK-O0-NEXT:    pushq %r12
1361 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
1362 ; CHECK-O0-NEXT:    .cfi_offset %r12, -16
1363 ; CHECK-O0-NEXT:    ## InlineAsm Start
1364 ; CHECK-O0-NEXT:    nop
1365 ; CHECK-O0-NEXT:    ## InlineAsm End
1366 ; CHECK-O0-NEXT:    popq %r12
1367 ; CHECK-O0-NEXT:    retq
1369 ; CHECK-i386-LABEL: swifterror_reg_clobber:
1370 ; CHECK-i386:       ## %bb.0:
1371 ; CHECK-i386-NEXT:    ## InlineAsm Start
1372 ; CHECK-i386-NEXT:    nop
1373 ; CHECK-i386-NEXT:    ## InlineAsm End
1374 ; CHECK-i386-NEXT:    retl
1375   call void asm sideeffect "nop", "~{r12}"()
1376   ret void
1379 define swiftcc void @params_in_reg(i64, i64, i64, i64, i64, i64, ptr swiftself, ptr nocapture swifterror %err) {
1380 ; CHECK-APPLE-LABEL: params_in_reg:
1381 ; CHECK-APPLE:       ## %bb.0:
1382 ; CHECK-APPLE-NEXT:    pushq %rbp
1383 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
1384 ; CHECK-APPLE-NEXT:    pushq %r15
1385 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 24
1386 ; CHECK-APPLE-NEXT:    pushq %r14
1387 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 32
1388 ; CHECK-APPLE-NEXT:    pushq %r13
1389 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 40
1390 ; CHECK-APPLE-NEXT:    pushq %rbx
1391 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 48
1392 ; CHECK-APPLE-NEXT:    subq $48, %rsp
1393 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 96
1394 ; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -48
1395 ; CHECK-APPLE-NEXT:    .cfi_offset %r13, -40
1396 ; CHECK-APPLE-NEXT:    .cfi_offset %r14, -32
1397 ; CHECK-APPLE-NEXT:    .cfi_offset %r15, -24
1398 ; CHECK-APPLE-NEXT:    .cfi_offset %rbp, -16
1399 ; CHECK-APPLE-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1400 ; CHECK-APPLE-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1401 ; CHECK-APPLE-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1402 ; CHECK-APPLE-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1403 ; CHECK-APPLE-NEXT:    movq %rcx, %r14
1404 ; CHECK-APPLE-NEXT:    movq %rdx, %r15
1405 ; CHECK-APPLE-NEXT:    movq %rsi, %rbx
1406 ; CHECK-APPLE-NEXT:    movq %rdi, %rbp
1407 ; CHECK-APPLE-NEXT:    movl $1, %edi
1408 ; CHECK-APPLE-NEXT:    movl $2, %esi
1409 ; CHECK-APPLE-NEXT:    movl $3, %edx
1410 ; CHECK-APPLE-NEXT:    movl $4, %ecx
1411 ; CHECK-APPLE-NEXT:    movl $5, %r8d
1412 ; CHECK-APPLE-NEXT:    movl $6, %r9d
1413 ; CHECK-APPLE-NEXT:    xorl %r13d, %r13d
1414 ; CHECK-APPLE-NEXT:    xorl %r12d, %r12d
1415 ; CHECK-APPLE-NEXT:    callq _params_in_reg2
1416 ; CHECK-APPLE-NEXT:    movq %rbp, %rdi
1417 ; CHECK-APPLE-NEXT:    movq %rbx, %rsi
1418 ; CHECK-APPLE-NEXT:    movq %r15, %rdx
1419 ; CHECK-APPLE-NEXT:    movq %r14, %rcx
1420 ; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 ## 8-byte Reload
1421 ; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 ## 8-byte Reload
1422 ; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 ## 8-byte Reload
1423 ; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload
1424 ; CHECK-APPLE-NEXT:    callq _params_in_reg2
1425 ; CHECK-APPLE-NEXT:    addq $48, %rsp
1426 ; CHECK-APPLE-NEXT:    popq %rbx
1427 ; CHECK-APPLE-NEXT:    popq %r13
1428 ; CHECK-APPLE-NEXT:    popq %r14
1429 ; CHECK-APPLE-NEXT:    popq %r15
1430 ; CHECK-APPLE-NEXT:    popq %rbp
1431 ; CHECK-APPLE-NEXT:    retq
1433 ; CHECK-O0-LABEL: params_in_reg:
1434 ; CHECK-O0:       ## %bb.0:
1435 ; CHECK-O0-NEXT:    pushq %r13
1436 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
1437 ; CHECK-O0-NEXT:    subq $80, %rsp
1438 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 96
1439 ; CHECK-O0-NEXT:    .cfi_offset %r13, -16
1440 ; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1441 ; CHECK-O0-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1442 ; CHECK-O0-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1443 ; CHECK-O0-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1444 ; CHECK-O0-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1445 ; CHECK-O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1446 ; CHECK-O0-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1447 ; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1448 ; CHECK-O0-NEXT:    ## implicit-def: $rax
1449 ; CHECK-O0-NEXT:    xorl %eax, %eax
1450 ; CHECK-O0-NEXT:    movl %eax, %r12d
1451 ; CHECK-O0-NEXT:    movl $1, %edi
1452 ; CHECK-O0-NEXT:    movl $2, %esi
1453 ; CHECK-O0-NEXT:    movl $3, %edx
1454 ; CHECK-O0-NEXT:    movl $4, %ecx
1455 ; CHECK-O0-NEXT:    movl $5, %r8d
1456 ; CHECK-O0-NEXT:    movl $6, %r9d
1457 ; CHECK-O0-NEXT:    movq %r12, %r13
1458 ; CHECK-O0-NEXT:    callq _params_in_reg2
1459 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 ## 8-byte Reload
1460 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload
1461 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi ## 8-byte Reload
1462 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx ## 8-byte Reload
1463 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
1464 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 ## 8-byte Reload
1465 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 ## 8-byte Reload
1466 ; CHECK-O0-NEXT:    movq %r12, %rax
1467 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload
1468 ; CHECK-O0-NEXT:    callq _params_in_reg2
1469 ; CHECK-O0-NEXT:    addq $80, %rsp
1470 ; CHECK-O0-NEXT:    popq %r13
1471 ; CHECK-O0-NEXT:    retq
1473 ; CHECK-i386-LABEL: params_in_reg:
1474 ; CHECK-i386:       ## %bb.0:
1475 ; CHECK-i386-NEXT:    pushl %ebp
1476 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8
1477 ; CHECK-i386-NEXT:    pushl %ebx
1478 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 12
1479 ; CHECK-i386-NEXT:    pushl %edi
1480 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
1481 ; CHECK-i386-NEXT:    pushl %esi
1482 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 20
1483 ; CHECK-i386-NEXT:    subl $60, %esp
1484 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 80
1485 ; CHECK-i386-NEXT:    .cfi_offset %esi, -20
1486 ; CHECK-i386-NEXT:    .cfi_offset %edi, -16
1487 ; CHECK-i386-NEXT:    .cfi_offset %ebx, -12
1488 ; CHECK-i386-NEXT:    .cfi_offset %ebp, -8
1489 ; CHECK-i386-NEXT:    movl $0, 56(%esp)
1490 ; CHECK-i386-NEXT:    movl 120(%esp), %ebx
1491 ; CHECK-i386-NEXT:    movl 124(%esp), %ebp
1492 ; CHECK-i386-NEXT:    movl 128(%esp), %esi
1493 ; CHECK-i386-NEXT:    movl 132(%esp), %edi
1494 ; CHECK-i386-NEXT:    leal 56(%esp), %eax
1495 ; CHECK-i386-NEXT:    movl %eax, 52(%esp)
1496 ; CHECK-i386-NEXT:    movl $0, 48(%esp)
1497 ; CHECK-i386-NEXT:    movl $0, 44(%esp)
1498 ; CHECK-i386-NEXT:    movl $6, 40(%esp)
1499 ; CHECK-i386-NEXT:    movl $0, 36(%esp)
1500 ; CHECK-i386-NEXT:    movl $5, 32(%esp)
1501 ; CHECK-i386-NEXT:    movl $0, 28(%esp)
1502 ; CHECK-i386-NEXT:    movl $4, 24(%esp)
1503 ; CHECK-i386-NEXT:    movl $0, 20(%esp)
1504 ; CHECK-i386-NEXT:    movl $3, 16(%esp)
1505 ; CHECK-i386-NEXT:    movl $0, 12(%esp)
1506 ; CHECK-i386-NEXT:    movl $2, 8(%esp)
1507 ; CHECK-i386-NEXT:    movl $0, 4(%esp)
1508 ; CHECK-i386-NEXT:    movl $1, (%esp)
1509 ; CHECK-i386-NEXT:    calll _params_in_reg2
1510 ; CHECK-i386-NEXT:    movl %edi, 52(%esp)
1511 ; CHECK-i386-NEXT:    movl %esi, 48(%esp)
1512 ; CHECK-i386-NEXT:    movl %ebp, 44(%esp)
1513 ; CHECK-i386-NEXT:    movl %ebx, 40(%esp)
1514 ; CHECK-i386-NEXT:    movl 116(%esp), %eax
1515 ; CHECK-i386-NEXT:    movl %eax, 36(%esp)
1516 ; CHECK-i386-NEXT:    movl 112(%esp), %eax
1517 ; CHECK-i386-NEXT:    movl %eax, 32(%esp)
1518 ; CHECK-i386-NEXT:    movl 108(%esp), %eax
1519 ; CHECK-i386-NEXT:    movl %eax, 28(%esp)
1520 ; CHECK-i386-NEXT:    movl 104(%esp), %eax
1521 ; CHECK-i386-NEXT:    movl %eax, 24(%esp)
1522 ; CHECK-i386-NEXT:    movl 100(%esp), %eax
1523 ; CHECK-i386-NEXT:    movl %eax, 20(%esp)
1524 ; CHECK-i386-NEXT:    movl 96(%esp), %eax
1525 ; CHECK-i386-NEXT:    movl %eax, 16(%esp)
1526 ; CHECK-i386-NEXT:    movl 92(%esp), %eax
1527 ; CHECK-i386-NEXT:    movl %eax, 12(%esp)
1528 ; CHECK-i386-NEXT:    movl 88(%esp), %eax
1529 ; CHECK-i386-NEXT:    movl %eax, 8(%esp)
1530 ; CHECK-i386-NEXT:    movl 84(%esp), %eax
1531 ; CHECK-i386-NEXT:    movl %eax, 4(%esp)
1532 ; CHECK-i386-NEXT:    movl 80(%esp), %eax
1533 ; CHECK-i386-NEXT:    movl %eax, (%esp)
1534 ; CHECK-i386-NEXT:    calll _params_in_reg2
1535 ; CHECK-i386-NEXT:    addl $60, %esp
1536 ; CHECK-i386-NEXT:    popl %esi
1537 ; CHECK-i386-NEXT:    popl %edi
1538 ; CHECK-i386-NEXT:    popl %ebx
1539 ; CHECK-i386-NEXT:    popl %ebp
1540 ; CHECK-i386-NEXT:    retl
1541   %error_ptr_ref = alloca swifterror ptr, align 8
1542   store ptr null, ptr %error_ptr_ref
1543   call swiftcc void @params_in_reg2(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, ptr swiftself null, ptr nocapture swifterror %error_ptr_ref)
1544   call swiftcc void @params_in_reg2(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, ptr swiftself %6, ptr nocapture swifterror %err)
1545   ret void
1547 declare swiftcc void @params_in_reg2(i64, i64, i64, i64, i64, i64, ptr swiftself, ptr nocapture swifterror %err)
1549 define swiftcc { i64, i64, i64, i64} @params_and_return_in_reg(i64, i64, i64, i64, i64, i64, ptr swiftself, ptr nocapture swifterror %err) {
1550 ; CHECK-APPLE-LABEL: params_and_return_in_reg:
1551 ; CHECK-APPLE:       ## %bb.0:
1552 ; CHECK-APPLE-NEXT:    pushq %rbp
1553 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
1554 ; CHECK-APPLE-NEXT:    pushq %r15
1555 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 24
1556 ; CHECK-APPLE-NEXT:    pushq %r14
1557 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 32
1558 ; CHECK-APPLE-NEXT:    pushq %r13
1559 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 40
1560 ; CHECK-APPLE-NEXT:    pushq %rbx
1561 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 48
1562 ; CHECK-APPLE-NEXT:    subq $48, %rsp
1563 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 96
1564 ; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -48
1565 ; CHECK-APPLE-NEXT:    .cfi_offset %r13, -40
1566 ; CHECK-APPLE-NEXT:    .cfi_offset %r14, -32
1567 ; CHECK-APPLE-NEXT:    .cfi_offset %r15, -24
1568 ; CHECK-APPLE-NEXT:    .cfi_offset %rbp, -16
1569 ; CHECK-APPLE-NEXT:    movq %r12, %r14
1570 ; CHECK-APPLE-NEXT:    movq %r13, (%rsp) ## 8-byte Spill
1571 ; CHECK-APPLE-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1572 ; CHECK-APPLE-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1573 ; CHECK-APPLE-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1574 ; CHECK-APPLE-NEXT:    movq %rdx, %r15
1575 ; CHECK-APPLE-NEXT:    movq %rsi, %rbx
1576 ; CHECK-APPLE-NEXT:    movq %rdi, %rbp
1577 ; CHECK-APPLE-NEXT:    movl $1, %edi
1578 ; CHECK-APPLE-NEXT:    movl $2, %esi
1579 ; CHECK-APPLE-NEXT:    movl $3, %edx
1580 ; CHECK-APPLE-NEXT:    movl $4, %ecx
1581 ; CHECK-APPLE-NEXT:    movl $5, %r8d
1582 ; CHECK-APPLE-NEXT:    movl $6, %r9d
1583 ; CHECK-APPLE-NEXT:    xorl %r13d, %r13d
1584 ; CHECK-APPLE-NEXT:    xorl %r12d, %r12d
1585 ; CHECK-APPLE-NEXT:    callq _params_in_reg2
1586 ; CHECK-APPLE-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1587 ; CHECK-APPLE-NEXT:    movq %rbp, %rdi
1588 ; CHECK-APPLE-NEXT:    movq %rbx, %rsi
1589 ; CHECK-APPLE-NEXT:    movq %r15, %rdx
1590 ; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
1591 ; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 ## 8-byte Reload
1592 ; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 ## 8-byte Reload
1593 ; CHECK-APPLE-NEXT:    movq (%rsp), %r13 ## 8-byte Reload
1594 ; CHECK-APPLE-NEXT:    movq %r14, %r12
1595 ; CHECK-APPLE-NEXT:    callq _params_and_return_in_reg2
1596 ; CHECK-APPLE-NEXT:    movq %rax, %rbx
1597 ; CHECK-APPLE-NEXT:    movq %rdx, %rbp
1598 ; CHECK-APPLE-NEXT:    movq %rcx, %r15
1599 ; CHECK-APPLE-NEXT:    movq %r8, %r14
1600 ; CHECK-APPLE-NEXT:    movq %r12, (%rsp) ## 8-byte Spill
1601 ; CHECK-APPLE-NEXT:    movl $1, %edi
1602 ; CHECK-APPLE-NEXT:    movl $2, %esi
1603 ; CHECK-APPLE-NEXT:    movl $3, %edx
1604 ; CHECK-APPLE-NEXT:    movl $4, %ecx
1605 ; CHECK-APPLE-NEXT:    movl $5, %r8d
1606 ; CHECK-APPLE-NEXT:    movl $6, %r9d
1607 ; CHECK-APPLE-NEXT:    xorl %r13d, %r13d
1608 ; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload
1609 ; CHECK-APPLE-NEXT:    callq _params_in_reg2
1610 ; CHECK-APPLE-NEXT:    movq %rbx, %rax
1611 ; CHECK-APPLE-NEXT:    movq %rbp, %rdx
1612 ; CHECK-APPLE-NEXT:    movq %r15, %rcx
1613 ; CHECK-APPLE-NEXT:    movq %r14, %r8
1614 ; CHECK-APPLE-NEXT:    movq (%rsp), %r12 ## 8-byte Reload
1615 ; CHECK-APPLE-NEXT:    addq $48, %rsp
1616 ; CHECK-APPLE-NEXT:    popq %rbx
1617 ; CHECK-APPLE-NEXT:    popq %r13
1618 ; CHECK-APPLE-NEXT:    popq %r14
1619 ; CHECK-APPLE-NEXT:    popq %r15
1620 ; CHECK-APPLE-NEXT:    popq %rbp
1621 ; CHECK-APPLE-NEXT:    retq
1623 ; CHECK-O0-LABEL: params_and_return_in_reg:
1624 ; CHECK-O0:       ## %bb.0:
1625 ; CHECK-O0-NEXT:    pushq %r13
1626 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
1627 ; CHECK-O0-NEXT:    subq $176, %rsp
1628 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 192
1629 ; CHECK-O0-NEXT:    .cfi_offset %r13, -16
1630 ; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1631 ; CHECK-O0-NEXT:    movq %r13, (%rsp) ## 8-byte Spill
1632 ; CHECK-O0-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1633 ; CHECK-O0-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1634 ; CHECK-O0-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1635 ; CHECK-O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1636 ; CHECK-O0-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1637 ; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1638 ; CHECK-O0-NEXT:    ## implicit-def: $rax
1639 ; CHECK-O0-NEXT:    xorl %eax, %eax
1640 ; CHECK-O0-NEXT:    movl %eax, %r12d
1641 ; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1642 ; CHECK-O0-NEXT:    movl $1, %edi
1643 ; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1644 ; CHECK-O0-NEXT:    movl $2, %esi
1645 ; CHECK-O0-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1646 ; CHECK-O0-NEXT:    movl $3, %edx
1647 ; CHECK-O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1648 ; CHECK-O0-NEXT:    movl $4, %ecx
1649 ; CHECK-O0-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1650 ; CHECK-O0-NEXT:    movl $5, %r8d
1651 ; CHECK-O0-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1652 ; CHECK-O0-NEXT:    movl $6, %r9d
1653 ; CHECK-O0-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1654 ; CHECK-O0-NEXT:    movq %r12, %r13
1655 ; CHECK-O0-NEXT:    callq _params_in_reg2
1656 ; CHECK-O0-NEXT:    movq (%rsp), %r13 ## 8-byte Reload
1657 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload
1658 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi ## 8-byte Reload
1659 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx ## 8-byte Reload
1660 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
1661 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 ## 8-byte Reload
1662 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 ## 8-byte Reload
1663 ; CHECK-O0-NEXT:    movq %r12, %rax
1664 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload
1665 ; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1666 ; CHECK-O0-NEXT:    callq _params_and_return_in_reg2
1667 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 ## 8-byte Reload
1668 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload
1669 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi ## 8-byte Reload
1670 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 ## 8-byte Reload
1671 ; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1672 ; CHECK-O0-NEXT:    movq %rdx, %rax
1673 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx ## 8-byte Reload
1674 ; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1675 ; CHECK-O0-NEXT:    movq %rcx, %rax
1676 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
1677 ; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1678 ; CHECK-O0-NEXT:    movq %r8, %rax
1679 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 ## 8-byte Reload
1680 ; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1681 ; CHECK-O0-NEXT:    movq %r12, %rax
1682 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload
1683 ; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1684 ; CHECK-O0-NEXT:    callq _params_in_reg2
1685 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload
1686 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx ## 8-byte Reload
1687 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
1688 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 ## 8-byte Reload
1689 ; CHECK-O0-NEXT:    movq %r12, %rsi
1690 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload
1691 ; CHECK-O0-NEXT:    addq $176, %rsp
1692 ; CHECK-O0-NEXT:    popq %r13
1693 ; CHECK-O0-NEXT:    retq
1695 ; CHECK-i386-LABEL: params_and_return_in_reg:
1696 ; CHECK-i386:       ## %bb.0:
1697 ; CHECK-i386-NEXT:    pushl %ebp
1698 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8
1699 ; CHECK-i386-NEXT:    pushl %ebx
1700 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 12
1701 ; CHECK-i386-NEXT:    pushl %edi
1702 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
1703 ; CHECK-i386-NEXT:    pushl %esi
1704 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 20
1705 ; CHECK-i386-NEXT:    subl $124, %esp
1706 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 144
1707 ; CHECK-i386-NEXT:    .cfi_offset %esi, -20
1708 ; CHECK-i386-NEXT:    .cfi_offset %edi, -16
1709 ; CHECK-i386-NEXT:    .cfi_offset %ebx, -12
1710 ; CHECK-i386-NEXT:    .cfi_offset %ebp, -8
1711 ; CHECK-i386-NEXT:    movl $0, 64(%esp)
1712 ; CHECK-i386-NEXT:    movl 188(%esp), %ebp
1713 ; CHECK-i386-NEXT:    movl 192(%esp), %ebx
1714 ; CHECK-i386-NEXT:    movl 196(%esp), %edi
1715 ; CHECK-i386-NEXT:    movl 200(%esp), %esi
1716 ; CHECK-i386-NEXT:    leal 64(%esp), %eax
1717 ; CHECK-i386-NEXT:    movl %eax, 52(%esp)
1718 ; CHECK-i386-NEXT:    movl $0, 48(%esp)
1719 ; CHECK-i386-NEXT:    movl $0, 44(%esp)
1720 ; CHECK-i386-NEXT:    movl $6, 40(%esp)
1721 ; CHECK-i386-NEXT:    movl $0, 36(%esp)
1722 ; CHECK-i386-NEXT:    movl $5, 32(%esp)
1723 ; CHECK-i386-NEXT:    movl $0, 28(%esp)
1724 ; CHECK-i386-NEXT:    movl $4, 24(%esp)
1725 ; CHECK-i386-NEXT:    movl $0, 20(%esp)
1726 ; CHECK-i386-NEXT:    movl $3, 16(%esp)
1727 ; CHECK-i386-NEXT:    movl $0, 12(%esp)
1728 ; CHECK-i386-NEXT:    movl $2, 8(%esp)
1729 ; CHECK-i386-NEXT:    movl $0, 4(%esp)
1730 ; CHECK-i386-NEXT:    movl $1, (%esp)
1731 ; CHECK-i386-NEXT:    calll _params_in_reg2
1732 ; CHECK-i386-NEXT:    movl %esi, 56(%esp)
1733 ; CHECK-i386-NEXT:    movl %edi, 52(%esp)
1734 ; CHECK-i386-NEXT:    movl %ebx, 48(%esp)
1735 ; CHECK-i386-NEXT:    movl %ebp, 44(%esp)
1736 ; CHECK-i386-NEXT:    movl 184(%esp), %eax
1737 ; CHECK-i386-NEXT:    movl %eax, 40(%esp)
1738 ; CHECK-i386-NEXT:    movl 180(%esp), %eax
1739 ; CHECK-i386-NEXT:    movl %eax, 36(%esp)
1740 ; CHECK-i386-NEXT:    movl 176(%esp), %eax
1741 ; CHECK-i386-NEXT:    movl %eax, 32(%esp)
1742 ; CHECK-i386-NEXT:    movl 172(%esp), %eax
1743 ; CHECK-i386-NEXT:    movl %eax, 28(%esp)
1744 ; CHECK-i386-NEXT:    movl 168(%esp), %eax
1745 ; CHECK-i386-NEXT:    movl %eax, 24(%esp)
1746 ; CHECK-i386-NEXT:    movl 164(%esp), %eax
1747 ; CHECK-i386-NEXT:    movl %eax, 20(%esp)
1748 ; CHECK-i386-NEXT:    movl 160(%esp), %eax
1749 ; CHECK-i386-NEXT:    movl %eax, 16(%esp)
1750 ; CHECK-i386-NEXT:    movl 156(%esp), %eax
1751 ; CHECK-i386-NEXT:    movl %eax, 12(%esp)
1752 ; CHECK-i386-NEXT:    movl 152(%esp), %eax
1753 ; CHECK-i386-NEXT:    movl %eax, 8(%esp)
1754 ; CHECK-i386-NEXT:    movl 148(%esp), %eax
1755 ; CHECK-i386-NEXT:    movl %eax, 4(%esp)
1756 ; CHECK-i386-NEXT:    leal 88(%esp), %eax
1757 ; CHECK-i386-NEXT:    movl %eax, (%esp)
1758 ; CHECK-i386-NEXT:    calll _params_and_return_in_reg2
1759 ; CHECK-i386-NEXT:    subl $4, %esp
1760 ; CHECK-i386-NEXT:    movl 88(%esp), %eax
1761 ; CHECK-i386-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill
1762 ; CHECK-i386-NEXT:    movl 92(%esp), %eax
1763 ; CHECK-i386-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill
1764 ; CHECK-i386-NEXT:    movl 96(%esp), %eax
1765 ; CHECK-i386-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill
1766 ; CHECK-i386-NEXT:    movl 100(%esp), %eax
1767 ; CHECK-i386-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill
1768 ; CHECK-i386-NEXT:    movl 104(%esp), %ebp
1769 ; CHECK-i386-NEXT:    movl 108(%esp), %edi
1770 ; CHECK-i386-NEXT:    movl 112(%esp), %ebx
1771 ; CHECK-i386-NEXT:    movl 116(%esp), %esi
1772 ; CHECK-i386-NEXT:    leal 64(%esp), %eax
1773 ; CHECK-i386-NEXT:    movl %eax, 52(%esp)
1774 ; CHECK-i386-NEXT:    movl $0, 48(%esp)
1775 ; CHECK-i386-NEXT:    movl $0, 44(%esp)
1776 ; CHECK-i386-NEXT:    movl $6, 40(%esp)
1777 ; CHECK-i386-NEXT:    movl $0, 36(%esp)
1778 ; CHECK-i386-NEXT:    movl $5, 32(%esp)
1779 ; CHECK-i386-NEXT:    movl $0, 28(%esp)
1780 ; CHECK-i386-NEXT:    movl $4, 24(%esp)
1781 ; CHECK-i386-NEXT:    movl $0, 20(%esp)
1782 ; CHECK-i386-NEXT:    movl $3, 16(%esp)
1783 ; CHECK-i386-NEXT:    movl $0, 12(%esp)
1784 ; CHECK-i386-NEXT:    movl $2, 8(%esp)
1785 ; CHECK-i386-NEXT:    movl $0, 4(%esp)
1786 ; CHECK-i386-NEXT:    movl $1, (%esp)
1787 ; CHECK-i386-NEXT:    calll _params_in_reg2
1788 ; CHECK-i386-NEXT:    movl 144(%esp), %eax
1789 ; CHECK-i386-NEXT:    movl %esi, 28(%eax)
1790 ; CHECK-i386-NEXT:    movl %ebx, 24(%eax)
1791 ; CHECK-i386-NEXT:    movl %edi, 20(%eax)
1792 ; CHECK-i386-NEXT:    movl %ebp, 16(%eax)
1793 ; CHECK-i386-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx ## 4-byte Reload
1794 ; CHECK-i386-NEXT:    movl %ecx, 12(%eax)
1795 ; CHECK-i386-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx ## 4-byte Reload
1796 ; CHECK-i386-NEXT:    movl %ecx, 8(%eax)
1797 ; CHECK-i386-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx ## 4-byte Reload
1798 ; CHECK-i386-NEXT:    movl %ecx, 4(%eax)
1799 ; CHECK-i386-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx ## 4-byte Reload
1800 ; CHECK-i386-NEXT:    movl %ecx, (%eax)
1801 ; CHECK-i386-NEXT:    addl $124, %esp
1802 ; CHECK-i386-NEXT:    popl %esi
1803 ; CHECK-i386-NEXT:    popl %edi
1804 ; CHECK-i386-NEXT:    popl %ebx
1805 ; CHECK-i386-NEXT:    popl %ebp
1806 ; CHECK-i386-NEXT:    retl $4
1807   %error_ptr_ref = alloca swifterror ptr, align 8
1808   store ptr null, ptr %error_ptr_ref
1809   call swiftcc void @params_in_reg2(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, ptr swiftself null, ptr nocapture swifterror %error_ptr_ref)
1810   %val = call swiftcc  { i64, i64, i64, i64 } @params_and_return_in_reg2(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, ptr swiftself %6, ptr nocapture swifterror %err)
1811   call swiftcc void @params_in_reg2(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, ptr swiftself null, ptr nocapture swifterror %error_ptr_ref)
1812   ret { i64, i64, i64, i64 }%val
1815 declare swiftcc { i64, i64, i64, i64 } @params_and_return_in_reg2(i64, i64, i64, i64, i64, i64, ptr swiftself, ptr nocapture swifterror %err)
1818 declare void @acallee(ptr)
1820 ; Make sure we don't tail call if the caller returns a swifterror value. We
1821 ; would have to move into the swifterror register before the tail call.
1822 define swiftcc void @tailcall_from_swifterror(ptr swifterror %error_ptr_ref) {
1823 ; CHECK-APPLE-LABEL: tailcall_from_swifterror:
1824 ; CHECK-APPLE:       ## %bb.0: ## %entry
1825 ; CHECK-APPLE-NEXT:    pushq %rbx
1826 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
1827 ; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -16
1828 ; CHECK-APPLE-NEXT:    movq %r12, %rbx
1829 ; CHECK-APPLE-NEXT:    xorl %edi, %edi
1830 ; CHECK-APPLE-NEXT:    callq _acallee
1831 ; CHECK-APPLE-NEXT:    movq %rbx, %r12
1832 ; CHECK-APPLE-NEXT:    popq %rbx
1833 ; CHECK-APPLE-NEXT:    retq
1835 ; CHECK-O0-LABEL: tailcall_from_swifterror:
1836 ; CHECK-O0:       ## %bb.0: ## %entry
1837 ; CHECK-O0-NEXT:    pushq %rax
1838 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
1839 ; CHECK-O0-NEXT:    movq %r12, (%rsp) ## 8-byte Spill
1840 ; CHECK-O0-NEXT:    xorl %eax, %eax
1841 ; CHECK-O0-NEXT:    movl %eax, %edi
1842 ; CHECK-O0-NEXT:    callq _acallee
1843 ; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload
1844 ; CHECK-O0-NEXT:    popq %rax
1845 ; CHECK-O0-NEXT:    retq
1847 ; CHECK-i386-LABEL: tailcall_from_swifterror:
1848 ; CHECK-i386:       ## %bb.0: ## %entry
1849 ; CHECK-i386-NEXT:    subl $12, %esp
1850 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
1851 ; CHECK-i386-NEXT:    movl $0, (%esp)
1852 ; CHECK-i386-NEXT:    calll _acallee
1853 ; CHECK-i386-NEXT:    addl $12, %esp
1854 ; CHECK-i386-NEXT:    retl
1855 entry:
1856   tail call void @acallee(ptr null)
1857   ret void
1860 ; Make sure we don't crash on this function during -O0.
1861 ; We used to crash because we would insert an IMPLICIT_DEF for the swifterror at
1862 ; beginning of the machine basic block but did not inform FastISel of the
1863 ; inserted instruction. When computing the InsertPoint in the entry block
1864 ; FastISel would choose an insertion point before the IMPLICIT_DEF causing a
1865 ; crash later on.
1866 declare hidden swiftcc ptr @testFunA()
1868 %TSb = type <{ i1 }>
1870 define swiftcc void @dontCrash()  {
1871 ; CHECK-APPLE-LABEL: dontCrash:
1872 ; CHECK-APPLE:       ## %bb.0: ## %entry
1873 ; CHECK-APPLE-NEXT:    pushq %rax
1874 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
1875 ; CHECK-APPLE-NEXT:    callq _testFunA
1876 ; CHECK-APPLE-NEXT:    cmpb $1, (%rax)
1877 ; CHECK-APPLE-NEXT:    popq %rax
1878 ; CHECK-APPLE-NEXT:    retq
1880 ; CHECK-O0-LABEL: dontCrash:
1881 ; CHECK-O0:       ## %bb.0: ## %entry
1882 ; CHECK-O0-NEXT:    pushq %rax
1883 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
1884 ; CHECK-O0-NEXT:    ## implicit-def: $rax
1885 ; CHECK-O0-NEXT:    xorl %eax, %eax
1886 ; CHECK-O0-NEXT:    ## kill: def $rax killed $eax
1887 ; CHECK-O0-NEXT:    callq _testFunA
1888 ; CHECK-O0-NEXT:    testb $1, (%rax)
1889 ; CHECK-O0-NEXT:    jne LBB21_1
1890 ; CHECK-O0-NEXT:    jmp LBB21_2
1891 ; CHECK-O0-NEXT:  LBB21_1: ## %trueBB
1892 ; CHECK-O0-NEXT:    popq %rax
1893 ; CHECK-O0-NEXT:    retq
1894 ; CHECK-O0-NEXT:  LBB21_2: ## %falseBB
1895 ; CHECK-O0-NEXT:    popq %rax
1896 ; CHECK-O0-NEXT:    retq
1898 ; CHECK-i386-LABEL: dontCrash:
1899 ; CHECK-i386:       ## %bb.0: ## %entry
1900 ; CHECK-i386-NEXT:    subl $12, %esp
1901 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
1902 ; CHECK-i386-NEXT:    movl $0, 8(%esp)
1903 ; CHECK-i386-NEXT:    calll _testFunA
1904 ; CHECK-i386-NEXT:    cmpb $1, (%eax)
1905 ; CHECK-i386-NEXT:    addl $12, %esp
1906 ; CHECK-i386-NEXT:    retl
1907 entry:
1908   %swifterror = alloca swifterror ptr, align 8
1909   store ptr null, ptr %swifterror, align 8
1910   %a = call ptr @testFunA()
1911   %c = load i1, ptr %a, align 1
1912   br i1 %c, label %trueBB, label %falseBB
1914 trueBB:
1915   ret void
1917 falseBB:
1918   ret void
1922 declare swiftcc void @foo2(ptr swifterror)
1924 ; Make sure we properly assign registers during fast-isel.
1925 define swiftcc ptr @testAssign(ptr %error_ref) {
1926 ; CHECK-APPLE-LABEL: testAssign:
1927 ; CHECK-APPLE:       ## %bb.0: ## %entry
1928 ; CHECK-APPLE-NEXT:    pushq %r12
1929 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
1930 ; CHECK-APPLE-NEXT:    subq $16, %rsp
1931 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 32
1932 ; CHECK-APPLE-NEXT:    .cfi_offset %r12, -16
1933 ; CHECK-APPLE-NEXT:    xorl %r12d, %r12d
1934 ; CHECK-APPLE-NEXT:    callq _foo2
1935 ; CHECK-APPLE-NEXT:    movq %r12, %rax
1936 ; CHECK-APPLE-NEXT:    addq $16, %rsp
1937 ; CHECK-APPLE-NEXT:    popq %r12
1938 ; CHECK-APPLE-NEXT:    retq
1940 ; CHECK-O0-LABEL: testAssign:
1941 ; CHECK-O0:       ## %bb.0: ## %entry
1942 ; CHECK-O0-NEXT:    pushq %r12
1943 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
1944 ; CHECK-O0-NEXT:    subq $16, %rsp
1945 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 32
1946 ; CHECK-O0-NEXT:    .cfi_offset %r12, -16
1947 ; CHECK-O0-NEXT:    ## implicit-def: $rax
1948 ; CHECK-O0-NEXT:    xorl %eax, %eax
1949 ; CHECK-O0-NEXT:    movl %eax, %r12d
1950 ; CHECK-O0-NEXT:    callq _foo2
1951 ; CHECK-O0-NEXT:    movq %r12, (%rsp) ## 8-byte Spill
1952 ; CHECK-O0-NEXT:  ## %bb.1: ## %a
1953 ; CHECK-O0-NEXT:    movq (%rsp), %rax ## 8-byte Reload
1954 ; CHECK-O0-NEXT:    addq $16, %rsp
1955 ; CHECK-O0-NEXT:    popq %r12
1956 ; CHECK-O0-NEXT:    retq
1958 ; CHECK-i386-LABEL: testAssign:
1959 ; CHECK-i386:       ## %bb.0: ## %entry
1960 ; CHECK-i386-NEXT:    subl $12, %esp
1961 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
1962 ; CHECK-i386-NEXT:    movl $0, 8(%esp)
1963 ; CHECK-i386-NEXT:    leal 8(%esp), %eax
1964 ; CHECK-i386-NEXT:    movl %eax, (%esp)
1965 ; CHECK-i386-NEXT:    calll _foo2
1966 ; CHECK-i386-NEXT:    movl 8(%esp), %eax
1967 ; CHECK-i386-NEXT:    addl $12, %esp
1968 ; CHECK-i386-NEXT:    retl
1969 entry:
1970   %error_ptr = alloca swifterror ptr
1971   store ptr null, ptr %error_ptr
1972   call swiftcc void @foo2(ptr swifterror %error_ptr)
1973   br label %a
1976   %error = load ptr, ptr %error_ptr
1977   ret ptr %error
1980 define swiftcc ptr @testAssign2(ptr %error_ref, ptr swifterror %err) {
1981 ; CHECK-APPLE-LABEL: testAssign2:
1982 ; CHECK-APPLE:       ## %bb.0: ## %entry
1983 ; CHECK-APPLE-NEXT:    movq %r12, %rax
1984 ; CHECK-APPLE-NEXT:    retq
1986 ; CHECK-O0-LABEL: testAssign2:
1987 ; CHECK-O0:       ## %bb.0: ## %entry
1988 ; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
1989 ; CHECK-O0-NEXT:    jmp LBB23_1
1990 ; CHECK-O0-NEXT:  LBB23_1: ## %a
1991 ; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload
1992 ; CHECK-O0-NEXT:    movq %r12, %rax
1993 ; CHECK-O0-NEXT:    retq
1995 ; CHECK-i386-LABEL: testAssign2:
1996 ; CHECK-i386:       ## %bb.0: ## %entry
1997 ; CHECK-i386-NEXT:    movl 8(%esp), %eax
1998 ; CHECK-i386-NEXT:    movl (%eax), %eax
1999 ; CHECK-i386-NEXT:    retl
2000 entry:
2001   br label %a
2004   %error = load ptr, ptr %err
2005   ret ptr %error
2008 define swiftcc ptr @testAssign3(ptr %error_ref, ptr swifterror %err) {
2009 ; CHECK-APPLE-LABEL: testAssign3:
2010 ; CHECK-APPLE:       ## %bb.0: ## %entry
2011 ; CHECK-APPLE-NEXT:    pushq %rax
2012 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
2013 ; CHECK-APPLE-NEXT:    callq _foo2
2014 ; CHECK-APPLE-NEXT:    movq %r12, %rax
2015 ; CHECK-APPLE-NEXT:    popq %rcx
2016 ; CHECK-APPLE-NEXT:    retq
2018 ; CHECK-O0-LABEL: testAssign3:
2019 ; CHECK-O0:       ## %bb.0: ## %entry
2020 ; CHECK-O0-NEXT:    pushq %rax
2021 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
2022 ; CHECK-O0-NEXT:    callq _foo2
2023 ; CHECK-O0-NEXT:    movq %r12, (%rsp) ## 8-byte Spill
2024 ; CHECK-O0-NEXT:  ## %bb.1: ## %a
2025 ; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload
2026 ; CHECK-O0-NEXT:    movq %r12, %rax
2027 ; CHECK-O0-NEXT:    popq %rcx
2028 ; CHECK-O0-NEXT:    retq
2030 ; CHECK-i386-LABEL: testAssign3:
2031 ; CHECK-i386:       ## %bb.0: ## %entry
2032 ; CHECK-i386-NEXT:    pushl %esi
2033 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8
2034 ; CHECK-i386-NEXT:    subl $8, %esp
2035 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
2036 ; CHECK-i386-NEXT:    .cfi_offset %esi, -8
2037 ; CHECK-i386-NEXT:    movl 20(%esp), %esi
2038 ; CHECK-i386-NEXT:    movl %esi, (%esp)
2039 ; CHECK-i386-NEXT:    calll _foo2
2040 ; CHECK-i386-NEXT:    movl (%esi), %eax
2041 ; CHECK-i386-NEXT:    addl $8, %esp
2042 ; CHECK-i386-NEXT:    popl %esi
2043 ; CHECK-i386-NEXT:    retl
2044 entry:
2045   call swiftcc void @foo2(ptr swifterror %err)
2046   br label %a
2049   %error = load ptr, ptr %err
2050   ret ptr %error
2053 define swiftcc ptr @testAssign4(ptr %error_ref, ptr swifterror %err) {
2054 ; CHECK-APPLE-LABEL: testAssign4:
2055 ; CHECK-APPLE:       ## %bb.0: ## %entry
2056 ; CHECK-APPLE-NEXT:    pushq %rax
2057 ; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16
2058 ; CHECK-APPLE-NEXT:    callq _foo2
2059 ; CHECK-APPLE-NEXT:    xorl %eax, %eax
2060 ; CHECK-APPLE-NEXT:    xorl %r12d, %r12d
2061 ; CHECK-APPLE-NEXT:    popq %rcx
2062 ; CHECK-APPLE-NEXT:    retq
2064 ; CHECK-O0-LABEL: testAssign4:
2065 ; CHECK-O0:       ## %bb.0: ## %entry
2066 ; CHECK-O0-NEXT:    pushq %rax
2067 ; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16
2068 ; CHECK-O0-NEXT:    callq _foo2
2069 ; CHECK-O0-NEXT:    xorl %eax, %eax
2070 ; CHECK-O0-NEXT:    ## kill: def $rax killed $eax
2071 ; CHECK-O0-NEXT:    movq %rax, (%rsp) ## 8-byte Spill
2072 ; CHECK-O0-NEXT:  ## %bb.1: ## %a
2073 ; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload
2074 ; CHECK-O0-NEXT:    movq %r12, %rax
2075 ; CHECK-O0-NEXT:    popq %rcx
2076 ; CHECK-O0-NEXT:    retq
2078 ; CHECK-i386-LABEL: testAssign4:
2079 ; CHECK-i386:       ## %bb.0: ## %entry
2080 ; CHECK-i386-NEXT:    pushl %esi
2081 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8
2082 ; CHECK-i386-NEXT:    subl $8, %esp
2083 ; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16
2084 ; CHECK-i386-NEXT:    .cfi_offset %esi, -8
2085 ; CHECK-i386-NEXT:    movl 20(%esp), %esi
2086 ; CHECK-i386-NEXT:    movl %esi, (%esp)
2087 ; CHECK-i386-NEXT:    calll _foo2
2088 ; CHECK-i386-NEXT:    movl $0, (%esi)
2089 ; CHECK-i386-NEXT:    movl (%esi), %eax
2090 ; CHECK-i386-NEXT:    addl $8, %esp
2091 ; CHECK-i386-NEXT:    popl %esi
2092 ; CHECK-i386-NEXT:    retl
2093 entry:
2094   call swiftcc void @foo2(ptr swifterror %err)
2095   store ptr null, ptr %err
2096   br label %a
2099   %error = load ptr, ptr %err
2100   ret ptr %error