Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / WebAssembly / vararg-frame.ll
blob5c76040325cc94da97e99ab4ea796f5ba3271c64
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -verify-machineinstrs  | FileCheck %s
3 ; REQUIRES: webassembly-registered-target
4 target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20"
5 target triple = "wasm32-unknown-unknown"
7 ; Function Attrs: nounwind
8 define void @pass_s0() {
9 ; CHECK-LABEL: pass_s0:
10 ; CHECK:         .functype pass_s0 () -> ()
11 ; CHECK-NEXT:  # %bb.0: # %entry
12 ; CHECK-NEXT:    i32.const 0
13 ; CHECK-NEXT:    call sink
14 ; CHECK-NEXT:    # fallthrough-return
15 entry:
16   tail call void (...) @sink()
17   ret void
20 declare void @sink(...)
22 ; Function Attrs: nounwind
23 define void @pass_s1(i8 %x.coerce) {
24 ; CHECK-LABEL: pass_s1:
25 ; CHECK:         .functype pass_s1 (i32) -> ()
26 ; CHECK-NEXT:    .local i32
27 ; CHECK-NEXT:  # %bb.0: # %entry
28 ; CHECK-NEXT:    global.get __stack_pointer
29 ; CHECK-NEXT:    i32.const 16
30 ; CHECK-NEXT:    i32.sub
31 ; CHECK-NEXT:    local.tee 1
32 ; CHECK-NEXT:    global.set __stack_pointer
33 ; CHECK-NEXT:    local.get 1
34 ; CHECK-NEXT:    local.get 0
35 ; CHECK-NEXT:    i32.store 0
36 ; CHECK-NEXT:    local.get 1
37 ; CHECK-NEXT:    call sink
38 ; CHECK-NEXT:    local.get 1
39 ; CHECK-NEXT:    i32.const 16
40 ; CHECK-NEXT:    i32.add
41 ; CHECK-NEXT:    global.set __stack_pointer
42 ; CHECK-NEXT:    # fallthrough-return
43 entry:
44   tail call void (...) @sink(i8 %x.coerce)
45   ret void
48 ; Function Attrs: nounwind
49 define void @pass_s2(i16 %x.coerce) {
50 ; CHECK-LABEL: pass_s2:
51 ; CHECK:         .functype pass_s2 (i32) -> ()
52 ; CHECK-NEXT:    .local i32
53 ; CHECK-NEXT:  # %bb.0: # %entry
54 ; CHECK-NEXT:    global.get __stack_pointer
55 ; CHECK-NEXT:    i32.const 16
56 ; CHECK-NEXT:    i32.sub
57 ; CHECK-NEXT:    local.tee 1
58 ; CHECK-NEXT:    global.set __stack_pointer
59 ; CHECK-NEXT:    local.get 1
60 ; CHECK-NEXT:    local.get 0
61 ; CHECK-NEXT:    i32.store 0
62 ; CHECK-NEXT:    local.get 1
63 ; CHECK-NEXT:    call sink
64 ; CHECK-NEXT:    local.get 1
65 ; CHECK-NEXT:    i32.const 16
66 ; CHECK-NEXT:    i32.add
67 ; CHECK-NEXT:    global.set __stack_pointer
68 ; CHECK-NEXT:    # fallthrough-return
69 entry:
70   tail call void (...) @sink(i16 %x.coerce)
71   ret void
74 ; Function Attrs: nounwind
75 define void @pass_s3(i32 %x.coerce) {
76 ; CHECK-LABEL: pass_s3:
77 ; CHECK:         .functype pass_s3 (i32) -> ()
78 ; CHECK-NEXT:    .local i32
79 ; CHECK-NEXT:  # %bb.0: # %entry
80 ; CHECK-NEXT:    global.get __stack_pointer
81 ; CHECK-NEXT:    i32.const 16
82 ; CHECK-NEXT:    i32.sub
83 ; CHECK-NEXT:    local.tee 1
84 ; CHECK-NEXT:    global.set __stack_pointer
85 ; CHECK-NEXT:    local.get 1
86 ; CHECK-NEXT:    local.get 0
87 ; CHECK-NEXT:    i32.store 0
88 ; CHECK-NEXT:    local.get 1
89 ; CHECK-NEXT:    call sink
90 ; CHECK-NEXT:    local.get 1
91 ; CHECK-NEXT:    i32.const 16
92 ; CHECK-NEXT:    i32.add
93 ; CHECK-NEXT:    global.set __stack_pointer
94 ; CHECK-NEXT:    # fallthrough-return
95 entry:
96   tail call void (...) @sink(i32 %x.coerce)
97   ret void
100 ; Function Attrs: nounwind
101 define void @pass_s4(i64 %x.coerce) {
102 ; CHECK-LABEL: pass_s4:
103 ; CHECK:         .functype pass_s4 (i64) -> ()
104 ; CHECK-NEXT:    .local i32
105 ; CHECK-NEXT:  # %bb.0: # %entry
106 ; CHECK-NEXT:    global.get __stack_pointer
107 ; CHECK-NEXT:    i32.const 16
108 ; CHECK-NEXT:    i32.sub
109 ; CHECK-NEXT:    local.tee 1
110 ; CHECK-NEXT:    global.set __stack_pointer
111 ; CHECK-NEXT:    local.get 1
112 ; CHECK-NEXT:    local.get 0
113 ; CHECK-NEXT:    i64.store 0
114 ; CHECK-NEXT:    local.get 1
115 ; CHECK-NEXT:    call sink
116 ; CHECK-NEXT:    local.get 1
117 ; CHECK-NEXT:    i32.const 16
118 ; CHECK-NEXT:    i32.add
119 ; CHECK-NEXT:    global.set __stack_pointer
120 ; CHECK-NEXT:    # fallthrough-return
121 entry:
122   tail call void (...) @sink(i64 %x.coerce)
123   ret void
126 ; Function Attrs: nounwind
127 define void @pass_s5(<4 x i32> noundef %x) {
128 ; CHECK-LABEL: pass_s5:
129 ; CHECK:         .functype pass_s5 (i32, i32, i32, i32) -> ()
130 ; CHECK-NEXT:    .local i32
131 ; CHECK-NEXT:  # %bb.0: # %entry
132 ; CHECK-NEXT:    global.get __stack_pointer
133 ; CHECK-NEXT:    i32.const 16
134 ; CHECK-NEXT:    i32.sub
135 ; CHECK-NEXT:    local.tee 4
136 ; CHECK-NEXT:    global.set __stack_pointer
137 ; CHECK-NEXT:    local.get 4
138 ; CHECK-NEXT:    local.get 3
139 ; CHECK-NEXT:    i32.store 12
140 ; CHECK-NEXT:    local.get 4
141 ; CHECK-NEXT:    local.get 2
142 ; CHECK-NEXT:    i32.store 8
143 ; CHECK-NEXT:    local.get 4
144 ; CHECK-NEXT:    local.get 1
145 ; CHECK-NEXT:    i32.store 4
146 ; CHECK-NEXT:    local.get 4
147 ; CHECK-NEXT:    local.get 0
148 ; CHECK-NEXT:    i32.store 0
149 ; CHECK-NEXT:    local.get 4
150 ; CHECK-NEXT:    call sink
151 ; CHECK-NEXT:    local.get 4
152 ; CHECK-NEXT:    i32.const 16
153 ; CHECK-NEXT:    i32.add
154 ; CHECK-NEXT:    global.set __stack_pointer
155 ; CHECK-NEXT:    # fallthrough-return
156 entry:
157   tail call void (...) @sink(<4 x i32> noundef %x)
158   ret void
161 ; Function Attrs: nounwind
162 define void @pass_int_s0(i32 noundef %i) {
163 ; CHECK-LABEL: pass_int_s0:
164 ; CHECK:         .functype pass_int_s0 (i32) -> ()
165 ; CHECK-NEXT:    .local i32
166 ; CHECK-NEXT:  # %bb.0: # %entry
167 ; CHECK-NEXT:    global.get __stack_pointer
168 ; CHECK-NEXT:    i32.const 16
169 ; CHECK-NEXT:    i32.sub
170 ; CHECK-NEXT:    local.tee 1
171 ; CHECK-NEXT:    global.set __stack_pointer
172 ; CHECK-NEXT:    local.get 1
173 ; CHECK-NEXT:    local.get 0
174 ; CHECK-NEXT:    i32.store 0
175 ; CHECK-NEXT:    local.get 1
176 ; CHECK-NEXT:    call sink
177 ; CHECK-NEXT:    local.get 1
178 ; CHECK-NEXT:    i32.const 16
179 ; CHECK-NEXT:    i32.add
180 ; CHECK-NEXT:    global.set __stack_pointer
181 ; CHECK-NEXT:    # fallthrough-return
182 entry:
183   tail call void (...) @sink(i32 noundef %i)
184   ret void
187 ; Function Attrs: nounwind
188 define void @pass_int_s1(i32 noundef %i, i8 %x.coerce) {
189 ; CHECK-LABEL: pass_int_s1:
190 ; CHECK:         .functype pass_int_s1 (i32, i32) -> ()
191 ; CHECK-NEXT:    .local i32
192 ; CHECK-NEXT:  # %bb.0: # %entry
193 ; CHECK-NEXT:    global.get __stack_pointer
194 ; CHECK-NEXT:    i32.const 16
195 ; CHECK-NEXT:    i32.sub
196 ; CHECK-NEXT:    local.tee 2
197 ; CHECK-NEXT:    global.set __stack_pointer
198 ; CHECK-NEXT:    local.get 2
199 ; CHECK-NEXT:    local.get 1
200 ; CHECK-NEXT:    i32.store 4
201 ; CHECK-NEXT:    local.get 2
202 ; CHECK-NEXT:    local.get 0
203 ; CHECK-NEXT:    i32.store 0
204 ; CHECK-NEXT:    local.get 2
205 ; CHECK-NEXT:    call sink
206 ; CHECK-NEXT:    local.get 2
207 ; CHECK-NEXT:    i32.const 16
208 ; CHECK-NEXT:    i32.add
209 ; CHECK-NEXT:    global.set __stack_pointer
210 ; CHECK-NEXT:    # fallthrough-return
211 entry:
212   tail call void (...) @sink(i32 noundef %i, i8 %x.coerce)
213   ret void
216 ; Function Attrs: nounwind
217 define void @pass_int_s2(i32 noundef %i, i16 %x.coerce) {
218 ; CHECK-LABEL: pass_int_s2:
219 ; CHECK:         .functype pass_int_s2 (i32, i32) -> ()
220 ; CHECK-NEXT:    .local i32
221 ; CHECK-NEXT:  # %bb.0: # %entry
222 ; CHECK-NEXT:    global.get __stack_pointer
223 ; CHECK-NEXT:    i32.const 16
224 ; CHECK-NEXT:    i32.sub
225 ; CHECK-NEXT:    local.tee 2
226 ; CHECK-NEXT:    global.set __stack_pointer
227 ; CHECK-NEXT:    local.get 2
228 ; CHECK-NEXT:    local.get 1
229 ; CHECK-NEXT:    i32.store 4
230 ; CHECK-NEXT:    local.get 2
231 ; CHECK-NEXT:    local.get 0
232 ; CHECK-NEXT:    i32.store 0
233 ; CHECK-NEXT:    local.get 2
234 ; CHECK-NEXT:    call sink
235 ; CHECK-NEXT:    local.get 2
236 ; CHECK-NEXT:    i32.const 16
237 ; CHECK-NEXT:    i32.add
238 ; CHECK-NEXT:    global.set __stack_pointer
239 ; CHECK-NEXT:    # fallthrough-return
240 entry:
241   tail call void (...) @sink(i32 noundef %i, i16 %x.coerce)
242   ret void
245 ; Function Attrs: nounwind
246 define void @pass_int_s3(i32 noundef %i, i32 %x.coerce) {
247 ; CHECK-LABEL: pass_int_s3:
248 ; CHECK:         .functype pass_int_s3 (i32, i32) -> ()
249 ; CHECK-NEXT:    .local i32
250 ; CHECK-NEXT:  # %bb.0: # %entry
251 ; CHECK-NEXT:    global.get __stack_pointer
252 ; CHECK-NEXT:    i32.const 16
253 ; CHECK-NEXT:    i32.sub
254 ; CHECK-NEXT:    local.tee 2
255 ; CHECK-NEXT:    global.set __stack_pointer
256 ; CHECK-NEXT:    local.get 2
257 ; CHECK-NEXT:    local.get 1
258 ; CHECK-NEXT:    i32.store 4
259 ; CHECK-NEXT:    local.get 2
260 ; CHECK-NEXT:    local.get 0
261 ; CHECK-NEXT:    i32.store 0
262 ; CHECK-NEXT:    local.get 2
263 ; CHECK-NEXT:    call sink
264 ; CHECK-NEXT:    local.get 2
265 ; CHECK-NEXT:    i32.const 16
266 ; CHECK-NEXT:    i32.add
267 ; CHECK-NEXT:    global.set __stack_pointer
268 ; CHECK-NEXT:    # fallthrough-return
269 entry:
270   tail call void (...) @sink(i32 noundef %i, i32 %x.coerce)
271   ret void
274 ; Function Attrs: nounwind
275 define void @pass_int_s4(i32 noundef %i, i64 %x.coerce) {
276 ; CHECK-LABEL: pass_int_s4:
277 ; CHECK:         .functype pass_int_s4 (i32, i64) -> ()
278 ; CHECK-NEXT:    .local i32
279 ; CHECK-NEXT:  # %bb.0: # %entry
280 ; CHECK-NEXT:    global.get __stack_pointer
281 ; CHECK-NEXT:    i32.const 16
282 ; CHECK-NEXT:    i32.sub
283 ; CHECK-NEXT:    local.tee 2
284 ; CHECK-NEXT:    global.set __stack_pointer
285 ; CHECK-NEXT:    local.get 2
286 ; CHECK-NEXT:    local.get 1
287 ; CHECK-NEXT:    i64.store 8
288 ; CHECK-NEXT:    local.get 2
289 ; CHECK-NEXT:    local.get 0
290 ; CHECK-NEXT:    i32.store 0
291 ; CHECK-NEXT:    local.get 2
292 ; CHECK-NEXT:    call sink
293 ; CHECK-NEXT:    local.get 2
294 ; CHECK-NEXT:    i32.const 16
295 ; CHECK-NEXT:    i32.add
296 ; CHECK-NEXT:    global.set __stack_pointer
297 ; CHECK-NEXT:    # fallthrough-return
298 entry:
299   tail call void (...) @sink(i32 noundef %i, i64 %x.coerce)
300   ret void
303 ; Function Attrs: nounwind
304 define void @pass_int_s5(i32 noundef %i, <4 x i32> noundef %x) {
305 ; CHECK-LABEL: pass_int_s5:
306 ; CHECK:         .functype pass_int_s5 (i32, i32, i32, i32, i32) -> ()
307 ; CHECK-NEXT:    .local i32
308 ; CHECK-NEXT:  # %bb.0: # %entry
309 ; CHECK-NEXT:    global.get __stack_pointer
310 ; CHECK-NEXT:    i32.const 32
311 ; CHECK-NEXT:    i32.sub
312 ; CHECK-NEXT:    local.tee 5
313 ; CHECK-NEXT:    global.set __stack_pointer
314 ; CHECK-NEXT:    local.get 5
315 ; CHECK-NEXT:    i32.const 28
316 ; CHECK-NEXT:    i32.add
317 ; CHECK-NEXT:    local.get 4
318 ; CHECK-NEXT:    i32.store 0
319 ; CHECK-NEXT:    local.get 5
320 ; CHECK-NEXT:    i32.const 24
321 ; CHECK-NEXT:    i32.add
322 ; CHECK-NEXT:    local.get 3
323 ; CHECK-NEXT:    i32.store 0
324 ; CHECK-NEXT:    local.get 5
325 ; CHECK-NEXT:    i32.const 20
326 ; CHECK-NEXT:    i32.add
327 ; CHECK-NEXT:    local.get 2
328 ; CHECK-NEXT:    i32.store 0
329 ; CHECK-NEXT:    local.get 5
330 ; CHECK-NEXT:    i32.const 16
331 ; CHECK-NEXT:    i32.add
332 ; CHECK-NEXT:    local.get 1
333 ; CHECK-NEXT:    i32.store 0
334 ; CHECK-NEXT:    local.get 5
335 ; CHECK-NEXT:    local.get 0
336 ; CHECK-NEXT:    i32.store 0
337 ; CHECK-NEXT:    local.get 5
338 ; CHECK-NEXT:    call sink
339 ; CHECK-NEXT:    local.get 5
340 ; CHECK-NEXT:    i32.const 32
341 ; CHECK-NEXT:    i32.add
342 ; CHECK-NEXT:    global.set __stack_pointer
343 ; CHECK-NEXT:    # fallthrough-return
344 entry:
345   tail call void (...) @sink(i32 noundef %i, <4 x i32> noundef %x)
346   ret void
349 ; Function Attrs: nounwind
350 define void @pass_asc(i8 %x1.coerce, i16 %x2.coerce, i32 %x3.coerce, i64 %x4.coerce, <4 x i32> noundef %x5) {
351 ; CHECK-LABEL: pass_asc:
352 ; CHECK:         .functype pass_asc (i32, i32, i32, i64, i32, i32, i32, i32) -> ()
353 ; CHECK-NEXT:    .local i32
354 ; CHECK-NEXT:  # %bb.0: # %entry
355 ; CHECK-NEXT:    global.get __stack_pointer
356 ; CHECK-NEXT:    i32.const 48
357 ; CHECK-NEXT:    i32.sub
358 ; CHECK-NEXT:    local.tee 8
359 ; CHECK-NEXT:    global.set __stack_pointer
360 ; CHECK-NEXT:    local.get 8
361 ; CHECK-NEXT:    i32.const 44
362 ; CHECK-NEXT:    i32.add
363 ; CHECK-NEXT:    local.get 7
364 ; CHECK-NEXT:    i32.store 0
365 ; CHECK-NEXT:    local.get 8
366 ; CHECK-NEXT:    i32.const 40
367 ; CHECK-NEXT:    i32.add
368 ; CHECK-NEXT:    local.get 6
369 ; CHECK-NEXT:    i32.store 0
370 ; CHECK-NEXT:    local.get 8
371 ; CHECK-NEXT:    i32.const 36
372 ; CHECK-NEXT:    i32.add
373 ; CHECK-NEXT:    local.get 5
374 ; CHECK-NEXT:    i32.store 0
375 ; CHECK-NEXT:    local.get 8
376 ; CHECK-NEXT:    i32.const 32
377 ; CHECK-NEXT:    i32.add
378 ; CHECK-NEXT:    local.get 4
379 ; CHECK-NEXT:    i32.store 0
380 ; CHECK-NEXT:    local.get 8
381 ; CHECK-NEXT:    i32.const 16
382 ; CHECK-NEXT:    i32.add
383 ; CHECK-NEXT:    local.get 3
384 ; CHECK-NEXT:    i64.store 0
385 ; CHECK-NEXT:    local.get 8
386 ; CHECK-NEXT:    local.get 2
387 ; CHECK-NEXT:    i32.store 8
388 ; CHECK-NEXT:    local.get 8
389 ; CHECK-NEXT:    local.get 1
390 ; CHECK-NEXT:    i32.store 4
391 ; CHECK-NEXT:    local.get 8
392 ; CHECK-NEXT:    local.get 0
393 ; CHECK-NEXT:    i32.store 0
394 ; CHECK-NEXT:    local.get 8
395 ; CHECK-NEXT:    call sink
396 ; CHECK-NEXT:    local.get 8
397 ; CHECK-NEXT:    i32.const 48
398 ; CHECK-NEXT:    i32.add
399 ; CHECK-NEXT:    global.set __stack_pointer
400 ; CHECK-NEXT:    # fallthrough-return
401 entry:
402   tail call void (...) @sink(i8 %x1.coerce, i16 %x2.coerce, i32 %x3.coerce, i64 %x4.coerce, <4 x i32> noundef %x5)
403   ret void
406 ; Function Attrs: nounwind
407 define void @pass_dsc(<4 x i32> noundef %x0, i64 %x1.coerce, i32 %x2.coerce, i16 %x3.coerce, i8 %x4.coerce) {
408 ; CHECK-LABEL: pass_dsc:
409 ; CHECK:         .functype pass_dsc (i32, i32, i32, i32, i64, i32, i32, i32) -> ()
410 ; CHECK-NEXT:    .local i32
411 ; CHECK-NEXT:  # %bb.0: # %entry
412 ; CHECK-NEXT:    global.get __stack_pointer
413 ; CHECK-NEXT:    i32.const 48
414 ; CHECK-NEXT:    i32.sub
415 ; CHECK-NEXT:    local.tee 8
416 ; CHECK-NEXT:    global.set __stack_pointer
417 ; CHECK-NEXT:    local.get 8
418 ; CHECK-NEXT:    i32.const 32
419 ; CHECK-NEXT:    i32.add
420 ; CHECK-NEXT:    local.get 7
421 ; CHECK-NEXT:    i32.store 0
422 ; CHECK-NEXT:    local.get 8
423 ; CHECK-NEXT:    i32.const 28
424 ; CHECK-NEXT:    i32.add
425 ; CHECK-NEXT:    local.get 6
426 ; CHECK-NEXT:    i32.store 0
427 ; CHECK-NEXT:    local.get 8
428 ; CHECK-NEXT:    i32.const 24
429 ; CHECK-NEXT:    i32.add
430 ; CHECK-NEXT:    local.get 5
431 ; CHECK-NEXT:    i32.store 0
432 ; CHECK-NEXT:    local.get 8
433 ; CHECK-NEXT:    i32.const 16
434 ; CHECK-NEXT:    i32.add
435 ; CHECK-NEXT:    local.get 4
436 ; CHECK-NEXT:    i64.store 0
437 ; CHECK-NEXT:    local.get 8
438 ; CHECK-NEXT:    local.get 3
439 ; CHECK-NEXT:    i32.store 12
440 ; CHECK-NEXT:    local.get 8
441 ; CHECK-NEXT:    local.get 2
442 ; CHECK-NEXT:    i32.store 8
443 ; CHECK-NEXT:    local.get 8
444 ; CHECK-NEXT:    local.get 1
445 ; CHECK-NEXT:    i32.store 4
446 ; CHECK-NEXT:    local.get 8
447 ; CHECK-NEXT:    local.get 0
448 ; CHECK-NEXT:    i32.store 0
449 ; CHECK-NEXT:    local.get 8
450 ; CHECK-NEXT:    call sink
451 ; CHECK-NEXT:    local.get 8
452 ; CHECK-NEXT:    i32.const 48
453 ; CHECK-NEXT:    i32.add
454 ; CHECK-NEXT:    global.set __stack_pointer
455 ; CHECK-NEXT:    # fallthrough-return
456 entry:
457   tail call void (...) @sink(<4 x i32> noundef %x0, i64 %x1.coerce, i32 %x2.coerce, i16 %x3.coerce, i8 %x4.coerce)
458   ret void
461 ; Function Attrs: nounwind
462 define void @pass_multiple(i32 noundef %i, i8 %x1.coerce, i16 %x2.coerce, i32 %x3.coerce, i64 %x4.coerce, <4 x i32> noundef %x5) {
463 ; CHECK-LABEL: pass_multiple:
464 ; CHECK:         .functype pass_multiple (i32, i32, i32, i32, i64, i32, i32, i32, i32) -> ()
465 ; CHECK-NEXT:    .local i32
466 ; CHECK-NEXT:  # %bb.0: # %entry
467 ; CHECK-NEXT:    global.get __stack_pointer
468 ; CHECK-NEXT:    i32.const 48
469 ; CHECK-NEXT:    i32.sub
470 ; CHECK-NEXT:    local.tee 9
471 ; CHECK-NEXT:    global.set __stack_pointer
472 ; CHECK-NEXT:    local.get 9
473 ; CHECK-NEXT:    local.get 4
474 ; CHECK-NEXT:    i64.store 40
475 ; CHECK-NEXT:    local.get 9
476 ; CHECK-NEXT:    local.get 2
477 ; CHECK-NEXT:    i32.store 36
478 ; CHECK-NEXT:    local.get 9
479 ; CHECK-NEXT:    local.get 0
480 ; CHECK-NEXT:    i32.store 32
481 ; CHECK-NEXT:    local.get 9
482 ; CHECK-NEXT:    i32.const 32
483 ; CHECK-NEXT:    i32.add
484 ; CHECK-NEXT:    call sink
485 ; CHECK-NEXT:    local.get 9
486 ; CHECK-NEXT:    i32.const 28
487 ; CHECK-NEXT:    i32.add
488 ; CHECK-NEXT:    local.get 8
489 ; CHECK-NEXT:    i32.store 0
490 ; CHECK-NEXT:    local.get 9
491 ; CHECK-NEXT:    i32.const 24
492 ; CHECK-NEXT:    i32.add
493 ; CHECK-NEXT:    local.get 7
494 ; CHECK-NEXT:    i32.store 0
495 ; CHECK-NEXT:    local.get 9
496 ; CHECK-NEXT:    i32.const 20
497 ; CHECK-NEXT:    i32.add
498 ; CHECK-NEXT:    local.get 6
499 ; CHECK-NEXT:    i32.store 0
500 ; CHECK-NEXT:    local.get 9
501 ; CHECK-NEXT:    i32.const 16
502 ; CHECK-NEXT:    i32.add
503 ; CHECK-NEXT:    local.get 5
504 ; CHECK-NEXT:    i32.store 0
505 ; CHECK-NEXT:    local.get 9
506 ; CHECK-NEXT:    local.get 3
507 ; CHECK-NEXT:    i32.store 8
508 ; CHECK-NEXT:    local.get 9
509 ; CHECK-NEXT:    local.get 1
510 ; CHECK-NEXT:    i32.store 4
511 ; CHECK-NEXT:    local.get 9
512 ; CHECK-NEXT:    local.get 0
513 ; CHECK-NEXT:    i32.store 0
514 ; CHECK-NEXT:    local.get 9
515 ; CHECK-NEXT:    call sink
516 ; CHECK-NEXT:    local.get 9
517 ; CHECK-NEXT:    i32.const 48
518 ; CHECK-NEXT:    i32.add
519 ; CHECK-NEXT:    global.set __stack_pointer
520 ; CHECK-NEXT:    # fallthrough-return
521 entry:
522   tail call void (...) @sink(i32 noundef %i, i16 %x2.coerce, i64 %x4.coerce)
523   tail call void (...) @sink(i32 noundef %i, i8 %x1.coerce, i32 %x3.coerce, <4 x i32> noundef %x5)
524   ret void