1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; NOTE: Test functions have been generated by multivalue-stackify.py.
3
4; RUN: llc < %s -verify-machineinstrs -mattr=+multivalue | FileCheck %s
5
6; Test that the multivalue stackification works
7
8target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
9target triple = "wasm32-unknown-unknown"
10
11declare {i32} @op_0_to_1()
12declare {i32, i32} @op_0_to_2()
13declare {i32, i32, i32} @op_0_to_3()
14declare void @op_1_to_0(i32 %t0)
15declare {i32} @op_1_to_1(i32 %t0)
16declare {i32, i32} @op_1_to_2(i32 %t0)
17declare {i32, i32, i32} @op_1_to_3(i32 %t0)
18declare void @op_2_to_0(i32 %t0, i32 %t1)
19declare {i32} @op_2_to_1(i32 %t0, i32 %t1)
20declare {i32, i32} @op_2_to_2(i32 %t0, i32 %t1)
21declare {i32, i32, i32} @op_2_to_3(i32 %t0, i32 %t1)
22
23define void @f2() {
24; CHECK-LABEL: f2:
25; CHECK:         .functype f2 () -> ()
26; CHECK-NEXT:  # %bb.0:
27; CHECK-NEXT:    call op_0_to_2
28; CHECK-NEXT:    drop
29; CHECK-NEXT:    drop
30; CHECK-NEXT:    # fallthrough-return
31  %t0 = call {i32, i32} @op_0_to_2()
32  ret void
33}
34
35define void @f3() {
36; CHECK-LABEL: f3:
37; CHECK:         .functype f3 () -> ()
38; CHECK-NEXT:  # %bb.0:
39; CHECK-NEXT:    call op_0_to_3
40; CHECK-NEXT:    drop
41; CHECK-NEXT:    drop
42; CHECK-NEXT:    drop
43; CHECK-NEXT:    # fallthrough-return
44  %t0 = call {i32, i32, i32} @op_0_to_3()
45  ret void
46}
47
48define void @f12() {
49; CHECK-LABEL: f12:
50; CHECK:         .functype f12 () -> ()
51; CHECK-NEXT:  # %bb.0:
52; CHECK-NEXT:    call op_0_to_2
53; CHECK-NEXT:    drop
54; CHECK-NEXT:    call op_1_to_0
55; CHECK-NEXT:    # fallthrough-return
56  %t0 = call {i32, i32} @op_0_to_2()
57  %t1 = extractvalue {i32, i32} %t0, 0
58  call void @op_1_to_0(i32 %t1)
59  ret void
60}
61
62define void @f13() {
63; CHECK-LABEL: f13:
64; CHECK:         .functype f13 () -> ()
65; CHECK-NEXT:    .local i32
66; CHECK-NEXT:  # %bb.0:
67; CHECK-NEXT:    call op_0_to_2
68; CHECK-NEXT:    local.set 0
69; CHECK-NEXT:    drop
70; CHECK-NEXT:    local.get 0
71; CHECK-NEXT:    call op_1_to_0
72; CHECK-NEXT:    # fallthrough-return
73  %t0 = call {i32, i32} @op_0_to_2()
74  %t1 = extractvalue {i32, i32} %t0, 1
75  call void @op_1_to_0(i32 %t1)
76  ret void
77}
78
79define void @f14() {
80; CHECK-LABEL: f14:
81; CHECK:         .functype f14 () -> ()
82; CHECK-NEXT:    .local i32
83; CHECK-NEXT:  # %bb.0:
84; CHECK-NEXT:    call op_0_to_2
85; CHECK-NEXT:    drop
86; CHECK-NEXT:    local.tee 0
87; CHECK-NEXT:    local.get 0
88; CHECK-NEXT:    call op_2_to_0
89; CHECK-NEXT:    # fallthrough-return
90  %t0 = call {i32, i32} @op_0_to_2()
91  %t1 = extractvalue {i32, i32} %t0, 0
92  %t2 = extractvalue {i32, i32} %t0, 0
93  call void @op_2_to_0(i32 %t1, i32 %t2)
94  ret void
95}
96
97define void @f15() {
98; CHECK-LABEL: f15:
99; CHECK:         .functype f15 () -> ()
100; CHECK-NEXT:  # %bb.0:
101; CHECK-NEXT:    call op_0_to_2
102; CHECK-NEXT:    call op_2_to_0
103; CHECK-NEXT:    # fallthrough-return
104  %t0 = call {i32, i32} @op_0_to_2()
105  %t1 = extractvalue {i32, i32} %t0, 0
106  %t2 = extractvalue {i32, i32} %t0, 1
107  call void @op_2_to_0(i32 %t1, i32 %t2)
108  ret void
109}
110
111define void @f16() {
112; CHECK-LABEL: f16:
113; CHECK:         .functype f16 () -> ()
114; CHECK-NEXT:    .local i32, i32
115; CHECK-NEXT:  # %bb.0:
116; CHECK-NEXT:    call op_0_to_2
117; CHECK-NEXT:    local.set 1
118; CHECK-NEXT:    local.set 0
119; CHECK-NEXT:    local.get 1
120; CHECK-NEXT:    local.get 0
121; CHECK-NEXT:    call op_2_to_0
122; CHECK-NEXT:    # fallthrough-return
123  %t0 = call {i32, i32} @op_0_to_2()
124  %t1 = extractvalue {i32, i32} %t0, 1
125  %t2 = extractvalue {i32, i32} %t0, 0
126  call void @op_2_to_0(i32 %t1, i32 %t2)
127  ret void
128}
129
130define void @f17() {
131; CHECK-LABEL: f17:
132; CHECK:         .functype f17 () -> ()
133; CHECK-NEXT:    .local i32
134; CHECK-NEXT:  # %bb.0:
135; CHECK-NEXT:    call op_0_to_2
136; CHECK-NEXT:    local.set 0
137; CHECK-NEXT:    drop
138; CHECK-NEXT:    local.get 0
139; CHECK-NEXT:    local.get 0
140; CHECK-NEXT:    call op_2_to_0
141; CHECK-NEXT:    # fallthrough-return
142  %t0 = call {i32, i32} @op_0_to_2()
143  %t1 = extractvalue {i32, i32} %t0, 1
144  %t2 = extractvalue {i32, i32} %t0, 1
145  call void @op_2_to_0(i32 %t1, i32 %t2)
146  ret void
147}
148
149define void @f25() {
150; CHECK-LABEL: f25:
151; CHECK:         .functype f25 () -> ()
152; CHECK-NEXT:  # %bb.0:
153; CHECK-NEXT:    call op_0_to_3
154; CHECK-NEXT:    drop
155; CHECK-NEXT:    drop
156; CHECK-NEXT:    call op_1_to_0
157; CHECK-NEXT:    # fallthrough-return
158  %t0 = call {i32, i32, i32} @op_0_to_3()
159  %t1 = extractvalue {i32, i32, i32} %t0, 0
160  call void @op_1_to_0(i32 %t1)
161  ret void
162}
163
164define void @f26() {
165; CHECK-LABEL: f26:
166; CHECK:         .functype f26 () -> ()
167; CHECK-NEXT:    .local i32
168; CHECK-NEXT:  # %bb.0:
169; CHECK-NEXT:    call op_0_to_3
170; CHECK-NEXT:    drop
171; CHECK-NEXT:    local.set 0
172; CHECK-NEXT:    drop
173; CHECK-NEXT:    local.get 0
174; CHECK-NEXT:    call op_1_to_0
175; CHECK-NEXT:    # fallthrough-return
176  %t0 = call {i32, i32, i32} @op_0_to_3()
177  %t1 = extractvalue {i32, i32, i32} %t0, 1
178  call void @op_1_to_0(i32 %t1)
179  ret void
180}
181
182define void @f27() {
183; CHECK-LABEL: f27:
184; CHECK:         .functype f27 () -> ()
185; CHECK-NEXT:    .local i32
186; CHECK-NEXT:  # %bb.0:
187; CHECK-NEXT:    call op_0_to_3
188; CHECK-NEXT:    local.set 0
189; CHECK-NEXT:    drop
190; CHECK-NEXT:    drop
191; CHECK-NEXT:    local.get 0
192; CHECK-NEXT:    call op_1_to_0
193; CHECK-NEXT:    # fallthrough-return
194  %t0 = call {i32, i32, i32} @op_0_to_3()
195  %t1 = extractvalue {i32, i32, i32} %t0, 2
196  call void @op_1_to_0(i32 %t1)
197  ret void
198}
199
200define void @f28() {
201; CHECK-LABEL: f28:
202; CHECK:         .functype f28 () -> ()
203; CHECK-NEXT:    .local i32
204; CHECK-NEXT:  # %bb.0:
205; CHECK-NEXT:    call op_0_to_3
206; CHECK-NEXT:    drop
207; CHECK-NEXT:    drop
208; CHECK-NEXT:    local.tee 0
209; CHECK-NEXT:    local.get 0
210; CHECK-NEXT:    call op_2_to_0
211; CHECK-NEXT:    # fallthrough-return
212  %t0 = call {i32, i32, i32} @op_0_to_3()
213  %t1 = extractvalue {i32, i32, i32} %t0, 0
214  %t2 = extractvalue {i32, i32, i32} %t0, 0
215  call void @op_2_to_0(i32 %t1, i32 %t2)
216  ret void
217}
218
219define void @f29() {
220; CHECK-LABEL: f29:
221; CHECK:         .functype f29 () -> ()
222; CHECK-NEXT:  # %bb.0:
223; CHECK-NEXT:    call op_0_to_3
224; CHECK-NEXT:    drop
225; CHECK-NEXT:    call op_2_to_0
226; CHECK-NEXT:    # fallthrough-return
227  %t0 = call {i32, i32, i32} @op_0_to_3()
228  %t1 = extractvalue {i32, i32, i32} %t0, 0
229  %t2 = extractvalue {i32, i32, i32} %t0, 1
230  call void @op_2_to_0(i32 %t1, i32 %t2)
231  ret void
232}
233
234define void @f30() {
235; CHECK-LABEL: f30:
236; CHECK:         .functype f30 () -> ()
237; CHECK-NEXT:    .local i32
238; CHECK-NEXT:  # %bb.0:
239; CHECK-NEXT:    call op_0_to_3
240; CHECK-NEXT:    local.set 0
241; CHECK-NEXT:    drop
242; CHECK-NEXT:    local.get 0
243; CHECK-NEXT:    call op_2_to_0
244; CHECK-NEXT:    # fallthrough-return
245  %t0 = call {i32, i32, i32} @op_0_to_3()
246  %t1 = extractvalue {i32, i32, i32} %t0, 0
247  %t2 = extractvalue {i32, i32, i32} %t0, 2
248  call void @op_2_to_0(i32 %t1, i32 %t2)
249  ret void
250}
251
252define void @f31() {
253; CHECK-LABEL: f31:
254; CHECK:         .functype f31 () -> ()
255; CHECK-NEXT:    .local i32, i32
256; CHECK-NEXT:  # %bb.0:
257; CHECK-NEXT:    call op_0_to_3
258; CHECK-NEXT:    drop
259; CHECK-NEXT:    local.set 1
260; CHECK-NEXT:    local.set 0
261; CHECK-NEXT:    local.get 1
262; CHECK-NEXT:    local.get 0
263; CHECK-NEXT:    call op_2_to_0
264; CHECK-NEXT:    # fallthrough-return
265  %t0 = call {i32, i32, i32} @op_0_to_3()
266  %t1 = extractvalue {i32, i32, i32} %t0, 1
267  %t2 = extractvalue {i32, i32, i32} %t0, 0
268  call void @op_2_to_0(i32 %t1, i32 %t2)
269  ret void
270}
271
272define void @f32() {
273; CHECK-LABEL: f32:
274; CHECK:         .functype f32 () -> ()
275; CHECK-NEXT:    .local i32
276; CHECK-NEXT:  # %bb.0:
277; CHECK-NEXT:    call op_0_to_3
278; CHECK-NEXT:    drop
279; CHECK-NEXT:    local.set 0
280; CHECK-NEXT:    drop
281; CHECK-NEXT:    local.get 0
282; CHECK-NEXT:    local.get 0
283; CHECK-NEXT:    call op_2_to_0
284; CHECK-NEXT:    # fallthrough-return
285  %t0 = call {i32, i32, i32} @op_0_to_3()
286  %t1 = extractvalue {i32, i32, i32} %t0, 1
287  %t2 = extractvalue {i32, i32, i32} %t0, 1
288  call void @op_2_to_0(i32 %t1, i32 %t2)
289  ret void
290}
291
292define void @f33() {
293; CHECK-LABEL: f33:
294; CHECK:         .functype f33 () -> ()
295; CHECK-NEXT:    .local i32, i32
296; CHECK-NEXT:  # %bb.0:
297; CHECK-NEXT:    call op_0_to_3
298; CHECK-NEXT:    local.set 1
299; CHECK-NEXT:    local.set 0
300; CHECK-NEXT:    drop
301; CHECK-NEXT:    local.get 0
302; CHECK-NEXT:    local.get 1
303; CHECK-NEXT:    call op_2_to_0
304; CHECK-NEXT:    # fallthrough-return
305  %t0 = call {i32, i32, i32} @op_0_to_3()
306  %t1 = extractvalue {i32, i32, i32} %t0, 1
307  %t2 = extractvalue {i32, i32, i32} %t0, 2
308  call void @op_2_to_0(i32 %t1, i32 %t2)
309  ret void
310}
311
312define void @f34() {
313; CHECK-LABEL: f34:
314; CHECK:         .functype f34 () -> ()
315; CHECK-NEXT:    .local i32, i32
316; CHECK-NEXT:  # %bb.0:
317; CHECK-NEXT:    call op_0_to_3
318; CHECK-NEXT:    local.set 1
319; CHECK-NEXT:    drop
320; CHECK-NEXT:    local.set 0
321; CHECK-NEXT:    local.get 1
322; CHECK-NEXT:    local.get 0
323; CHECK-NEXT:    call op_2_to_0
324; CHECK-NEXT:    # fallthrough-return
325  %t0 = call {i32, i32, i32} @op_0_to_3()
326  %t1 = extractvalue {i32, i32, i32} %t0, 2
327  %t2 = extractvalue {i32, i32, i32} %t0, 0
328  call void @op_2_to_0(i32 %t1, i32 %t2)
329  ret void
330}
331
332define void @f35() {
333; CHECK-LABEL: f35:
334; CHECK:         .functype f35 () -> ()
335; CHECK-NEXT:    .local i32, i32
336; CHECK-NEXT:  # %bb.0:
337; CHECK-NEXT:    call op_0_to_3
338; CHECK-NEXT:    local.set 1
339; CHECK-NEXT:    local.set 0
340; CHECK-NEXT:    drop
341; CHECK-NEXT:    local.get 1
342; CHECK-NEXT:    local.get 0
343; CHECK-NEXT:    call op_2_to_0
344; CHECK-NEXT:    # fallthrough-return
345  %t0 = call {i32, i32, i32} @op_0_to_3()
346  %t1 = extractvalue {i32, i32, i32} %t0, 2
347  %t2 = extractvalue {i32, i32, i32} %t0, 1
348  call void @op_2_to_0(i32 %t1, i32 %t2)
349  ret void
350}
351
352define void @f36() {
353; CHECK-LABEL: f36:
354; CHECK:         .functype f36 () -> ()
355; CHECK-NEXT:    .local i32
356; CHECK-NEXT:  # %bb.0:
357; CHECK-NEXT:    call op_0_to_3
358; CHECK-NEXT:    local.set 0
359; CHECK-NEXT:    drop
360; CHECK-NEXT:    drop
361; CHECK-NEXT:    local.get 0
362; CHECK-NEXT:    local.get 0
363; CHECK-NEXT:    call op_2_to_0
364; CHECK-NEXT:    # fallthrough-return
365  %t0 = call {i32, i32, i32} @op_0_to_3()
366  %t1 = extractvalue {i32, i32, i32} %t0, 2
367  %t2 = extractvalue {i32, i32, i32} %t0, 2
368  call void @op_2_to_0(i32 %t1, i32 %t2)
369  ret void
370}
371
372define void @f129() {
373; CHECK-LABEL: f129:
374; CHECK:         .functype f129 () -> ()
375; CHECK-NEXT:    .local i32
376; CHECK-NEXT:  # %bb.0:
377; CHECK-NEXT:    call op_0_to_2
378; CHECK-NEXT:    local.set 0
379; CHECK-NEXT:    call op_1_to_0
380; CHECK-NEXT:    local.get 0
381; CHECK-NEXT:    call op_1_to_0
382; CHECK-NEXT:    # fallthrough-return
383  %t0 = call {i32, i32} @op_0_to_2()
384  %t1 = extractvalue {i32, i32} %t0, 0
385  call void @op_1_to_0(i32 %t1)
386  %t2 = extractvalue {i32, i32} %t0, 1
387  call void @op_1_to_0(i32 %t2)
388  ret void
389}
390
391define void @f131() {
392; CHECK-LABEL: f131:
393; CHECK:         .functype f131 () -> ()
394; CHECK-NEXT:    .local i32, i32
395; CHECK-NEXT:  # %bb.0:
396; CHECK-NEXT:    call op_0_to_2
397; CHECK-NEXT:    local.set 0
398; CHECK-NEXT:    local.tee 1
399; CHECK-NEXT:    call op_1_to_0
400; CHECK-NEXT:    local.get 1
401; CHECK-NEXT:    local.get 0
402; CHECK-NEXT:    call op_2_to_0
403; CHECK-NEXT:    # fallthrough-return
404  %t0 = call {i32, i32} @op_0_to_2()
405  %t1 = extractvalue {i32, i32} %t0, 0
406  call void @op_1_to_0(i32 %t1)
407  %t2 = extractvalue {i32, i32} %t0, 0
408  %t3 = extractvalue {i32, i32} %t0, 1
409  call void @op_2_to_0(i32 %t2, i32 %t3)
410  ret void
411}
412
413define void @f132() {
414; CHECK-LABEL: f132:
415; CHECK:         .functype f132 () -> ()
416; CHECK-NEXT:    .local i32, i32
417; CHECK-NEXT:  # %bb.0:
418; CHECK-NEXT:    call op_0_to_2
419; CHECK-NEXT:    local.set 0
420; CHECK-NEXT:    local.tee 1
421; CHECK-NEXT:    call op_1_to_0
422; CHECK-NEXT:    local.get 0
423; CHECK-NEXT:    local.get 1
424; CHECK-NEXT:    call op_2_to_0
425; CHECK-NEXT:    # fallthrough-return
426  %t0 = call {i32, i32} @op_0_to_2()
427  %t1 = extractvalue {i32, i32} %t0, 0
428  call void @op_1_to_0(i32 %t1)
429  %t2 = extractvalue {i32, i32} %t0, 1
430  %t3 = extractvalue {i32, i32} %t0, 0
431  call void @op_2_to_0(i32 %t2, i32 %t3)
432  ret void
433}
434
435define void @f133() {
436; CHECK-LABEL: f133:
437; CHECK:         .functype f133 () -> ()
438; CHECK-NEXT:    .local i32
439; CHECK-NEXT:  # %bb.0:
440; CHECK-NEXT:    call op_0_to_2
441; CHECK-NEXT:    local.set 0
442; CHECK-NEXT:    call op_1_to_0
443; CHECK-NEXT:    local.get 0
444; CHECK-NEXT:    local.get 0
445; CHECK-NEXT:    call op_2_to_0
446; CHECK-NEXT:    # fallthrough-return
447  %t0 = call {i32, i32} @op_0_to_2()
448  %t1 = extractvalue {i32, i32} %t0, 0
449  call void @op_1_to_0(i32 %t1)
450  %t2 = extractvalue {i32, i32} %t0, 1
451  %t3 = extractvalue {i32, i32} %t0, 1
452  call void @op_2_to_0(i32 %t2, i32 %t3)
453  ret void
454}
455
456define void @f141() {
457; CHECK-LABEL: f141:
458; CHECK:         .functype f141 () -> ()
459; CHECK-NEXT:    .local i32, i32
460; CHECK-NEXT:  # %bb.0:
461; CHECK-NEXT:    call op_0_to_2
462; CHECK-NEXT:    local.set 1
463; CHECK-NEXT:    local.set 0
464; CHECK-NEXT:    local.get 1
465; CHECK-NEXT:    call op_1_to_0
466; CHECK-NEXT:    local.get 0
467; CHECK-NEXT:    call op_1_to_0
468; CHECK-NEXT:    # fallthrough-return
469  %t0 = call {i32, i32} @op_0_to_2()
470  %t1 = extractvalue {i32, i32} %t0, 1
471  call void @op_1_to_0(i32 %t1)
472  %t2 = extractvalue {i32, i32} %t0, 0
473  call void @op_1_to_0(i32 %t2)
474  ret void
475}
476
477define void @f143() {
478; CHECK-LABEL: f143:
479; CHECK:         .functype f143 () -> ()
480; CHECK-NEXT:    .local i32, i32
481; CHECK-NEXT:  # %bb.0:
482; CHECK-NEXT:    call op_0_to_2
483; CHECK-NEXT:    local.set 1
484; CHECK-NEXT:    local.set 0
485; CHECK-NEXT:    local.get 1
486; CHECK-NEXT:    call op_1_to_0
487; CHECK-NEXT:    local.get 0
488; CHECK-NEXT:    local.get 0
489; CHECK-NEXT:    call op_2_to_0
490; CHECK-NEXT:    # fallthrough-return
491  %t0 = call {i32, i32} @op_0_to_2()
492  %t1 = extractvalue {i32, i32} %t0, 1
493  call void @op_1_to_0(i32 %t1)
494  %t2 = extractvalue {i32, i32} %t0, 0
495  %t3 = extractvalue {i32, i32} %t0, 0
496  call void @op_2_to_0(i32 %t2, i32 %t3)
497  ret void
498}
499
500define void @f144() {
501; CHECK-LABEL: f144:
502; CHECK:         .functype f144 () -> ()
503; CHECK-NEXT:    .local i32, i32
504; CHECK-NEXT:  # %bb.0:
505; CHECK-NEXT:    call op_0_to_2
506; CHECK-NEXT:    local.set 1
507; CHECK-NEXT:    local.set 0
508; CHECK-NEXT:    local.get 1
509; CHECK-NEXT:    call op_1_to_0
510; CHECK-NEXT:    local.get 0
511; CHECK-NEXT:    local.get 1
512; CHECK-NEXT:    call op_2_to_0
513; CHECK-NEXT:    # fallthrough-return
514  %t0 = call {i32, i32} @op_0_to_2()
515  %t1 = extractvalue {i32, i32} %t0, 1
516  call void @op_1_to_0(i32 %t1)
517  %t2 = extractvalue {i32, i32} %t0, 0
518  %t3 = extractvalue {i32, i32} %t0, 1
519  call void @op_2_to_0(i32 %t2, i32 %t3)
520  ret void
521}
522
523define void @f145() {
524; CHECK-LABEL: f145:
525; CHECK:         .functype f145 () -> ()
526; CHECK-NEXT:    .local i32, i32
527; CHECK-NEXT:  # %bb.0:
528; CHECK-NEXT:    call op_0_to_2
529; CHECK-NEXT:    local.set 1
530; CHECK-NEXT:    local.set 0
531; CHECK-NEXT:    local.get 1
532; CHECK-NEXT:    call op_1_to_0
533; CHECK-NEXT:    local.get 1
534; CHECK-NEXT:    local.get 0
535; CHECK-NEXT:    call op_2_to_0
536; CHECK-NEXT:    # fallthrough-return
537  %t0 = call {i32, i32} @op_0_to_2()
538  %t1 = extractvalue {i32, i32} %t0, 1
539  call void @op_1_to_0(i32 %t1)
540  %t2 = extractvalue {i32, i32} %t0, 1
541  %t3 = extractvalue {i32, i32} %t0, 0
542  call void @op_2_to_0(i32 %t2, i32 %t3)
543  ret void
544}
545
546define void @f155() {
547; CHECK-LABEL: f155:
548; CHECK:         .functype f155 () -> ()
549; CHECK-NEXT:    .local i32, i32
550; CHECK-NEXT:  # %bb.0:
551; CHECK-NEXT:    call op_0_to_2
552; CHECK-NEXT:    local.set 0
553; CHECK-NEXT:    local.tee 1
554; CHECK-NEXT:    local.get 1
555; CHECK-NEXT:    call op_2_to_0
556; CHECK-NEXT:    local.get 0
557; CHECK-NEXT:    call op_1_to_0
558; CHECK-NEXT:    # fallthrough-return
559  %t0 = call {i32, i32} @op_0_to_2()
560  %t1 = extractvalue {i32, i32} %t0, 0
561  %t2 = extractvalue {i32, i32} %t0, 0
562  call void @op_2_to_0(i32 %t1, i32 %t2)
563  %t3 = extractvalue {i32, i32} %t0, 1
564  call void @op_1_to_0(i32 %t3)
565  ret void
566}
567
568define void @f159() {
569; CHECK-LABEL: f159:
570; CHECK:         .functype f159 () -> ()
571; CHECK-NEXT:    .local i32, i32
572; CHECK-NEXT:  # %bb.0:
573; CHECK-NEXT:    call op_0_to_2
574; CHECK-NEXT:    local.set 0
575; CHECK-NEXT:    local.tee 1
576; CHECK-NEXT:    local.get 1
577; CHECK-NEXT:    call op_2_to_0
578; CHECK-NEXT:    local.get 0
579; CHECK-NEXT:    local.get 0
580; CHECK-NEXT:    call op_2_to_0
581; CHECK-NEXT:    # fallthrough-return
582  %t0 = call {i32, i32} @op_0_to_2()
583  %t1 = extractvalue {i32, i32} %t0, 0
584  %t2 = extractvalue {i32, i32} %t0, 0
585  call void @op_2_to_0(i32 %t1, i32 %t2)
586  %t3 = extractvalue {i32, i32} %t0, 1
587  %t4 = extractvalue {i32, i32} %t0, 1
588  call void @op_2_to_0(i32 %t3, i32 %t4)
589  ret void
590}
591
592define void @f167() {
593; CHECK-LABEL: f167:
594; CHECK:         .functype f167 () -> ()
595; CHECK-NEXT:    .local i32, i32
596; CHECK-NEXT:  # %bb.0:
597; CHECK-NEXT:    call op_0_to_2
598; CHECK-NEXT:    local.set 0
599; CHECK-NEXT:    local.tee 1
600; CHECK-NEXT:    local.get 0
601; CHECK-NEXT:    call op_2_to_0
602; CHECK-NEXT:    local.get 1
603; CHECK-NEXT:    call op_1_to_0
604; CHECK-NEXT:    # fallthrough-return
605  %t0 = call {i32, i32} @op_0_to_2()
606  %t1 = extractvalue {i32, i32} %t0, 0
607  %t2 = extractvalue {i32, i32} %t0, 1
608  call void @op_2_to_0(i32 %t1, i32 %t2)
609  %t3 = extractvalue {i32, i32} %t0, 0
610  call void @op_1_to_0(i32 %t3)
611  ret void
612}
613
614define void @f168() {
615; CHECK-LABEL: f168:
616; CHECK:         .functype f168 () -> ()
617; CHECK-NEXT:    .local i32
618; CHECK-NEXT:  # %bb.0:
619; CHECK-NEXT:    call op_0_to_2
620; CHECK-NEXT:    local.set 0
621; CHECK-NEXT:    local.get 0
622; CHECK-NEXT:    call op_2_to_0
623; CHECK-NEXT:    local.get 0
624; CHECK-NEXT:    call op_1_to_0
625; CHECK-NEXT:    # fallthrough-return
626  %t0 = call {i32, i32} @op_0_to_2()
627  %t1 = extractvalue {i32, i32} %t0, 0
628  %t2 = extractvalue {i32, i32} %t0, 1
629  call void @op_2_to_0(i32 %t1, i32 %t2)
630  %t3 = extractvalue {i32, i32} %t0, 1
631  call void @op_1_to_0(i32 %t3)
632  ret void
633}
634
635define void @f171() {
636; CHECK-LABEL: f171:
637; CHECK:         .functype f171 () -> ()
638; CHECK-NEXT:    .local i32, i32
639; CHECK-NEXT:  # %bb.0:
640; CHECK-NEXT:    call op_0_to_2
641; CHECK-NEXT:    local.set 0
642; CHECK-NEXT:    local.tee 1
643; CHECK-NEXT:    local.get 0
644; CHECK-NEXT:    call op_2_to_0
645; CHECK-NEXT:    local.get 0
646; CHECK-NEXT:    local.get 1
647; CHECK-NEXT:    call op_2_to_0
648; CHECK-NEXT:    # fallthrough-return
649  %t0 = call {i32, i32} @op_0_to_2()
650  %t1 = extractvalue {i32, i32} %t0, 0
651  %t2 = extractvalue {i32, i32} %t0, 1
652  call void @op_2_to_0(i32 %t1, i32 %t2)
653  %t3 = extractvalue {i32, i32} %t0, 1
654  %t4 = extractvalue {i32, i32} %t0, 0
655  call void @op_2_to_0(i32 %t3, i32 %t4)
656  ret void
657}
658
659define void @f180() {
660; CHECK-LABEL: f180:
661; CHECK:         .functype f180 () -> ()
662; CHECK-NEXT:    .local i32, i32
663; CHECK-NEXT:  # %bb.0:
664; CHECK-NEXT:    call op_0_to_2
665; CHECK-NEXT:    local.set 1
666; CHECK-NEXT:    local.set 0
667; CHECK-NEXT:    local.get 1
668; CHECK-NEXT:    local.get 0
669; CHECK-NEXT:    call op_2_to_0
670; CHECK-NEXT:    local.get 0
671; CHECK-NEXT:    call op_1_to_0
672; CHECK-NEXT:    # fallthrough-return
673  %t0 = call {i32, i32} @op_0_to_2()
674  %t1 = extractvalue {i32, i32} %t0, 1
675  %t2 = extractvalue {i32, i32} %t0, 0
676  call void @op_2_to_0(i32 %t1, i32 %t2)
677  %t3 = extractvalue {i32, i32} %t0, 0
678  call void @op_1_to_0(i32 %t3)
679  ret void
680}
681
682define void @f181() {
683; CHECK-LABEL: f181:
684; CHECK:         .functype f181 () -> ()
685; CHECK-NEXT:    .local i32, i32
686; CHECK-NEXT:  # %bb.0:
687; CHECK-NEXT:    call op_0_to_2
688; CHECK-NEXT:    local.set 1
689; CHECK-NEXT:    local.set 0
690; CHECK-NEXT:    local.get 1
691; CHECK-NEXT:    local.get 0
692; CHECK-NEXT:    call op_2_to_0
693; CHECK-NEXT:    local.get 1
694; CHECK-NEXT:    call op_1_to_0
695; CHECK-NEXT:    # fallthrough-return
696  %t0 = call {i32, i32} @op_0_to_2()
697  %t1 = extractvalue {i32, i32} %t0, 1
698  %t2 = extractvalue {i32, i32} %t0, 0
699  call void @op_2_to_0(i32 %t1, i32 %t2)
700  %t3 = extractvalue {i32, i32} %t0, 1
701  call void @op_1_to_0(i32 %t3)
702  ret void
703}
704
705define void @f183() {
706; CHECK-LABEL: f183:
707; CHECK:         .functype f183 () -> ()
708; CHECK-NEXT:    .local i32, i32
709; CHECK-NEXT:  # %bb.0:
710; CHECK-NEXT:    call op_0_to_2
711; CHECK-NEXT:    local.set 1
712; CHECK-NEXT:    local.set 0
713; CHECK-NEXT:    local.get 1
714; CHECK-NEXT:    local.get 0
715; CHECK-NEXT:    call op_2_to_0
716; CHECK-NEXT:    local.get 0
717; CHECK-NEXT:    local.get 1
718; CHECK-NEXT:    call op_2_to_0
719; CHECK-NEXT:    # fallthrough-return
720  %t0 = call {i32, i32} @op_0_to_2()
721  %t1 = extractvalue {i32, i32} %t0, 1
722  %t2 = extractvalue {i32, i32} %t0, 0
723  call void @op_2_to_0(i32 %t1, i32 %t2)
724  %t3 = extractvalue {i32, i32} %t0, 0
725  %t4 = extractvalue {i32, i32} %t0, 1
726  call void @op_2_to_0(i32 %t3, i32 %t4)
727  ret void
728}
729
730define void @f193() {
731; CHECK-LABEL: f193:
732; CHECK:         .functype f193 () -> ()
733; CHECK-NEXT:    .local i32, i32
734; CHECK-NEXT:  # %bb.0:
735; CHECK-NEXT:    call op_0_to_2
736; CHECK-NEXT:    local.set 1
737; CHECK-NEXT:    local.set 0
738; CHECK-NEXT:    local.get 1
739; CHECK-NEXT:    local.get 1
740; CHECK-NEXT:    call op_2_to_0
741; CHECK-NEXT:    local.get 0
742; CHECK-NEXT:    call op_1_to_0
743; CHECK-NEXT:    # fallthrough-return
744  %t0 = call {i32, i32} @op_0_to_2()
745  %t1 = extractvalue {i32, i32} %t0, 1
746  %t2 = extractvalue {i32, i32} %t0, 1
747  call void @op_2_to_0(i32 %t1, i32 %t2)
748  %t3 = extractvalue {i32, i32} %t0, 0
749  call void @op_1_to_0(i32 %t3)
750  ret void
751}
752
753define void @f195() {
754; CHECK-LABEL: f195:
755; CHECK:         .functype f195 () -> ()
756; CHECK-NEXT:    .local i32, i32
757; CHECK-NEXT:  # %bb.0:
758; CHECK-NEXT:    call op_0_to_2
759; CHECK-NEXT:    local.set 1
760; CHECK-NEXT:    local.set 0
761; CHECK-NEXT:    local.get 1
762; CHECK-NEXT:    local.get 1
763; CHECK-NEXT:    call op_2_to_0
764; CHECK-NEXT:    local.get 0
765; CHECK-NEXT:    local.get 0
766; CHECK-NEXT:    call op_2_to_0
767; CHECK-NEXT:    # fallthrough-return
768  %t0 = call {i32, i32} @op_0_to_2()
769  %t1 = extractvalue {i32, i32} %t0, 1
770  %t2 = extractvalue {i32, i32} %t0, 1
771  call void @op_2_to_0(i32 %t1, i32 %t2)
772  %t3 = extractvalue {i32, i32} %t0, 0
773  %t4 = extractvalue {i32, i32} %t0, 0
774  call void @op_2_to_0(i32 %t3, i32 %t4)
775  ret void
776}
777
778define void @f291() {
779; CHECK-LABEL: f291:
780; CHECK:         .functype f291 () -> ()
781; CHECK-NEXT:    .local i32
782; CHECK-NEXT:  # %bb.0:
783; CHECK-NEXT:    call op_0_to_3
784; CHECK-NEXT:    drop
785; CHECK-NEXT:    local.set 0
786; CHECK-NEXT:    call op_1_to_0
787; CHECK-NEXT:    local.get 0
788; CHECK-NEXT:    call op_1_to_0
789; CHECK-NEXT:    # fallthrough-return
790  %t0 = call {i32, i32, i32} @op_0_to_3()
791  %t1 = extractvalue {i32, i32, i32} %t0, 0
792  call void @op_1_to_0(i32 %t1)
793  %t2 = extractvalue {i32, i32, i32} %t0, 1
794  call void @op_1_to_0(i32 %t2)
795  ret void
796}
797
798define void @f292() {
799; CHECK-LABEL: f292:
800; CHECK:         .functype f292 () -> ()
801; CHECK-NEXT:    .local i32
802; CHECK-NEXT:  # %bb.0:
803; CHECK-NEXT:    call op_0_to_3
804; CHECK-NEXT:    local.set 0
805; CHECK-NEXT:    drop
806; CHECK-NEXT:    call op_1_to_0
807; CHECK-NEXT:    local.get 0
808; CHECK-NEXT:    call op_1_to_0
809; CHECK-NEXT:    # fallthrough-return
810  %t0 = call {i32, i32, i32} @op_0_to_3()
811  %t1 = extractvalue {i32, i32, i32} %t0, 0
812  call void @op_1_to_0(i32 %t1)
813  %t2 = extractvalue {i32, i32, i32} %t0, 2
814  call void @op_1_to_0(i32 %t2)
815  ret void
816}
817
818define void @f294() {
819; CHECK-LABEL: f294:
820; CHECK:         .functype f294 () -> ()
821; CHECK-NEXT:    .local i32, i32
822; CHECK-NEXT:  # %bb.0:
823; CHECK-NEXT:    call op_0_to_3
824; CHECK-NEXT:    drop
825; CHECK-NEXT:    local.set 0
826; CHECK-NEXT:    local.tee 1
827; CHECK-NEXT:    call op_1_to_0
828; CHECK-NEXT:    local.get 1
829; CHECK-NEXT:    local.get 0
830; CHECK-NEXT:    call op_2_to_0
831; CHECK-NEXT:    # fallthrough-return
832  %t0 = call {i32, i32, i32} @op_0_to_3()
833  %t1 = extractvalue {i32, i32, i32} %t0, 0
834  call void @op_1_to_0(i32 %t1)
835  %t2 = extractvalue {i32, i32, i32} %t0, 0
836  %t3 = extractvalue {i32, i32, i32} %t0, 1
837  call void @op_2_to_0(i32 %t2, i32 %t3)
838  ret void
839}
840
841define void @f295() {
842; CHECK-LABEL: f295:
843; CHECK:         .functype f295 () -> ()
844; CHECK-NEXT:    .local i32, i32
845; CHECK-NEXT:  # %bb.0:
846; CHECK-NEXT:    call op_0_to_3
847; CHECK-NEXT:    local.set 0
848; CHECK-NEXT:    drop
849; CHECK-NEXT:    local.tee 1
850; CHECK-NEXT:    call op_1_to_0
851; CHECK-NEXT:    local.get 1
852; CHECK-NEXT:    local.get 0
853; CHECK-NEXT:    call op_2_to_0
854; CHECK-NEXT:    # fallthrough-return
855  %t0 = call {i32, i32, i32} @op_0_to_3()
856  %t1 = extractvalue {i32, i32, i32} %t0, 0
857  call void @op_1_to_0(i32 %t1)
858  %t2 = extractvalue {i32, i32, i32} %t0, 0
859  %t3 = extractvalue {i32, i32, i32} %t0, 2
860  call void @op_2_to_0(i32 %t2, i32 %t3)
861  ret void
862}
863
864define void @f296() {
865; CHECK-LABEL: f296:
866; CHECK:         .functype f296 () -> ()
867; CHECK-NEXT:    .local i32, i32
868; CHECK-NEXT:  # %bb.0:
869; CHECK-NEXT:    call op_0_to_3
870; CHECK-NEXT:    drop
871; CHECK-NEXT:    local.set 0
872; CHECK-NEXT:    local.tee 1
873; CHECK-NEXT:    call op_1_to_0
874; CHECK-NEXT:    local.get 0
875; CHECK-NEXT:    local.get 1
876; CHECK-NEXT:    call op_2_to_0
877; CHECK-NEXT:    # fallthrough-return
878  %t0 = call {i32, i32, i32} @op_0_to_3()
879  %t1 = extractvalue {i32, i32, i32} %t0, 0
880  call void @op_1_to_0(i32 %t1)
881  %t2 = extractvalue {i32, i32, i32} %t0, 1
882  %t3 = extractvalue {i32, i32, i32} %t0, 0
883  call void @op_2_to_0(i32 %t2, i32 %t3)
884  ret void
885}
886
887define void @f297() {
888; CHECK-LABEL: f297:
889; CHECK:         .functype f297 () -> ()
890; CHECK-NEXT:    .local i32
891; CHECK-NEXT:  # %bb.0:
892; CHECK-NEXT:    call op_0_to_3
893; CHECK-NEXT:    drop
894; CHECK-NEXT:    local.set 0
895; CHECK-NEXT:    call op_1_to_0
896; CHECK-NEXT:    local.get 0
897; CHECK-NEXT:    local.get 0
898; CHECK-NEXT:    call op_2_to_0
899; CHECK-NEXT:    # fallthrough-return
900  %t0 = call {i32, i32, i32} @op_0_to_3()
901  %t1 = extractvalue {i32, i32, i32} %t0, 0
902  call void @op_1_to_0(i32 %t1)
903  %t2 = extractvalue {i32, i32, i32} %t0, 1
904  %t3 = extractvalue {i32, i32, i32} %t0, 1
905  call void @op_2_to_0(i32 %t2, i32 %t3)
906  ret void
907}
908
909define void @f298() {
910; CHECK-LABEL: f298:
911; CHECK:         .functype f298 () -> ()
912; CHECK-NEXT:    .local i32, i32
913; CHECK-NEXT:  # %bb.0:
914; CHECK-NEXT:    call op_0_to_3
915; CHECK-NEXT:    local.set 1
916; CHECK-NEXT:    local.set 0
917; CHECK-NEXT:    call op_1_to_0
918; CHECK-NEXT:    local.get 0
919; CHECK-NEXT:    local.get 1
920; CHECK-NEXT:    call op_2_to_0
921; CHECK-NEXT:    # fallthrough-return
922  %t0 = call {i32, i32, i32} @op_0_to_3()
923  %t1 = extractvalue {i32, i32, i32} %t0, 0
924  call void @op_1_to_0(i32 %t1)
925  %t2 = extractvalue {i32, i32, i32} %t0, 1
926  %t3 = extractvalue {i32, i32, i32} %t0, 2
927  call void @op_2_to_0(i32 %t2, i32 %t3)
928  ret void
929}
930
931define void @f299() {
932; CHECK-LABEL: f299:
933; CHECK:         .functype f299 () -> ()
934; CHECK-NEXT:    .local i32, i32
935; CHECK-NEXT:  # %bb.0:
936; CHECK-NEXT:    call op_0_to_3
937; CHECK-NEXT:    local.set 0
938; CHECK-NEXT:    drop
939; CHECK-NEXT:    local.tee 1
940; CHECK-NEXT:    call op_1_to_0
941; CHECK-NEXT:    local.get 0
942; CHECK-NEXT:    local.get 1
943; CHECK-NEXT:    call op_2_to_0
944; CHECK-NEXT:    # fallthrough-return
945  %t0 = call {i32, i32, i32} @op_0_to_3()
946  %t1 = extractvalue {i32, i32, i32} %t0, 0
947  call void @op_1_to_0(i32 %t1)
948  %t2 = extractvalue {i32, i32, i32} %t0, 2
949  %t3 = extractvalue {i32, i32, i32} %t0, 0
950  call void @op_2_to_0(i32 %t2, i32 %t3)
951  ret void
952}
953
954define void @f300() {
955; CHECK-LABEL: f300:
956; CHECK:         .functype f300 () -> ()
957; CHECK-NEXT:    .local i32, i32
958; CHECK-NEXT:  # %bb.0:
959; CHECK-NEXT:    call op_0_to_3
960; CHECK-NEXT:    local.set 1
961; CHECK-NEXT:    local.set 0
962; CHECK-NEXT:    call op_1_to_0
963; CHECK-NEXT:    local.get 1
964; CHECK-NEXT:    local.get 0
965; CHECK-NEXT:    call op_2_to_0
966; CHECK-NEXT:    # fallthrough-return
967  %t0 = call {i32, i32, i32} @op_0_to_3()
968  %t1 = extractvalue {i32, i32, i32} %t0, 0
969  call void @op_1_to_0(i32 %t1)
970  %t2 = extractvalue {i32, i32, i32} %t0, 2
971  %t3 = extractvalue {i32, i32, i32} %t0, 1
972  call void @op_2_to_0(i32 %t2, i32 %t3)
973  ret void
974}
975
976define void @f301() {
977; CHECK-LABEL: f301:
978; CHECK:         .functype f301 () -> ()
979; CHECK-NEXT:    .local i32
980; CHECK-NEXT:  # %bb.0:
981; CHECK-NEXT:    call op_0_to_3
982; CHECK-NEXT:    local.set 0
983; CHECK-NEXT:    drop
984; CHECK-NEXT:    call op_1_to_0
985; CHECK-NEXT:    local.get 0
986; CHECK-NEXT:    local.get 0
987; CHECK-NEXT:    call op_2_to_0
988; CHECK-NEXT:    # fallthrough-return
989  %t0 = call {i32, i32, i32} @op_0_to_3()
990  %t1 = extractvalue {i32, i32, i32} %t0, 0
991  call void @op_1_to_0(i32 %t1)
992  %t2 = extractvalue {i32, i32, i32} %t0, 2
993  %t3 = extractvalue {i32, i32, i32} %t0, 2
994  call void @op_2_to_0(i32 %t2, i32 %t3)
995  ret void
996}
997
998define void @f302() {
999; CHECK-LABEL: f302:
1000; CHECK:         .functype f302 () -> ()
1001; CHECK-NEXT:    .local i32, i32
1002; CHECK-NEXT:  # %bb.0:
1003; CHECK-NEXT:    call op_0_to_3
1004; CHECK-NEXT:    drop
1005; CHECK-NEXT:    local.set 1
1006; CHECK-NEXT:    local.set 0
1007; CHECK-NEXT:    local.get 1
1008; CHECK-NEXT:    call op_1_to_0
1009; CHECK-NEXT:    local.get 0
1010; CHECK-NEXT:    call op_1_to_0
1011; CHECK-NEXT:    # fallthrough-return
1012  %t0 = call {i32, i32, i32} @op_0_to_3()
1013  %t1 = extractvalue {i32, i32, i32} %t0, 1
1014  call void @op_1_to_0(i32 %t1)
1015  %t2 = extractvalue {i32, i32, i32} %t0, 0
1016  call void @op_1_to_0(i32 %t2)
1017  ret void
1018}
1019
1020define void @f304() {
1021; CHECK-LABEL: f304:
1022; CHECK:         .functype f304 () -> ()
1023; CHECK-NEXT:    .local i32, i32
1024; CHECK-NEXT:  # %bb.0:
1025; CHECK-NEXT:    call op_0_to_3
1026; CHECK-NEXT:    local.set 1
1027; CHECK-NEXT:    local.set 0
1028; CHECK-NEXT:    drop
1029; CHECK-NEXT:    local.get 0
1030; CHECK-NEXT:    call op_1_to_0
1031; CHECK-NEXT:    local.get 1
1032; CHECK-NEXT:    call op_1_to_0
1033; CHECK-NEXT:    # fallthrough-return
1034  %t0 = call {i32, i32, i32} @op_0_to_3()
1035  %t1 = extractvalue {i32, i32, i32} %t0, 1
1036  call void @op_1_to_0(i32 %t1)
1037  %t2 = extractvalue {i32, i32, i32} %t0, 2
1038  call void @op_1_to_0(i32 %t2)
1039  ret void
1040}
1041
1042define void @f305() {
1043; CHECK-LABEL: f305:
1044; CHECK:         .functype f305 () -> ()
1045; CHECK-NEXT:    .local i32, i32
1046; CHECK-NEXT:  # %bb.0:
1047; CHECK-NEXT:    call op_0_to_3
1048; CHECK-NEXT:    drop
1049; CHECK-NEXT:    local.set 1
1050; CHECK-NEXT:    local.set 0
1051; CHECK-NEXT:    local.get 1
1052; CHECK-NEXT:    call op_1_to_0
1053; CHECK-NEXT:    local.get 0
1054; CHECK-NEXT:    local.get 0
1055; CHECK-NEXT:    call op_2_to_0
1056; CHECK-NEXT:    # fallthrough-return
1057  %t0 = call {i32, i32, i32} @op_0_to_3()
1058  %t1 = extractvalue {i32, i32, i32} %t0, 1
1059  call void @op_1_to_0(i32 %t1)
1060  %t2 = extractvalue {i32, i32, i32} %t0, 0
1061  %t3 = extractvalue {i32, i32, i32} %t0, 0
1062  call void @op_2_to_0(i32 %t2, i32 %t3)
1063  ret void
1064}
1065
1066define void @f306() {
1067; CHECK-LABEL: f306:
1068; CHECK:         .functype f306 () -> ()
1069; CHECK-NEXT:    .local i32, i32
1070; CHECK-NEXT:  # %bb.0:
1071; CHECK-NEXT:    call op_0_to_3
1072; CHECK-NEXT:    drop
1073; CHECK-NEXT:    local.set 1
1074; CHECK-NEXT:    local.set 0
1075; CHECK-NEXT:    local.get 1
1076; CHECK-NEXT:    call op_1_to_0
1077; CHECK-NEXT:    local.get 0
1078; CHECK-NEXT:    local.get 1
1079; CHECK-NEXT:    call op_2_to_0
1080; CHECK-NEXT:    # fallthrough-return
1081  %t0 = call {i32, i32, i32} @op_0_to_3()
1082  %t1 = extractvalue {i32, i32, i32} %t0, 1
1083  call void @op_1_to_0(i32 %t1)
1084  %t2 = extractvalue {i32, i32, i32} %t0, 0
1085  %t3 = extractvalue {i32, i32, i32} %t0, 1
1086  call void @op_2_to_0(i32 %t2, i32 %t3)
1087  ret void
1088}
1089
1090define void @f307() {
1091; CHECK-LABEL: f307:
1092; CHECK:         .functype f307 () -> ()
1093; CHECK-NEXT:    .local i32, i32, i32
1094; CHECK-NEXT:  # %bb.0:
1095; CHECK-NEXT:    call op_0_to_3
1096; CHECK-NEXT:    local.set 2
1097; CHECK-NEXT:    local.set 1
1098; CHECK-NEXT:    local.set 0
1099; CHECK-NEXT:    local.get 1
1100; CHECK-NEXT:    call op_1_to_0
1101; CHECK-NEXT:    local.get 0
1102; CHECK-NEXT:    local.get 2
1103; CHECK-NEXT:    call op_2_to_0
1104; CHECK-NEXT:    # fallthrough-return
1105  %t0 = call {i32, i32, i32} @op_0_to_3()
1106  %t1 = extractvalue {i32, i32, i32} %t0, 1
1107  call void @op_1_to_0(i32 %t1)
1108  %t2 = extractvalue {i32, i32, i32} %t0, 0
1109  %t3 = extractvalue {i32, i32, i32} %t0, 2
1110  call void @op_2_to_0(i32 %t2, i32 %t3)
1111  ret void
1112}
1113
1114define void @f308() {
1115; CHECK-LABEL: f308:
1116; CHECK:         .functype f308 () -> ()
1117; CHECK-NEXT:    .local i32, i32
1118; CHECK-NEXT:  # %bb.0:
1119; CHECK-NEXT:    call op_0_to_3
1120; CHECK-NEXT:    drop
1121; CHECK-NEXT:    local.set 1
1122; CHECK-NEXT:    local.set 0
1123; CHECK-NEXT:    local.get 1
1124; CHECK-NEXT:    call op_1_to_0
1125; CHECK-NEXT:    local.get 1
1126; CHECK-NEXT:    local.get 0
1127; CHECK-NEXT:    call op_2_to_0
1128; CHECK-NEXT:    # fallthrough-return
1129  %t0 = call {i32, i32, i32} @op_0_to_3()
1130  %t1 = extractvalue {i32, i32, i32} %t0, 1
1131  call void @op_1_to_0(i32 %t1)
1132  %t2 = extractvalue {i32, i32, i32} %t0, 1
1133  %t3 = extractvalue {i32, i32, i32} %t0, 0
1134  call void @op_2_to_0(i32 %t2, i32 %t3)
1135  ret void
1136}
1137
1138define void @f310() {
1139; CHECK-LABEL: f310:
1140; CHECK:         .functype f310 () -> ()
1141; CHECK-NEXT:    .local i32, i32
1142; CHECK-NEXT:  # %bb.0:
1143; CHECK-NEXT:    call op_0_to_3
1144; CHECK-NEXT:    local.set 1
1145; CHECK-NEXT:    local.set 0
1146; CHECK-NEXT:    drop
1147; CHECK-NEXT:    local.get 0
1148; CHECK-NEXT:    call op_1_to_0
1149; CHECK-NEXT:    local.get 0
1150; CHECK-NEXT:    local.get 1
1151; CHECK-NEXT:    call op_2_to_0
1152; CHECK-NEXT:    # fallthrough-return
1153  %t0 = call {i32, i32, i32} @op_0_to_3()
1154  %t1 = extractvalue {i32, i32, i32} %t0, 1
1155  call void @op_1_to_0(i32 %t1)
1156  %t2 = extractvalue {i32, i32, i32} %t0, 1
1157  %t3 = extractvalue {i32, i32, i32} %t0, 2
1158  call void @op_2_to_0(i32 %t2, i32 %t3)
1159  ret void
1160}
1161
1162define void @f311() {
1163; CHECK-LABEL: f311:
1164; CHECK:         .functype f311 () -> ()
1165; CHECK-NEXT:    .local i32, i32, i32
1166; CHECK-NEXT:  # %bb.0:
1167; CHECK-NEXT:    call op_0_to_3
1168; CHECK-NEXT:    local.set 2
1169; CHECK-NEXT:    local.set 1
1170; CHECK-NEXT:    local.set 0
1171; CHECK-NEXT:    local.get 1
1172; CHECK-NEXT:    call op_1_to_0
1173; CHECK-NEXT:    local.get 2
1174; CHECK-NEXT:    local.get 0
1175; CHECK-NEXT:    call op_2_to_0
1176; CHECK-NEXT:    # fallthrough-return
1177  %t0 = call {i32, i32, i32} @op_0_to_3()
1178  %t1 = extractvalue {i32, i32, i32} %t0, 1
1179  call void @op_1_to_0(i32 %t1)
1180  %t2 = extractvalue {i32, i32, i32} %t0, 2
1181  %t3 = extractvalue {i32, i32, i32} %t0, 0
1182  call void @op_2_to_0(i32 %t2, i32 %t3)
1183  ret void
1184}
1185
1186define void @f312() {
1187; CHECK-LABEL: f312:
1188; CHECK:         .functype f312 () -> ()
1189; CHECK-NEXT:    .local i32, i32
1190; CHECK-NEXT:  # %bb.0:
1191; CHECK-NEXT:    call op_0_to_3
1192; CHECK-NEXT:    local.set 1
1193; CHECK-NEXT:    local.set 0
1194; CHECK-NEXT:    drop
1195; CHECK-NEXT:    local.get 0
1196; CHECK-NEXT:    call op_1_to_0
1197; CHECK-NEXT:    local.get 1
1198; CHECK-NEXT:    local.get 0
1199; CHECK-NEXT:    call op_2_to_0
1200; CHECK-NEXT:    # fallthrough-return
1201  %t0 = call {i32, i32, i32} @op_0_to_3()
1202  %t1 = extractvalue {i32, i32, i32} %t0, 1
1203  call void @op_1_to_0(i32 %t1)
1204  %t2 = extractvalue {i32, i32, i32} %t0, 2
1205  %t3 = extractvalue {i32, i32, i32} %t0, 1
1206  call void @op_2_to_0(i32 %t2, i32 %t3)
1207  ret void
1208}
1209
1210define void @f313() {
1211; CHECK-LABEL: f313:
1212; CHECK:         .functype f313 () -> ()
1213; CHECK-NEXT:    .local i32, i32
1214; CHECK-NEXT:  # %bb.0:
1215; CHECK-NEXT:    call op_0_to_3
1216; CHECK-NEXT:    local.set 1
1217; CHECK-NEXT:    local.set 0
1218; CHECK-NEXT:    drop
1219; CHECK-NEXT:    local.get 0
1220; CHECK-NEXT:    call op_1_to_0
1221; CHECK-NEXT:    local.get 1
1222; CHECK-NEXT:    local.get 1
1223; CHECK-NEXT:    call op_2_to_0
1224; CHECK-NEXT:    # fallthrough-return
1225  %t0 = call {i32, i32, i32} @op_0_to_3()
1226  %t1 = extractvalue {i32, i32, i32} %t0, 1
1227  call void @op_1_to_0(i32 %t1)
1228  %t2 = extractvalue {i32, i32, i32} %t0, 2
1229  %t3 = extractvalue {i32, i32, i32} %t0, 2
1230  call void @op_2_to_0(i32 %t2, i32 %t3)
1231  ret void
1232}
1233
1234define void @f314() {
1235; CHECK-LABEL: f314:
1236; CHECK:         .functype f314 () -> ()
1237; CHECK-NEXT:    .local i32, i32
1238; CHECK-NEXT:  # %bb.0:
1239; CHECK-NEXT:    call op_0_to_3
1240; CHECK-NEXT:    local.set 1
1241; CHECK-NEXT:    drop
1242; CHECK-NEXT:    local.set 0
1243; CHECK-NEXT:    local.get 1
1244; CHECK-NEXT:    call op_1_to_0
1245; CHECK-NEXT:    local.get 0
1246; CHECK-NEXT:    call op_1_to_0
1247; CHECK-NEXT:    # fallthrough-return
1248  %t0 = call {i32, i32, i32} @op_0_to_3()
1249  %t1 = extractvalue {i32, i32, i32} %t0, 2
1250  call void @op_1_to_0(i32 %t1)
1251  %t2 = extractvalue {i32, i32, i32} %t0, 0
1252  call void @op_1_to_0(i32 %t2)
1253  ret void
1254}
1255
1256define void @f315() {
1257; CHECK-LABEL: f315:
1258; CHECK:         .functype f315 () -> ()
1259; CHECK-NEXT:    .local i32, i32
1260; CHECK-NEXT:  # %bb.0:
1261; CHECK-NEXT:    call op_0_to_3
1262; CHECK-NEXT:    local.set 1
1263; CHECK-NEXT:    local.set 0
1264; CHECK-NEXT:    drop
1265; CHECK-NEXT:    local.get 1
1266; CHECK-NEXT:    call op_1_to_0
1267; CHECK-NEXT:    local.get 0
1268; CHECK-NEXT:    call op_1_to_0
1269; CHECK-NEXT:    # fallthrough-return
1270  %t0 = call {i32, i32, i32} @op_0_to_3()
1271  %t1 = extractvalue {i32, i32, i32} %t0, 2
1272  call void @op_1_to_0(i32 %t1)
1273  %t2 = extractvalue {i32, i32, i32} %t0, 1
1274  call void @op_1_to_0(i32 %t2)
1275  ret void
1276}
1277
1278define void @f317() {
1279; CHECK-LABEL: f317:
1280; CHECK:         .functype f317 () -> ()
1281; CHECK-NEXT:    .local i32, i32
1282; CHECK-NEXT:  # %bb.0:
1283; CHECK-NEXT:    call op_0_to_3
1284; CHECK-NEXT:    local.set 1
1285; CHECK-NEXT:    drop
1286; CHECK-NEXT:    local.set 0
1287; CHECK-NEXT:    local.get 1
1288; CHECK-NEXT:    call op_1_to_0
1289; CHECK-NEXT:    local.get 0
1290; CHECK-NEXT:    local.get 0
1291; CHECK-NEXT:    call op_2_to_0
1292; CHECK-NEXT:    # fallthrough-return
1293  %t0 = call {i32, i32, i32} @op_0_to_3()
1294  %t1 = extractvalue {i32, i32, i32} %t0, 2
1295  call void @op_1_to_0(i32 %t1)
1296  %t2 = extractvalue {i32, i32, i32} %t0, 0
1297  %t3 = extractvalue {i32, i32, i32} %t0, 0
1298  call void @op_2_to_0(i32 %t2, i32 %t3)
1299  ret void
1300}
1301
1302define void @f318() {
1303; CHECK-LABEL: f318:
1304; CHECK:         .functype f318 () -> ()
1305; CHECK-NEXT:    .local i32, i32, i32
1306; CHECK-NEXT:  # %bb.0:
1307; CHECK-NEXT:    call op_0_to_3
1308; CHECK-NEXT:    local.set 2
1309; CHECK-NEXT:    local.set 1
1310; CHECK-NEXT:    local.set 0
1311; CHECK-NEXT:    local.get 2
1312; CHECK-NEXT:    call op_1_to_0
1313; CHECK-NEXT:    local.get 0
1314; CHECK-NEXT:    local.get 1
1315; CHECK-NEXT:    call op_2_to_0
1316; CHECK-NEXT:    # fallthrough-return
1317  %t0 = call {i32, i32, i32} @op_0_to_3()
1318  %t1 = extractvalue {i32, i32, i32} %t0, 2
1319  call void @op_1_to_0(i32 %t1)
1320  %t2 = extractvalue {i32, i32, i32} %t0, 0
1321  %t3 = extractvalue {i32, i32, i32} %t0, 1
1322  call void @op_2_to_0(i32 %t2, i32 %t3)
1323  ret void
1324}
1325
1326define void @f319() {
1327; CHECK-LABEL: f319:
1328; CHECK:         .functype f319 () -> ()
1329; CHECK-NEXT:    .local i32, i32
1330; CHECK-NEXT:  # %bb.0:
1331; CHECK-NEXT:    call op_0_to_3
1332; CHECK-NEXT:    local.set 1
1333; CHECK-NEXT:    drop
1334; CHECK-NEXT:    local.set 0
1335; CHECK-NEXT:    local.get 1
1336; CHECK-NEXT:    call op_1_to_0
1337; CHECK-NEXT:    local.get 0
1338; CHECK-NEXT:    local.get 1
1339; CHECK-NEXT:    call op_2_to_0
1340; CHECK-NEXT:    # fallthrough-return
1341  %t0 = call {i32, i32, i32} @op_0_to_3()
1342  %t1 = extractvalue {i32, i32, i32} %t0, 2
1343  call void @op_1_to_0(i32 %t1)
1344  %t2 = extractvalue {i32, i32, i32} %t0, 0
1345  %t3 = extractvalue {i32, i32, i32} %t0, 2
1346  call void @op_2_to_0(i32 %t2, i32 %t3)
1347  ret void
1348}
1349
1350define void @f320() {
1351; CHECK-LABEL: f320:
1352; CHECK:         .functype f320 () -> ()
1353; CHECK-NEXT:    .local i32, i32, i32
1354; CHECK-NEXT:  # %bb.0:
1355; CHECK-NEXT:    call op_0_to_3
1356; CHECK-NEXT:    local.set 2
1357; CHECK-NEXT:    local.set 1
1358; CHECK-NEXT:    local.set 0
1359; CHECK-NEXT:    local.get 2
1360; CHECK-NEXT:    call op_1_to_0
1361; CHECK-NEXT:    local.get 1
1362; CHECK-NEXT:    local.get 0
1363; CHECK-NEXT:    call op_2_to_0
1364; CHECK-NEXT:    # fallthrough-return
1365  %t0 = call {i32, i32, i32} @op_0_to_3()
1366  %t1 = extractvalue {i32, i32, i32} %t0, 2
1367  call void @op_1_to_0(i32 %t1)
1368  %t2 = extractvalue {i32, i32, i32} %t0, 1
1369  %t3 = extractvalue {i32, i32, i32} %t0, 0
1370  call void @op_2_to_0(i32 %t2, i32 %t3)
1371  ret void
1372}
1373
1374define void @f321() {
1375; CHECK-LABEL: f321:
1376; CHECK:         .functype f321 () -> ()
1377; CHECK-NEXT:    .local i32, i32
1378; CHECK-NEXT:  # %bb.0:
1379; CHECK-NEXT:    call op_0_to_3
1380; CHECK-NEXT:    local.set 1
1381; CHECK-NEXT:    local.set 0
1382; CHECK-NEXT:    drop
1383; CHECK-NEXT:    local.get 1
1384; CHECK-NEXT:    call op_1_to_0
1385; CHECK-NEXT:    local.get 0
1386; CHECK-NEXT:    local.get 0
1387; CHECK-NEXT:    call op_2_to_0
1388; CHECK-NEXT:    # fallthrough-return
1389  %t0 = call {i32, i32, i32} @op_0_to_3()
1390  %t1 = extractvalue {i32, i32, i32} %t0, 2
1391  call void @op_1_to_0(i32 %t1)
1392  %t2 = extractvalue {i32, i32, i32} %t0, 1
1393  %t3 = extractvalue {i32, i32, i32} %t0, 1
1394  call void @op_2_to_0(i32 %t2, i32 %t3)
1395  ret void
1396}
1397
1398define void @f322() {
1399; CHECK-LABEL: f322:
1400; CHECK:         .functype f322 () -> ()
1401; CHECK-NEXT:    .local i32, i32
1402; CHECK-NEXT:  # %bb.0:
1403; CHECK-NEXT:    call op_0_to_3
1404; CHECK-NEXT:    local.set 1
1405; CHECK-NEXT:    local.set 0
1406; CHECK-NEXT:    drop
1407; CHECK-NEXT:    local.get 1
1408; CHECK-NEXT:    call op_1_to_0
1409; CHECK-NEXT:    local.get 0
1410; CHECK-NEXT:    local.get 1
1411; CHECK-NEXT:    call op_2_to_0
1412; CHECK-NEXT:    # fallthrough-return
1413  %t0 = call {i32, i32, i32} @op_0_to_3()
1414  %t1 = extractvalue {i32, i32, i32} %t0, 2
1415  call void @op_1_to_0(i32 %t1)
1416  %t2 = extractvalue {i32, i32, i32} %t0, 1
1417  %t3 = extractvalue {i32, i32, i32} %t0, 2
1418  call void @op_2_to_0(i32 %t2, i32 %t3)
1419  ret void
1420}
1421
1422define void @f323() {
1423; CHECK-LABEL: f323:
1424; CHECK:         .functype f323 () -> ()
1425; CHECK-NEXT:    .local i32, i32
1426; CHECK-NEXT:  # %bb.0:
1427; CHECK-NEXT:    call op_0_to_3
1428; CHECK-NEXT:    local.set 1
1429; CHECK-NEXT:    drop
1430; CHECK-NEXT:    local.set 0
1431; CHECK-NEXT:    local.get 1
1432; CHECK-NEXT:    call op_1_to_0
1433; CHECK-NEXT:    local.get 1
1434; CHECK-NEXT:    local.get 0
1435; CHECK-NEXT:    call op_2_to_0
1436; CHECK-NEXT:    # fallthrough-return
1437  %t0 = call {i32, i32, i32} @op_0_to_3()
1438  %t1 = extractvalue {i32, i32, i32} %t0, 2
1439  call void @op_1_to_0(i32 %t1)
1440  %t2 = extractvalue {i32, i32, i32} %t0, 2
1441  %t3 = extractvalue {i32, i32, i32} %t0, 0
1442  call void @op_2_to_0(i32 %t2, i32 %t3)
1443  ret void
1444}
1445
1446define void @f324() {
1447; CHECK-LABEL: f324:
1448; CHECK:         .functype f324 () -> ()
1449; CHECK-NEXT:    .local i32, i32
1450; CHECK-NEXT:  # %bb.0:
1451; CHECK-NEXT:    call op_0_to_3
1452; CHECK-NEXT:    local.set 1
1453; CHECK-NEXT:    local.set 0
1454; CHECK-NEXT:    drop
1455; CHECK-NEXT:    local.get 1
1456; CHECK-NEXT:    call op_1_to_0
1457; CHECK-NEXT:    local.get 1
1458; CHECK-NEXT:    local.get 0
1459; CHECK-NEXT:    call op_2_to_0
1460; CHECK-NEXT:    # fallthrough-return
1461  %t0 = call {i32, i32, i32} @op_0_to_3()
1462  %t1 = extractvalue {i32, i32, i32} %t0, 2
1463  call void @op_1_to_0(i32 %t1)
1464  %t2 = extractvalue {i32, i32, i32} %t0, 2
1465  %t3 = extractvalue {i32, i32, i32} %t0, 1
1466  call void @op_2_to_0(i32 %t2, i32 %t3)
1467  ret void
1468}
1469
1470define void @f327() {
1471; CHECK-LABEL: f327:
1472; CHECK:         .functype f327 () -> ()
1473; CHECK-NEXT:    .local i32, i32
1474; CHECK-NEXT:  # %bb.0:
1475; CHECK-NEXT:    call op_0_to_3
1476; CHECK-NEXT:    drop
1477; CHECK-NEXT:    local.set 0
1478; CHECK-NEXT:    local.tee 1
1479; CHECK-NEXT:    local.get 1
1480; CHECK-NEXT:    call op_2_to_0
1481; CHECK-NEXT:    local.get 0
1482; CHECK-NEXT:    call op_1_to_0
1483; CHECK-NEXT:    # fallthrough-return
1484  %t0 = call {i32, i32, i32} @op_0_to_3()
1485  %t1 = extractvalue {i32, i32, i32} %t0, 0
1486  %t2 = extractvalue {i32, i32, i32} %t0, 0
1487  call void @op_2_to_0(i32 %t1, i32 %t2)
1488  %t3 = extractvalue {i32, i32, i32} %t0, 1
1489  call void @op_1_to_0(i32 %t3)
1490  ret void
1491}
1492
1493define void @f328() {
1494; CHECK-LABEL: f328:
1495; CHECK:         .functype f328 () -> ()
1496; CHECK-NEXT:    .local i32, i32
1497; CHECK-NEXT:  # %bb.0:
1498; CHECK-NEXT:    call op_0_to_3
1499; CHECK-NEXT:    local.set 0
1500; CHECK-NEXT:    drop
1501; CHECK-NEXT:    local.tee 1
1502; CHECK-NEXT:    local.get 1
1503; CHECK-NEXT:    call op_2_to_0
1504; CHECK-NEXT:    local.get 0
1505; CHECK-NEXT:    call op_1_to_0
1506; CHECK-NEXT:    # fallthrough-return
1507  %t0 = call {i32, i32, i32} @op_0_to_3()
1508  %t1 = extractvalue {i32, i32, i32} %t0, 0
1509  %t2 = extractvalue {i32, i32, i32} %t0, 0
1510  call void @op_2_to_0(i32 %t1, i32 %t2)
1511  %t3 = extractvalue {i32, i32, i32} %t0, 2
1512  call void @op_1_to_0(i32 %t3)
1513  ret void
1514}
1515
1516define void @f333() {
1517; CHECK-LABEL: f333:
1518; CHECK:         .functype f333 () -> ()
1519; CHECK-NEXT:    .local i32, i32
1520; CHECK-NEXT:  # %bb.0:
1521; CHECK-NEXT:    call op_0_to_3
1522; CHECK-NEXT:    drop
1523; CHECK-NEXT:    local.set 0
1524; CHECK-NEXT:    local.tee 1
1525; CHECK-NEXT:    local.get 1
1526; CHECK-NEXT:    call op_2_to_0
1527; CHECK-NEXT:    local.get 0
1528; CHECK-NEXT:    local.get 0
1529; CHECK-NEXT:    call op_2_to_0
1530; CHECK-NEXT:    # fallthrough-return
1531  %t0 = call {i32, i32, i32} @op_0_to_3()
1532  %t1 = extractvalue {i32, i32, i32} %t0, 0
1533  %t2 = extractvalue {i32, i32, i32} %t0, 0
1534  call void @op_2_to_0(i32 %t1, i32 %t2)
1535  %t3 = extractvalue {i32, i32, i32} %t0, 1
1536  %t4 = extractvalue {i32, i32, i32} %t0, 1
1537  call void @op_2_to_0(i32 %t3, i32 %t4)
1538  ret void
1539}
1540
1541define void @f334() {
1542; CHECK-LABEL: f334:
1543; CHECK:         .functype f334 () -> ()
1544; CHECK-NEXT:    .local i32, i32, i32
1545; CHECK-NEXT:  # %bb.0:
1546; CHECK-NEXT:    call op_0_to_3
1547; CHECK-NEXT:    local.set 1
1548; CHECK-NEXT:    local.set 0
1549; CHECK-NEXT:    local.tee 2
1550; CHECK-NEXT:    local.get 2
1551; CHECK-NEXT:    call op_2_to_0
1552; CHECK-NEXT:    local.get 0
1553; CHECK-NEXT:    local.get 1
1554; CHECK-NEXT:    call op_2_to_0
1555; CHECK-NEXT:    # fallthrough-return
1556  %t0 = call {i32, i32, i32} @op_0_to_3()
1557  %t1 = extractvalue {i32, i32, i32} %t0, 0
1558  %t2 = extractvalue {i32, i32, i32} %t0, 0
1559  call void @op_2_to_0(i32 %t1, i32 %t2)
1560  %t3 = extractvalue {i32, i32, i32} %t0, 1
1561  %t4 = extractvalue {i32, i32, i32} %t0, 2
1562  call void @op_2_to_0(i32 %t3, i32 %t4)
1563  ret void
1564}
1565
1566define void @f336() {
1567; CHECK-LABEL: f336:
1568; CHECK:         .functype f336 () -> ()
1569; CHECK-NEXT:    .local i32, i32, i32
1570; CHECK-NEXT:  # %bb.0:
1571; CHECK-NEXT:    call op_0_to_3
1572; CHECK-NEXT:    local.set 1
1573; CHECK-NEXT:    local.set 0
1574; CHECK-NEXT:    local.tee 2
1575; CHECK-NEXT:    local.get 2
1576; CHECK-NEXT:    call op_2_to_0
1577; CHECK-NEXT:    local.get 1
1578; CHECK-NEXT:    local.get 0
1579; CHECK-NEXT:    call op_2_to_0
1580; CHECK-NEXT:    # fallthrough-return
1581  %t0 = call {i32, i32, i32} @op_0_to_3()
1582  %t1 = extractvalue {i32, i32, i32} %t0, 0
1583  %t2 = extractvalue {i32, i32, i32} %t0, 0
1584  call void @op_2_to_0(i32 %t1, i32 %t2)
1585  %t3 = extractvalue {i32, i32, i32} %t0, 2
1586  %t4 = extractvalue {i32, i32, i32} %t0, 1
1587  call void @op_2_to_0(i32 %t3, i32 %t4)
1588  ret void
1589}
1590
1591define void @f337() {
1592; CHECK-LABEL: f337:
1593; CHECK:         .functype f337 () -> ()
1594; CHECK-NEXT:    .local i32, i32
1595; CHECK-NEXT:  # %bb.0:
1596; CHECK-NEXT:    call op_0_to_3
1597; CHECK-NEXT:    local.set 0
1598; CHECK-NEXT:    drop
1599; CHECK-NEXT:    local.tee 1
1600; CHECK-NEXT:    local.get 1
1601; CHECK-NEXT:    call op_2_to_0
1602; CHECK-NEXT:    local.get 0
1603; CHECK-NEXT:    local.get 0
1604; CHECK-NEXT:    call op_2_to_0
1605; CHECK-NEXT:    # fallthrough-return
1606  %t0 = call {i32, i32, i32} @op_0_to_3()
1607  %t1 = extractvalue {i32, i32, i32} %t0, 0
1608  %t2 = extractvalue {i32, i32, i32} %t0, 0
1609  call void @op_2_to_0(i32 %t1, i32 %t2)
1610  %t3 = extractvalue {i32, i32, i32} %t0, 2
1611  %t4 = extractvalue {i32, i32, i32} %t0, 2
1612  call void @op_2_to_0(i32 %t3, i32 %t4)
1613  ret void
1614}
1615
1616define void @f338() {
1617; CHECK-LABEL: f338:
1618; CHECK:         .functype f338 () -> ()
1619; CHECK-NEXT:    .local i32, i32
1620; CHECK-NEXT:  # %bb.0:
1621; CHECK-NEXT:    call op_0_to_3
1622; CHECK-NEXT:    drop
1623; CHECK-NEXT:    local.set 0
1624; CHECK-NEXT:    local.tee 1
1625; CHECK-NEXT:    local.get 0
1626; CHECK-NEXT:    call op_2_to_0
1627; CHECK-NEXT:    local.get 1
1628; CHECK-NEXT:    call op_1_to_0
1629; CHECK-NEXT:    # fallthrough-return
1630  %t0 = call {i32, i32, i32} @op_0_to_3()
1631  %t1 = extractvalue {i32, i32, i32} %t0, 0
1632  %t2 = extractvalue {i32, i32, i32} %t0, 1
1633  call void @op_2_to_0(i32 %t1, i32 %t2)
1634  %t3 = extractvalue {i32, i32, i32} %t0, 0
1635  call void @op_1_to_0(i32 %t3)
1636  ret void
1637}
1638
1639define void @f339() {
1640; CHECK-LABEL: f339:
1641; CHECK:         .functype f339 () -> ()
1642; CHECK-NEXT:    .local i32
1643; CHECK-NEXT:  # %bb.0:
1644; CHECK-NEXT:    call op_0_to_3
1645; CHECK-NEXT:    drop
1646; CHECK-NEXT:    local.set 0
1647; CHECK-NEXT:    local.get 0
1648; CHECK-NEXT:    call op_2_to_0
1649; CHECK-NEXT:    local.get 0
1650; CHECK-NEXT:    call op_1_to_0
1651; CHECK-NEXT:    # fallthrough-return
1652  %t0 = call {i32, i32, i32} @op_0_to_3()
1653  %t1 = extractvalue {i32, i32, i32} %t0, 0
1654  %t2 = extractvalue {i32, i32, i32} %t0, 1
1655  call void @op_2_to_0(i32 %t1, i32 %t2)
1656  %t3 = extractvalue {i32, i32, i32} %t0, 1
1657  call void @op_1_to_0(i32 %t3)
1658  ret void
1659}
1660
1661define void @f340() {
1662; CHECK-LABEL: f340:
1663; CHECK:         .functype f340 () -> ()
1664; CHECK-NEXT:    .local i32
1665; CHECK-NEXT:  # %bb.0:
1666; CHECK-NEXT:    call op_0_to_3
1667; CHECK-NEXT:    local.set 0
1668; CHECK-NEXT:    call op_2_to_0
1669; CHECK-NEXT:    local.get 0
1670; CHECK-NEXT:    call op_1_to_0
1671; CHECK-NEXT:    # fallthrough-return
1672  %t0 = call {i32, i32, i32} @op_0_to_3()
1673  %t1 = extractvalue {i32, i32, i32} %t0, 0
1674  %t2 = extractvalue {i32, i32, i32} %t0, 1
1675  call void @op_2_to_0(i32 %t1, i32 %t2)
1676  %t3 = extractvalue {i32, i32, i32} %t0, 2
1677  call void @op_1_to_0(i32 %t3)
1678  ret void
1679}
1680
1681define void @f343() {
1682; CHECK-LABEL: f343:
1683; CHECK:         .functype f343 () -> ()
1684; CHECK-NEXT:    .local i32, i32, i32
1685; CHECK-NEXT:  # %bb.0:
1686; CHECK-NEXT:    call op_0_to_3
1687; CHECK-NEXT:    local.set 1
1688; CHECK-NEXT:    local.set 0
1689; CHECK-NEXT:    local.tee 2
1690; CHECK-NEXT:    local.get 0
1691; CHECK-NEXT:    call op_2_to_0
1692; CHECK-NEXT:    local.get 2
1693; CHECK-NEXT:    local.get 1
1694; CHECK-NEXT:    call op_2_to_0
1695; CHECK-NEXT:    # fallthrough-return
1696  %t0 = call {i32, i32, i32} @op_0_to_3()
1697  %t1 = extractvalue {i32, i32, i32} %t0, 0
1698  %t2 = extractvalue {i32, i32, i32} %t0, 1
1699  call void @op_2_to_0(i32 %t1, i32 %t2)
1700  %t3 = extractvalue {i32, i32, i32} %t0, 0
1701  %t4 = extractvalue {i32, i32, i32} %t0, 2
1702  call void @op_2_to_0(i32 %t3, i32 %t4)
1703  ret void
1704}
1705
1706define void @f344() {
1707; CHECK-LABEL: f344:
1708; CHECK:         .functype f344 () -> ()
1709; CHECK-NEXT:    .local i32, i32
1710; CHECK-NEXT:  # %bb.0:
1711; CHECK-NEXT:    call op_0_to_3
1712; CHECK-NEXT:    drop
1713; CHECK-NEXT:    local.set 0
1714; CHECK-NEXT:    local.tee 1
1715; CHECK-NEXT:    local.get 0
1716; CHECK-NEXT:    call op_2_to_0
1717; CHECK-NEXT:    local.get 0
1718; CHECK-NEXT:    local.get 1
1719; CHECK-NEXT:    call op_2_to_0
1720; CHECK-NEXT:    # fallthrough-return
1721  %t0 = call {i32, i32, i32} @op_0_to_3()
1722  %t1 = extractvalue {i32, i32, i32} %t0, 0
1723  %t2 = extractvalue {i32, i32, i32} %t0, 1
1724  call void @op_2_to_0(i32 %t1, i32 %t2)
1725  %t3 = extractvalue {i32, i32, i32} %t0, 1
1726  %t4 = extractvalue {i32, i32, i32} %t0, 0
1727  call void @op_2_to_0(i32 %t3, i32 %t4)
1728  ret void
1729}
1730
1731define void @f346() {
1732; CHECK-LABEL: f346:
1733; CHECK:         .functype f346 () -> ()
1734; CHECK-NEXT:    .local i32, i32
1735; CHECK-NEXT:  # %bb.0:
1736; CHECK-NEXT:    call op_0_to_3
1737; CHECK-NEXT:    local.set 1
1738; CHECK-NEXT:    local.set 0
1739; CHECK-NEXT:    local.get 0
1740; CHECK-NEXT:    call op_2_to_0
1741; CHECK-NEXT:    local.get 0
1742; CHECK-NEXT:    local.get 1
1743; CHECK-NEXT:    call op_2_to_0
1744; CHECK-NEXT:    # fallthrough-return
1745  %t0 = call {i32, i32, i32} @op_0_to_3()
1746  %t1 = extractvalue {i32, i32, i32} %t0, 0
1747  %t2 = extractvalue {i32, i32, i32} %t0, 1
1748  call void @op_2_to_0(i32 %t1, i32 %t2)
1749  %t3 = extractvalue {i32, i32, i32} %t0, 1
1750  %t4 = extractvalue {i32, i32, i32} %t0, 2
1751  call void @op_2_to_0(i32 %t3, i32 %t4)
1752  ret void
1753}
1754
1755define void @f347() {
1756; CHECK-LABEL: f347:
1757; CHECK:         .functype f347 () -> ()
1758; CHECK-NEXT:    .local i32, i32, i32
1759; CHECK-NEXT:  # %bb.0:
1760; CHECK-NEXT:    call op_0_to_3
1761; CHECK-NEXT:    local.set 1
1762; CHECK-NEXT:    local.set 0
1763; CHECK-NEXT:    local.tee 2
1764; CHECK-NEXT:    local.get 0
1765; CHECK-NEXT:    call op_2_to_0
1766; CHECK-NEXT:    local.get 1
1767; CHECK-NEXT:    local.get 2
1768; CHECK-NEXT:    call op_2_to_0
1769; CHECK-NEXT:    # fallthrough-return
1770  %t0 = call {i32, i32, i32} @op_0_to_3()
1771  %t1 = extractvalue {i32, i32, i32} %t0, 0
1772  %t2 = extractvalue {i32, i32, i32} %t0, 1
1773  call void @op_2_to_0(i32 %t1, i32 %t2)
1774  %t3 = extractvalue {i32, i32, i32} %t0, 2
1775  %t4 = extractvalue {i32, i32, i32} %t0, 0
1776  call void @op_2_to_0(i32 %t3, i32 %t4)
1777  ret void
1778}
1779
1780define void @f348() {
1781; CHECK-LABEL: f348:
1782; CHECK:         .functype f348 () -> ()
1783; CHECK-NEXT:    .local i32, i32
1784; CHECK-NEXT:  # %bb.0:
1785; CHECK-NEXT:    call op_0_to_3
1786; CHECK-NEXT:    local.set 1
1787; CHECK-NEXT:    local.set 0
1788; CHECK-NEXT:    local.get 0
1789; CHECK-NEXT:    call op_2_to_0
1790; CHECK-NEXT:    local.get 1
1791; CHECK-NEXT:    local.get 0
1792; CHECK-NEXT:    call op_2_to_0
1793; CHECK-NEXT:    # fallthrough-return
1794  %t0 = call {i32, i32, i32} @op_0_to_3()
1795  %t1 = extractvalue {i32, i32, i32} %t0, 0
1796  %t2 = extractvalue {i32, i32, i32} %t0, 1
1797  call void @op_2_to_0(i32 %t1, i32 %t2)
1798  %t3 = extractvalue {i32, i32, i32} %t0, 2
1799  %t4 = extractvalue {i32, i32, i32} %t0, 1
1800  call void @op_2_to_0(i32 %t3, i32 %t4)
1801  ret void
1802}
1803
1804define void @f349() {
1805; CHECK-LABEL: f349:
1806; CHECK:         .functype f349 () -> ()
1807; CHECK-NEXT:    .local i32
1808; CHECK-NEXT:  # %bb.0:
1809; CHECK-NEXT:    call op_0_to_3
1810; CHECK-NEXT:    local.set 0
1811; CHECK-NEXT:    call op_2_to_0
1812; CHECK-NEXT:    local.get 0
1813; CHECK-NEXT:    local.get 0
1814; CHECK-NEXT:    call op_2_to_0
1815; CHECK-NEXT:    # fallthrough-return
1816  %t0 = call {i32, i32, i32} @op_0_to_3()
1817  %t1 = extractvalue {i32, i32, i32} %t0, 0
1818  %t2 = extractvalue {i32, i32, i32} %t0, 1
1819  call void @op_2_to_0(i32 %t1, i32 %t2)
1820  %t3 = extractvalue {i32, i32, i32} %t0, 2
1821  %t4 = extractvalue {i32, i32, i32} %t0, 2
1822  call void @op_2_to_0(i32 %t3, i32 %t4)
1823  ret void
1824}
1825
1826define void @f350() {
1827; CHECK-LABEL: f350:
1828; CHECK:         .functype f350 () -> ()
1829; CHECK-NEXT:    .local i32, i32
1830; CHECK-NEXT:  # %bb.0:
1831; CHECK-NEXT:    call op_0_to_3
1832; CHECK-NEXT:    local.set 0
1833; CHECK-NEXT:    drop
1834; CHECK-NEXT:    local.tee 1
1835; CHECK-NEXT:    local.get 0
1836; CHECK-NEXT:    call op_2_to_0
1837; CHECK-NEXT:    local.get 1
1838; CHECK-NEXT:    call op_1_to_0
1839; CHECK-NEXT:    # fallthrough-return
1840  %t0 = call {i32, i32, i32} @op_0_to_3()
1841  %t1 = extractvalue {i32, i32, i32} %t0, 0
1842  %t2 = extractvalue {i32, i32, i32} %t0, 2
1843  call void @op_2_to_0(i32 %t1, i32 %t2)
1844  %t3 = extractvalue {i32, i32, i32} %t0, 0
1845  call void @op_1_to_0(i32 %t3)
1846  ret void
1847}
1848
1849define void @f351() {
1850; CHECK-LABEL: f351:
1851; CHECK:         .functype f351 () -> ()
1852; CHECK-NEXT:    .local i32, i32
1853; CHECK-NEXT:  # %bb.0:
1854; CHECK-NEXT:    call op_0_to_3
1855; CHECK-NEXT:    local.set 1
1856; CHECK-NEXT:    local.set 0
1857; CHECK-NEXT:    local.get 1
1858; CHECK-NEXT:    call op_2_to_0
1859; CHECK-NEXT:    local.get 0
1860; CHECK-NEXT:    call op_1_to_0
1861; CHECK-NEXT:    # fallthrough-return
1862  %t0 = call {i32, i32, i32} @op_0_to_3()
1863  %t1 = extractvalue {i32, i32, i32} %t0, 0
1864  %t2 = extractvalue {i32, i32, i32} %t0, 2
1865  call void @op_2_to_0(i32 %t1, i32 %t2)
1866  %t3 = extractvalue {i32, i32, i32} %t0, 1
1867  call void @op_1_to_0(i32 %t3)
1868  ret void
1869}
1870
1871define void @f352() {
1872; CHECK-LABEL: f352:
1873; CHECK:         .functype f352 () -> ()
1874; CHECK-NEXT:    .local i32
1875; CHECK-NEXT:  # %bb.0:
1876; CHECK-NEXT:    call op_0_to_3
1877; CHECK-NEXT:    local.set 0
1878; CHECK-NEXT:    drop
1879; CHECK-NEXT:    local.get 0
1880; CHECK-NEXT:    call op_2_to_0
1881; CHECK-NEXT:    local.get 0
1882; CHECK-NEXT:    call op_1_to_0
1883; CHECK-NEXT:    # fallthrough-return
1884  %t0 = call {i32, i32, i32} @op_0_to_3()
1885  %t1 = extractvalue {i32, i32, i32} %t0, 0
1886  %t2 = extractvalue {i32, i32, i32} %t0, 2
1887  call void @op_2_to_0(i32 %t1, i32 %t2)
1888  %t3 = extractvalue {i32, i32, i32} %t0, 2
1889  call void @op_1_to_0(i32 %t3)
1890  ret void
1891}
1892
1893define void @f354() {
1894; CHECK-LABEL: f354:
1895; CHECK:         .functype f354 () -> ()
1896; CHECK-NEXT:    .local i32, i32, i32
1897; CHECK-NEXT:  # %bb.0:
1898; CHECK-NEXT:    call op_0_to_3
1899; CHECK-NEXT:    local.set 1
1900; CHECK-NEXT:    local.set 0
1901; CHECK-NEXT:    local.tee 2
1902; CHECK-NEXT:    local.get 1
1903; CHECK-NEXT:    call op_2_to_0
1904; CHECK-NEXT:    local.get 2
1905; CHECK-NEXT:    local.get 0
1906; CHECK-NEXT:    call op_2_to_0
1907; CHECK-NEXT:    # fallthrough-return
1908  %t0 = call {i32, i32, i32} @op_0_to_3()
1909  %t1 = extractvalue {i32, i32, i32} %t0, 0
1910  %t2 = extractvalue {i32, i32, i32} %t0, 2
1911  call void @op_2_to_0(i32 %t1, i32 %t2)
1912  %t3 = extractvalue {i32, i32, i32} %t0, 0
1913  %t4 = extractvalue {i32, i32, i32} %t0, 1
1914  call void @op_2_to_0(i32 %t3, i32 %t4)
1915  ret void
1916}
1917
1918define void @f356() {
1919; CHECK-LABEL: f356:
1920; CHECK:         .functype f356 () -> ()
1921; CHECK-NEXT:    .local i32, i32, i32
1922; CHECK-NEXT:  # %bb.0:
1923; CHECK-NEXT:    call op_0_to_3
1924; CHECK-NEXT:    local.set 1
1925; CHECK-NEXT:    local.set 0
1926; CHECK-NEXT:    local.tee 2
1927; CHECK-NEXT:    local.get 1
1928; CHECK-NEXT:    call op_2_to_0
1929; CHECK-NEXT:    local.get 0
1930; CHECK-NEXT:    local.get 2
1931; CHECK-NEXT:    call op_2_to_0
1932; CHECK-NEXT:    # fallthrough-return
1933  %t0 = call {i32, i32, i32} @op_0_to_3()
1934  %t1 = extractvalue {i32, i32, i32} %t0, 0
1935  %t2 = extractvalue {i32, i32, i32} %t0, 2
1936  call void @op_2_to_0(i32 %t1, i32 %t2)
1937  %t3 = extractvalue {i32, i32, i32} %t0, 1
1938  %t4 = extractvalue {i32, i32, i32} %t0, 0
1939  call void @op_2_to_0(i32 %t3, i32 %t4)
1940  ret void
1941}
1942
1943define void @f357() {
1944; CHECK-LABEL: f357:
1945; CHECK:         .functype f357 () -> ()
1946; CHECK-NEXT:    .local i32, i32
1947; CHECK-NEXT:  # %bb.0:
1948; CHECK-NEXT:    call op_0_to_3
1949; CHECK-NEXT:    local.set 1
1950; CHECK-NEXT:    local.set 0
1951; CHECK-NEXT:    local.get 1
1952; CHECK-NEXT:    call op_2_to_0
1953; CHECK-NEXT:    local.get 0
1954; CHECK-NEXT:    local.get 0
1955; CHECK-NEXT:    call op_2_to_0
1956; CHECK-NEXT:    # fallthrough-return
1957  %t0 = call {i32, i32, i32} @op_0_to_3()
1958  %t1 = extractvalue {i32, i32, i32} %t0, 0
1959  %t2 = extractvalue {i32, i32, i32} %t0, 2
1960  call void @op_2_to_0(i32 %t1, i32 %t2)
1961  %t3 = extractvalue {i32, i32, i32} %t0, 1
1962  %t4 = extractvalue {i32, i32, i32} %t0, 1
1963  call void @op_2_to_0(i32 %t3, i32 %t4)
1964  ret void
1965}
1966
1967define void @f358() {
1968; CHECK-LABEL: f358:
1969; CHECK:         .functype f358 () -> ()
1970; CHECK-NEXT:    .local i32, i32
1971; CHECK-NEXT:  # %bb.0:
1972; CHECK-NEXT:    call op_0_to_3
1973; CHECK-NEXT:    local.set 1
1974; CHECK-NEXT:    local.set 0
1975; CHECK-NEXT:    local.get 1
1976; CHECK-NEXT:    call op_2_to_0
1977; CHECK-NEXT:    local.get 0
1978; CHECK-NEXT:    local.get 1
1979; CHECK-NEXT:    call op_2_to_0
1980; CHECK-NEXT:    # fallthrough-return
1981  %t0 = call {i32, i32, i32} @op_0_to_3()
1982  %t1 = extractvalue {i32, i32, i32} %t0, 0
1983  %t2 = extractvalue {i32, i32, i32} %t0, 2
1984  call void @op_2_to_0(i32 %t1, i32 %t2)
1985  %t3 = extractvalue {i32, i32, i32} %t0, 1
1986  %t4 = extractvalue {i32, i32, i32} %t0, 2
1987  call void @op_2_to_0(i32 %t3, i32 %t4)
1988  ret void
1989}
1990
1991define void @f359() {
1992; CHECK-LABEL: f359:
1993; CHECK:         .functype f359 () -> ()
1994; CHECK-NEXT:    .local i32, i32
1995; CHECK-NEXT:  # %bb.0:
1996; CHECK-NEXT:    call op_0_to_3
1997; CHECK-NEXT:    local.set 0
1998; CHECK-NEXT:    drop
1999; CHECK-NEXT:    local.tee 1
2000; CHECK-NEXT:    local.get 0
2001; CHECK-NEXT:    call op_2_to_0
2002; CHECK-NEXT:    local.get 0
2003; CHECK-NEXT:    local.get 1
2004; CHECK-NEXT:    call op_2_to_0
2005; CHECK-NEXT:    # fallthrough-return
2006  %t0 = call {i32, i32, i32} @op_0_to_3()
2007  %t1 = extractvalue {i32, i32, i32} %t0, 0
2008  %t2 = extractvalue {i32, i32, i32} %t0, 2
2009  call void @op_2_to_0(i32 %t1, i32 %t2)
2010  %t3 = extractvalue {i32, i32, i32} %t0, 2
2011  %t4 = extractvalue {i32, i32, i32} %t0, 0
2012  call void @op_2_to_0(i32 %t3, i32 %t4)
2013  ret void
2014}
2015
2016define void @f360() {
2017; CHECK-LABEL: f360:
2018; CHECK:         .functype f360 () -> ()
2019; CHECK-NEXT:    .local i32, i32
2020; CHECK-NEXT:  # %bb.0:
2021; CHECK-NEXT:    call op_0_to_3
2022; CHECK-NEXT:    local.set 1
2023; CHECK-NEXT:    local.set 0
2024; CHECK-NEXT:    local.get 1
2025; CHECK-NEXT:    call op_2_to_0
2026; CHECK-NEXT:    local.get 1
2027; CHECK-NEXT:    local.get 0
2028; CHECK-NEXT:    call op_2_to_0
2029; CHECK-NEXT:    # fallthrough-return
2030  %t0 = call {i32, i32, i32} @op_0_to_3()
2031  %t1 = extractvalue {i32, i32, i32} %t0, 0
2032  %t2 = extractvalue {i32, i32, i32} %t0, 2
2033  call void @op_2_to_0(i32 %t1, i32 %t2)
2034  %t3 = extractvalue {i32, i32, i32} %t0, 2
2035  %t4 = extractvalue {i32, i32, i32} %t0, 1
2036  call void @op_2_to_0(i32 %t3, i32 %t4)
2037  ret void
2038}
2039
2040define void @f362() {
2041; CHECK-LABEL: f362:
2042; CHECK:         .functype f362 () -> ()
2043; CHECK-NEXT:    .local i32, i32
2044; CHECK-NEXT:  # %bb.0:
2045; CHECK-NEXT:    call op_0_to_3
2046; CHECK-NEXT:    drop
2047; CHECK-NEXT:    local.set 1
2048; CHECK-NEXT:    local.set 0
2049; CHECK-NEXT:    local.get 1
2050; CHECK-NEXT:    local.get 0
2051; CHECK-NEXT:    call op_2_to_0
2052; CHECK-NEXT:    local.get 0
2053; CHECK-NEXT:    call op_1_to_0
2054; CHECK-NEXT:    # fallthrough-return
2055  %t0 = call {i32, i32, i32} @op_0_to_3()
2056  %t1 = extractvalue {i32, i32, i32} %t0, 1
2057  %t2 = extractvalue {i32, i32, i32} %t0, 0
2058  call void @op_2_to_0(i32 %t1, i32 %t2)
2059  %t3 = extractvalue {i32, i32, i32} %t0, 0
2060  call void @op_1_to_0(i32 %t3)
2061  ret void
2062}
2063
2064define void @f363() {
2065; CHECK-LABEL: f363:
2066; CHECK:         .functype f363 () -> ()
2067; CHECK-NEXT:    .local i32, i32
2068; CHECK-NEXT:  # %bb.0:
2069; CHECK-NEXT:    call op_0_to_3
2070; CHECK-NEXT:    drop
2071; CHECK-NEXT:    local.set 1
2072; CHECK-NEXT:    local.set 0
2073; CHECK-NEXT:    local.get 1
2074; CHECK-NEXT:    local.get 0
2075; CHECK-NEXT:    call op_2_to_0
2076; CHECK-NEXT:    local.get 1
2077; CHECK-NEXT:    call op_1_to_0
2078; CHECK-NEXT:    # fallthrough-return
2079  %t0 = call {i32, i32, i32} @op_0_to_3()
2080  %t1 = extractvalue {i32, i32, i32} %t0, 1
2081  %t2 = extractvalue {i32, i32, i32} %t0, 0
2082  call void @op_2_to_0(i32 %t1, i32 %t2)
2083  %t3 = extractvalue {i32, i32, i32} %t0, 1
2084  call void @op_1_to_0(i32 %t3)
2085  ret void
2086}
2087
2088define void @f364() {
2089; CHECK-LABEL: f364:
2090; CHECK:         .functype f364 () -> ()
2091; CHECK-NEXT:    .local i32, i32, i32
2092; CHECK-NEXT:  # %bb.0:
2093; CHECK-NEXT:    call op_0_to_3
2094; CHECK-NEXT:    local.set 2
2095; CHECK-NEXT:    local.set 1
2096; CHECK-NEXT:    local.set 0
2097; CHECK-NEXT:    local.get 1
2098; CHECK-NEXT:    local.get 0
2099; CHECK-NEXT:    call op_2_to_0
2100; CHECK-NEXT:    local.get 2
2101; CHECK-NEXT:    call op_1_to_0
2102; CHECK-NEXT:    # fallthrough-return
2103  %t0 = call {i32, i32, i32} @op_0_to_3()
2104  %t1 = extractvalue {i32, i32, i32} %t0, 1
2105  %t2 = extractvalue {i32, i32, i32} %t0, 0
2106  call void @op_2_to_0(i32 %t1, i32 %t2)
2107  %t3 = extractvalue {i32, i32, i32} %t0, 2
2108  call void @op_1_to_0(i32 %t3)
2109  ret void
2110}
2111
2112define void @f366() {
2113; CHECK-LABEL: f366:
2114; CHECK:         .functype f366 () -> ()
2115; CHECK-NEXT:    .local i32, i32
2116; CHECK-NEXT:  # %bb.0:
2117; CHECK-NEXT:    call op_0_to_3
2118; CHECK-NEXT:    drop
2119; CHECK-NEXT:    local.set 1
2120; CHECK-NEXT:    local.set 0
2121; CHECK-NEXT:    local.get 1
2122; CHECK-NEXT:    local.get 0
2123; CHECK-NEXT:    call op_2_to_0
2124; CHECK-NEXT:    local.get 0
2125; CHECK-NEXT:    local.get 1
2126; CHECK-NEXT:    call op_2_to_0
2127; CHECK-NEXT:    # fallthrough-return
2128  %t0 = call {i32, i32, i32} @op_0_to_3()
2129  %t1 = extractvalue {i32, i32, i32} %t0, 1
2130  %t2 = extractvalue {i32, i32, i32} %t0, 0
2131  call void @op_2_to_0(i32 %t1, i32 %t2)
2132  %t3 = extractvalue {i32, i32, i32} %t0, 0
2133  %t4 = extractvalue {i32, i32, i32} %t0, 1
2134  call void @op_2_to_0(i32 %t3, i32 %t4)
2135  ret void
2136}
2137
2138define void @f367() {
2139; CHECK-LABEL: f367:
2140; CHECK:         .functype f367 () -> ()
2141; CHECK-NEXT:    .local i32, i32, i32
2142; CHECK-NEXT:  # %bb.0:
2143; CHECK-NEXT:    call op_0_to_3
2144; CHECK-NEXT:    local.set 2
2145; CHECK-NEXT:    local.set 1
2146; CHECK-NEXT:    local.set 0
2147; CHECK-NEXT:    local.get 1
2148; CHECK-NEXT:    local.get 0
2149; CHECK-NEXT:    call op_2_to_0
2150; CHECK-NEXT:    local.get 0
2151; CHECK-NEXT:    local.get 2
2152; CHECK-NEXT:    call op_2_to_0
2153; CHECK-NEXT:    # fallthrough-return
2154  %t0 = call {i32, i32, i32} @op_0_to_3()
2155  %t1 = extractvalue {i32, i32, i32} %t0, 1
2156  %t2 = extractvalue {i32, i32, i32} %t0, 0
2157  call void @op_2_to_0(i32 %t1, i32 %t2)
2158  %t3 = extractvalue {i32, i32, i32} %t0, 0
2159  %t4 = extractvalue {i32, i32, i32} %t0, 2
2160  call void @op_2_to_0(i32 %t3, i32 %t4)
2161  ret void
2162}
2163
2164define void @f370() {
2165; CHECK-LABEL: f370:
2166; CHECK:         .functype f370 () -> ()
2167; CHECK-NEXT:    .local i32, i32, i32
2168; CHECK-NEXT:  # %bb.0:
2169; CHECK-NEXT:    call op_0_to_3
2170; CHECK-NEXT:    local.set 2
2171; CHECK-NEXT:    local.set 1
2172; CHECK-NEXT:    local.set 0
2173; CHECK-NEXT:    local.get 1
2174; CHECK-NEXT:    local.get 0
2175; CHECK-NEXT:    call op_2_to_0
2176; CHECK-NEXT:    local.get 1
2177; CHECK-NEXT:    local.get 2
2178; CHECK-NEXT:    call op_2_to_0
2179; CHECK-NEXT:    # fallthrough-return
2180  %t0 = call {i32, i32, i32} @op_0_to_3()
2181  %t1 = extractvalue {i32, i32, i32} %t0, 1
2182  %t2 = extractvalue {i32, i32, i32} %t0, 0
2183  call void @op_2_to_0(i32 %t1, i32 %t2)
2184  %t3 = extractvalue {i32, i32, i32} %t0, 1
2185  %t4 = extractvalue {i32, i32, i32} %t0, 2
2186  call void @op_2_to_0(i32 %t3, i32 %t4)
2187  ret void
2188}
2189
2190define void @f371() {
2191; CHECK-LABEL: f371:
2192; CHECK:         .functype f371 () -> ()
2193; CHECK-NEXT:    .local i32, i32, i32
2194; CHECK-NEXT:  # %bb.0:
2195; CHECK-NEXT:    call op_0_to_3
2196; CHECK-NEXT:    local.set 2
2197; CHECK-NEXT:    local.set 1
2198; CHECK-NEXT:    local.set 0
2199; CHECK-NEXT:    local.get 1
2200; CHECK-NEXT:    local.get 0
2201; CHECK-NEXT:    call op_2_to_0
2202; CHECK-NEXT:    local.get 2
2203; CHECK-NEXT:    local.get 0
2204; CHECK-NEXT:    call op_2_to_0
2205; CHECK-NEXT:    # fallthrough-return
2206  %t0 = call {i32, i32, i32} @op_0_to_3()
2207  %t1 = extractvalue {i32, i32, i32} %t0, 1
2208  %t2 = extractvalue {i32, i32, i32} %t0, 0
2209  call void @op_2_to_0(i32 %t1, i32 %t2)
2210  %t3 = extractvalue {i32, i32, i32} %t0, 2
2211  %t4 = extractvalue {i32, i32, i32} %t0, 0
2212  call void @op_2_to_0(i32 %t3, i32 %t4)
2213  ret void
2214}
2215
2216define void @f372() {
2217; CHECK-LABEL: f372:
2218; CHECK:         .functype f372 () -> ()
2219; CHECK-NEXT:    .local i32, i32, i32
2220; CHECK-NEXT:  # %bb.0:
2221; CHECK-NEXT:    call op_0_to_3
2222; CHECK-NEXT:    local.set 2
2223; CHECK-NEXT:    local.set 1
2224; CHECK-NEXT:    local.set 0
2225; CHECK-NEXT:    local.get 1
2226; CHECK-NEXT:    local.get 0
2227; CHECK-NEXT:    call op_2_to_0
2228; CHECK-NEXT:    local.get 2
2229; CHECK-NEXT:    local.get 1
2230; CHECK-NEXT:    call op_2_to_0
2231; CHECK-NEXT:    # fallthrough-return
2232  %t0 = call {i32, i32, i32} @op_0_to_3()
2233  %t1 = extractvalue {i32, i32, i32} %t0, 1
2234  %t2 = extractvalue {i32, i32, i32} %t0, 0
2235  call void @op_2_to_0(i32 %t1, i32 %t2)
2236  %t3 = extractvalue {i32, i32, i32} %t0, 2
2237  %t4 = extractvalue {i32, i32, i32} %t0, 1
2238  call void @op_2_to_0(i32 %t3, i32 %t4)
2239  ret void
2240}
2241
2242define void @f373() {
2243; CHECK-LABEL: f373:
2244; CHECK:         .functype f373 () -> ()
2245; CHECK-NEXT:    .local i32, i32, i32
2246; CHECK-NEXT:  # %bb.0:
2247; CHECK-NEXT:    call op_0_to_3
2248; CHECK-NEXT:    local.set 2
2249; CHECK-NEXT:    local.set 1
2250; CHECK-NEXT:    local.set 0
2251; CHECK-NEXT:    local.get 1
2252; CHECK-NEXT:    local.get 0
2253; CHECK-NEXT:    call op_2_to_0
2254; CHECK-NEXT:    local.get 2
2255; CHECK-NEXT:    local.get 2
2256; CHECK-NEXT:    call op_2_to_0
2257; CHECK-NEXT:    # fallthrough-return
2258  %t0 = call {i32, i32, i32} @op_0_to_3()
2259  %t1 = extractvalue {i32, i32, i32} %t0, 1
2260  %t2 = extractvalue {i32, i32, i32} %t0, 0
2261  call void @op_2_to_0(i32 %t1, i32 %t2)
2262  %t3 = extractvalue {i32, i32, i32} %t0, 2
2263  %t4 = extractvalue {i32, i32, i32} %t0, 2
2264  call void @op_2_to_0(i32 %t3, i32 %t4)
2265  ret void
2266}
2267
2268define void @f374() {
2269; CHECK-LABEL: f374:
2270; CHECK:         .functype f374 () -> ()
2271; CHECK-NEXT:    .local i32, i32
2272; CHECK-NEXT:  # %bb.0:
2273; CHECK-NEXT:    call op_0_to_3
2274; CHECK-NEXT:    drop
2275; CHECK-NEXT:    local.set 1
2276; CHECK-NEXT:    local.set 0
2277; CHECK-NEXT:    local.get 1
2278; CHECK-NEXT:    local.get 1
2279; CHECK-NEXT:    call op_2_to_0
2280; CHECK-NEXT:    local.get 0
2281; CHECK-NEXT:    call op_1_to_0
2282; CHECK-NEXT:    # fallthrough-return
2283  %t0 = call {i32, i32, i32} @op_0_to_3()
2284  %t1 = extractvalue {i32, i32, i32} %t0, 1
2285  %t2 = extractvalue {i32, i32, i32} %t0, 1
2286  call void @op_2_to_0(i32 %t1, i32 %t2)
2287  %t3 = extractvalue {i32, i32, i32} %t0, 0
2288  call void @op_1_to_0(i32 %t3)
2289  ret void
2290}
2291
2292define void @f376() {
2293; CHECK-LABEL: f376:
2294; CHECK:         .functype f376 () -> ()
2295; CHECK-NEXT:    .local i32, i32
2296; CHECK-NEXT:  # %bb.0:
2297; CHECK-NEXT:    call op_0_to_3
2298; CHECK-NEXT:    local.set 1
2299; CHECK-NEXT:    local.set 0
2300; CHECK-NEXT:    drop
2301; CHECK-NEXT:    local.get 0
2302; CHECK-NEXT:    local.get 0
2303; CHECK-NEXT:    call op_2_to_0
2304; CHECK-NEXT:    local.get 1
2305; CHECK-NEXT:    call op_1_to_0
2306; CHECK-NEXT:    # fallthrough-return
2307  %t0 = call {i32, i32, i32} @op_0_to_3()
2308  %t1 = extractvalue {i32, i32, i32} %t0, 1
2309  %t2 = extractvalue {i32, i32, i32} %t0, 1
2310  call void @op_2_to_0(i32 %t1, i32 %t2)
2311  %t3 = extractvalue {i32, i32, i32} %t0, 2
2312  call void @op_1_to_0(i32 %t3)
2313  ret void
2314}
2315
2316define void @f377() {
2317; CHECK-LABEL: f377:
2318; CHECK:         .functype f377 () -> ()
2319; CHECK-NEXT:    .local i32, i32
2320; CHECK-NEXT:  # %bb.0:
2321; CHECK-NEXT:    call op_0_to_3
2322; CHECK-NEXT:    drop
2323; CHECK-NEXT:    local.set 1
2324; CHECK-NEXT:    local.set 0
2325; CHECK-NEXT:    local.get 1
2326; CHECK-NEXT:    local.get 1
2327; CHECK-NEXT:    call op_2_to_0
2328; CHECK-NEXT:    local.get 0
2329; CHECK-NEXT:    local.get 0
2330; CHECK-NEXT:    call op_2_to_0
2331; CHECK-NEXT:    # fallthrough-return
2332  %t0 = call {i32, i32, i32} @op_0_to_3()
2333  %t1 = extractvalue {i32, i32, i32} %t0, 1
2334  %t2 = extractvalue {i32, i32, i32} %t0, 1
2335  call void @op_2_to_0(i32 %t1, i32 %t2)
2336  %t3 = extractvalue {i32, i32, i32} %t0, 0
2337  %t4 = extractvalue {i32, i32, i32} %t0, 0
2338  call void @op_2_to_0(i32 %t3, i32 %t4)
2339  ret void
2340}
2341
2342define void @f379() {
2343; CHECK-LABEL: f379:
2344; CHECK:         .functype f379 () -> ()
2345; CHECK-NEXT:    .local i32, i32, i32
2346; CHECK-NEXT:  # %bb.0:
2347; CHECK-NEXT:    call op_0_to_3
2348; CHECK-NEXT:    local.set 2
2349; CHECK-NEXT:    local.set 1
2350; CHECK-NEXT:    local.set 0
2351; CHECK-NEXT:    local.get 1
2352; CHECK-NEXT:    local.get 1
2353; CHECK-NEXT:    call op_2_to_0
2354; CHECK-NEXT:    local.get 0
2355; CHECK-NEXT:    local.get 2
2356; CHECK-NEXT:    call op_2_to_0
2357; CHECK-NEXT:    # fallthrough-return
2358  %t0 = call {i32, i32, i32} @op_0_to_3()
2359  %t1 = extractvalue {i32, i32, i32} %t0, 1
2360  %t2 = extractvalue {i32, i32, i32} %t0, 1
2361  call void @op_2_to_0(i32 %t1, i32 %t2)
2362  %t3 = extractvalue {i32, i32, i32} %t0, 0
2363  %t4 = extractvalue {i32, i32, i32} %t0, 2
2364  call void @op_2_to_0(i32 %t3, i32 %t4)
2365  ret void
2366}
2367
2368define void @f383() {
2369; CHECK-LABEL: f383:
2370; CHECK:         .functype f383 () -> ()
2371; CHECK-NEXT:    .local i32, i32, i32
2372; CHECK-NEXT:  # %bb.0:
2373; CHECK-NEXT:    call op_0_to_3
2374; CHECK-NEXT:    local.set 2
2375; CHECK-NEXT:    local.set 1
2376; CHECK-NEXT:    local.set 0
2377; CHECK-NEXT:    local.get 1
2378; CHECK-NEXT:    local.get 1
2379; CHECK-NEXT:    call op_2_to_0
2380; CHECK-NEXT:    local.get 2
2381; CHECK-NEXT:    local.get 0
2382; CHECK-NEXT:    call op_2_to_0
2383; CHECK-NEXT:    # fallthrough-return
2384  %t0 = call {i32, i32, i32} @op_0_to_3()
2385  %t1 = extractvalue {i32, i32, i32} %t0, 1
2386  %t2 = extractvalue {i32, i32, i32} %t0, 1
2387  call void @op_2_to_0(i32 %t1, i32 %t2)
2388  %t3 = extractvalue {i32, i32, i32} %t0, 2
2389  %t4 = extractvalue {i32, i32, i32} %t0, 0
2390  call void @op_2_to_0(i32 %t3, i32 %t4)
2391  ret void
2392}
2393
2394define void @f385() {
2395; CHECK-LABEL: f385:
2396; CHECK:         .functype f385 () -> ()
2397; CHECK-NEXT:    .local i32, i32
2398; CHECK-NEXT:  # %bb.0:
2399; CHECK-NEXT:    call op_0_to_3
2400; CHECK-NEXT:    local.set 1
2401; CHECK-NEXT:    local.set 0
2402; CHECK-NEXT:    drop
2403; CHECK-NEXT:    local.get 0
2404; CHECK-NEXT:    local.get 0
2405; CHECK-NEXT:    call op_2_to_0
2406; CHECK-NEXT:    local.get 1
2407; CHECK-NEXT:    local.get 1
2408; CHECK-NEXT:    call op_2_to_0
2409; CHECK-NEXT:    # fallthrough-return
2410  %t0 = call {i32, i32, i32} @op_0_to_3()
2411  %t1 = extractvalue {i32, i32, i32} %t0, 1
2412  %t2 = extractvalue {i32, i32, i32} %t0, 1
2413  call void @op_2_to_0(i32 %t1, i32 %t2)
2414  %t3 = extractvalue {i32, i32, i32} %t0, 2
2415  %t4 = extractvalue {i32, i32, i32} %t0, 2
2416  call void @op_2_to_0(i32 %t3, i32 %t4)
2417  ret void
2418}
2419
2420define void @f386() {
2421; CHECK-LABEL: f386:
2422; CHECK:         .functype f386 () -> ()
2423; CHECK-NEXT:    .local i32, i32, i32
2424; CHECK-NEXT:  # %bb.0:
2425; CHECK-NEXT:    call op_0_to_3
2426; CHECK-NEXT:    local.set 2
2427; CHECK-NEXT:    local.set 1
2428; CHECK-NEXT:    local.set 0
2429; CHECK-NEXT:    local.get 1
2430; CHECK-NEXT:    local.get 2
2431; CHECK-NEXT:    call op_2_to_0
2432; CHECK-NEXT:    local.get 0
2433; CHECK-NEXT:    call op_1_to_0
2434; CHECK-NEXT:    # fallthrough-return
2435  %t0 = call {i32, i32, i32} @op_0_to_3()
2436  %t1 = extractvalue {i32, i32, i32} %t0, 1
2437  %t2 = extractvalue {i32, i32, i32} %t0, 2
2438  call void @op_2_to_0(i32 %t1, i32 %t2)
2439  %t3 = extractvalue {i32, i32, i32} %t0, 0
2440  call void @op_1_to_0(i32 %t3)
2441  ret void
2442}
2443
2444define void @f387() {
2445; CHECK-LABEL: f387:
2446; CHECK:         .functype f387 () -> ()
2447; CHECK-NEXT:    .local i32, i32
2448; CHECK-NEXT:  # %bb.0:
2449; CHECK-NEXT:    call op_0_to_3
2450; CHECK-NEXT:    local.set 1
2451; CHECK-NEXT:    local.set 0
2452; CHECK-NEXT:    drop
2453; CHECK-NEXT:    local.get 0
2454; CHECK-NEXT:    local.get 1
2455; CHECK-NEXT:    call op_2_to_0
2456; CHECK-NEXT:    local.get 0
2457; CHECK-NEXT:    call op_1_to_0
2458; CHECK-NEXT:    # fallthrough-return
2459  %t0 = call {i32, i32, i32} @op_0_to_3()
2460  %t1 = extractvalue {i32, i32, i32} %t0, 1
2461  %t2 = extractvalue {i32, i32, i32} %t0, 2
2462  call void @op_2_to_0(i32 %t1, i32 %t2)
2463  %t3 = extractvalue {i32, i32, i32} %t0, 1
2464  call void @op_1_to_0(i32 %t3)
2465  ret void
2466}
2467
2468define void @f388() {
2469; CHECK-LABEL: f388:
2470; CHECK:         .functype f388 () -> ()
2471; CHECK-NEXT:    .local i32, i32
2472; CHECK-NEXT:  # %bb.0:
2473; CHECK-NEXT:    call op_0_to_3
2474; CHECK-NEXT:    local.set 1
2475; CHECK-NEXT:    local.set 0
2476; CHECK-NEXT:    drop
2477; CHECK-NEXT:    local.get 0
2478; CHECK-NEXT:    local.get 1
2479; CHECK-NEXT:    call op_2_to_0
2480; CHECK-NEXT:    local.get 1
2481; CHECK-NEXT:    call op_1_to_0
2482; CHECK-NEXT:    # fallthrough-return
2483  %t0 = call {i32, i32, i32} @op_0_to_3()
2484  %t1 = extractvalue {i32, i32, i32} %t0, 1
2485  %t2 = extractvalue {i32, i32, i32} %t0, 2
2486  call void @op_2_to_0(i32 %t1, i32 %t2)
2487  %t3 = extractvalue {i32, i32, i32} %t0, 2
2488  call void @op_1_to_0(i32 %t3)
2489  ret void
2490}
2491
2492define void @f389() {
2493; CHECK-LABEL: f389:
2494; CHECK:         .functype f389 () -> ()
2495; CHECK-NEXT:    .local i32, i32, i32
2496; CHECK-NEXT:  # %bb.0:
2497; CHECK-NEXT:    call op_0_to_3
2498; CHECK-NEXT:    local.set 2
2499; CHECK-NEXT:    local.set 1
2500; CHECK-NEXT:    local.set 0
2501; CHECK-NEXT:    local.get 1
2502; CHECK-NEXT:    local.get 2
2503; CHECK-NEXT:    call op_2_to_0
2504; CHECK-NEXT:    local.get 0
2505; CHECK-NEXT:    local.get 0
2506; CHECK-NEXT:    call op_2_to_0
2507; CHECK-NEXT:    # fallthrough-return
2508  %t0 = call {i32, i32, i32} @op_0_to_3()
2509  %t1 = extractvalue {i32, i32, i32} %t0, 1
2510  %t2 = extractvalue {i32, i32, i32} %t0, 2
2511  call void @op_2_to_0(i32 %t1, i32 %t2)
2512  %t3 = extractvalue {i32, i32, i32} %t0, 0
2513  %t4 = extractvalue {i32, i32, i32} %t0, 0
2514  call void @op_2_to_0(i32 %t3, i32 %t4)
2515  ret void
2516}
2517
2518define void @f390() {
2519; CHECK-LABEL: f390:
2520; CHECK:         .functype f390 () -> ()
2521; CHECK-NEXT:    .local i32, i32, i32
2522; CHECK-NEXT:  # %bb.0:
2523; CHECK-NEXT:    call op_0_to_3
2524; CHECK-NEXT:    local.set 2
2525; CHECK-NEXT:    local.set 1
2526; CHECK-NEXT:    local.set 0
2527; CHECK-NEXT:    local.get 1
2528; CHECK-NEXT:    local.get 2
2529; CHECK-NEXT:    call op_2_to_0
2530; CHECK-NEXT:    local.get 0
2531; CHECK-NEXT:    local.get 1
2532; CHECK-NEXT:    call op_2_to_0
2533; CHECK-NEXT:    # fallthrough-return
2534  %t0 = call {i32, i32, i32} @op_0_to_3()
2535  %t1 = extractvalue {i32, i32, i32} %t0, 1
2536  %t2 = extractvalue {i32, i32, i32} %t0, 2
2537  call void @op_2_to_0(i32 %t1, i32 %t2)
2538  %t3 = extractvalue {i32, i32, i32} %t0, 0
2539  %t4 = extractvalue {i32, i32, i32} %t0, 1
2540  call void @op_2_to_0(i32 %t3, i32 %t4)
2541  ret void
2542}
2543
2544define void @f391() {
2545; CHECK-LABEL: f391:
2546; CHECK:         .functype f391 () -> ()
2547; CHECK-NEXT:    .local i32, i32, i32
2548; CHECK-NEXT:  # %bb.0:
2549; CHECK-NEXT:    call op_0_to_3
2550; CHECK-NEXT:    local.set 2
2551; CHECK-NEXT:    local.set 1
2552; CHECK-NEXT:    local.set 0
2553; CHECK-NEXT:    local.get 1
2554; CHECK-NEXT:    local.get 2
2555; CHECK-NEXT:    call op_2_to_0
2556; CHECK-NEXT:    local.get 0
2557; CHECK-NEXT:    local.get 2
2558; CHECK-NEXT:    call op_2_to_0
2559; CHECK-NEXT:    # fallthrough-return
2560  %t0 = call {i32, i32, i32} @op_0_to_3()
2561  %t1 = extractvalue {i32, i32, i32} %t0, 1
2562  %t2 = extractvalue {i32, i32, i32} %t0, 2
2563  call void @op_2_to_0(i32 %t1, i32 %t2)
2564  %t3 = extractvalue {i32, i32, i32} %t0, 0
2565  %t4 = extractvalue {i32, i32, i32} %t0, 2
2566  call void @op_2_to_0(i32 %t3, i32 %t4)
2567  ret void
2568}
2569
2570define void @f392() {
2571; CHECK-LABEL: f392:
2572; CHECK:         .functype f392 () -> ()
2573; CHECK-NEXT:    .local i32, i32, i32
2574; CHECK-NEXT:  # %bb.0:
2575; CHECK-NEXT:    call op_0_to_3
2576; CHECK-NEXT:    local.set 2
2577; CHECK-NEXT:    local.set 1
2578; CHECK-NEXT:    local.set 0
2579; CHECK-NEXT:    local.get 1
2580; CHECK-NEXT:    local.get 2
2581; CHECK-NEXT:    call op_2_to_0
2582; CHECK-NEXT:    local.get 1
2583; CHECK-NEXT:    local.get 0
2584; CHECK-NEXT:    call op_2_to_0
2585; CHECK-NEXT:    # fallthrough-return
2586  %t0 = call {i32, i32, i32} @op_0_to_3()
2587  %t1 = extractvalue {i32, i32, i32} %t0, 1
2588  %t2 = extractvalue {i32, i32, i32} %t0, 2
2589  call void @op_2_to_0(i32 %t1, i32 %t2)
2590  %t3 = extractvalue {i32, i32, i32} %t0, 1
2591  %t4 = extractvalue {i32, i32, i32} %t0, 0
2592  call void @op_2_to_0(i32 %t3, i32 %t4)
2593  ret void
2594}
2595
2596define void @f395() {
2597; CHECK-LABEL: f395:
2598; CHECK:         .functype f395 () -> ()
2599; CHECK-NEXT:    .local i32, i32, i32
2600; CHECK-NEXT:  # %bb.0:
2601; CHECK-NEXT:    call op_0_to_3
2602; CHECK-NEXT:    local.set 2
2603; CHECK-NEXT:    local.set 1
2604; CHECK-NEXT:    local.set 0
2605; CHECK-NEXT:    local.get 1
2606; CHECK-NEXT:    local.get 2
2607; CHECK-NEXT:    call op_2_to_0
2608; CHECK-NEXT:    local.get 2
2609; CHECK-NEXT:    local.get 0
2610; CHECK-NEXT:    call op_2_to_0
2611; CHECK-NEXT:    # fallthrough-return
2612  %t0 = call {i32, i32, i32} @op_0_to_3()
2613  %t1 = extractvalue {i32, i32, i32} %t0, 1
2614  %t2 = extractvalue {i32, i32, i32} %t0, 2
2615  call void @op_2_to_0(i32 %t1, i32 %t2)
2616  %t3 = extractvalue {i32, i32, i32} %t0, 2
2617  %t4 = extractvalue {i32, i32, i32} %t0, 0
2618  call void @op_2_to_0(i32 %t3, i32 %t4)
2619  ret void
2620}
2621
2622define void @f396() {
2623; CHECK-LABEL: f396:
2624; CHECK:         .functype f396 () -> ()
2625; CHECK-NEXT:    .local i32, i32
2626; CHECK-NEXT:  # %bb.0:
2627; CHECK-NEXT:    call op_0_to_3
2628; CHECK-NEXT:    local.set 1
2629; CHECK-NEXT:    local.set 0
2630; CHECK-NEXT:    drop
2631; CHECK-NEXT:    local.get 0
2632; CHECK-NEXT:    local.get 1
2633; CHECK-NEXT:    call op_2_to_0
2634; CHECK-NEXT:    local.get 1
2635; CHECK-NEXT:    local.get 0
2636; CHECK-NEXT:    call op_2_to_0
2637; CHECK-NEXT:    # fallthrough-return
2638  %t0 = call {i32, i32, i32} @op_0_to_3()
2639  %t1 = extractvalue {i32, i32, i32} %t0, 1
2640  %t2 = extractvalue {i32, i32, i32} %t0, 2
2641  call void @op_2_to_0(i32 %t1, i32 %t2)
2642  %t3 = extractvalue {i32, i32, i32} %t0, 2
2643  %t4 = extractvalue {i32, i32, i32} %t0, 1
2644  call void @op_2_to_0(i32 %t3, i32 %t4)
2645  ret void
2646}
2647
2648define void @f398() {
2649; CHECK-LABEL: f398:
2650; CHECK:         .functype f398 () -> ()
2651; CHECK-NEXT:    .local i32, i32
2652; CHECK-NEXT:  # %bb.0:
2653; CHECK-NEXT:    call op_0_to_3
2654; CHECK-NEXT:    local.set 1
2655; CHECK-NEXT:    drop
2656; CHECK-NEXT:    local.set 0
2657; CHECK-NEXT:    local.get 1
2658; CHECK-NEXT:    local.get 0
2659; CHECK-NEXT:    call op_2_to_0
2660; CHECK-NEXT:    local.get 0
2661; CHECK-NEXT:    call op_1_to_0
2662; CHECK-NEXT:    # fallthrough-return
2663  %t0 = call {i32, i32, i32} @op_0_to_3()
2664  %t1 = extractvalue {i32, i32, i32} %t0, 2
2665  %t2 = extractvalue {i32, i32, i32} %t0, 0
2666  call void @op_2_to_0(i32 %t1, i32 %t2)
2667  %t3 = extractvalue {i32, i32, i32} %t0, 0
2668  call void @op_1_to_0(i32 %t3)
2669  ret void
2670}
2671
2672define void @f399() {
2673; CHECK-LABEL: f399:
2674; CHECK:         .functype f399 () -> ()
2675; CHECK-NEXT:    .local i32, i32, i32
2676; CHECK-NEXT:  # %bb.0:
2677; CHECK-NEXT:    call op_0_to_3
2678; CHECK-NEXT:    local.set 2
2679; CHECK-NEXT:    local.set 1
2680; CHECK-NEXT:    local.set 0
2681; CHECK-NEXT:    local.get 2
2682; CHECK-NEXT:    local.get 0
2683; CHECK-NEXT:    call op_2_to_0
2684; CHECK-NEXT:    local.get 1
2685; CHECK-NEXT:    call op_1_to_0
2686; CHECK-NEXT:    # fallthrough-return
2687  %t0 = call {i32, i32, i32} @op_0_to_3()
2688  %t1 = extractvalue {i32, i32, i32} %t0, 2
2689  %t2 = extractvalue {i32, i32, i32} %t0, 0
2690  call void @op_2_to_0(i32 %t1, i32 %t2)
2691  %t3 = extractvalue {i32, i32, i32} %t0, 1
2692  call void @op_1_to_0(i32 %t3)
2693  ret void
2694}
2695
2696define void @f400() {
2697; CHECK-LABEL: f400:
2698; CHECK:         .functype f400 () -> ()
2699; CHECK-NEXT:    .local i32, i32
2700; CHECK-NEXT:  # %bb.0:
2701; CHECK-NEXT:    call op_0_to_3
2702; CHECK-NEXT:    local.set 1
2703; CHECK-NEXT:    drop
2704; CHECK-NEXT:    local.set 0
2705; CHECK-NEXT:    local.get 1
2706; CHECK-NEXT:    local.get 0
2707; CHECK-NEXT:    call op_2_to_0
2708; CHECK-NEXT:    local.get 1
2709; CHECK-NEXT:    call op_1_to_0
2710; CHECK-NEXT:    # fallthrough-return
2711  %t0 = call {i32, i32, i32} @op_0_to_3()
2712  %t1 = extractvalue {i32, i32, i32} %t0, 2
2713  %t2 = extractvalue {i32, i32, i32} %t0, 0
2714  call void @op_2_to_0(i32 %t1, i32 %t2)
2715  %t3 = extractvalue {i32, i32, i32} %t0, 2
2716  call void @op_1_to_0(i32 %t3)
2717  ret void
2718}
2719
2720define void @f402() {
2721; CHECK-LABEL: f402:
2722; CHECK:         .functype f402 () -> ()
2723; CHECK-NEXT:    .local i32, i32, i32
2724; CHECK-NEXT:  # %bb.0:
2725; CHECK-NEXT:    call op_0_to_3
2726; CHECK-NEXT:    local.set 2
2727; CHECK-NEXT:    local.set 1
2728; CHECK-NEXT:    local.set 0
2729; CHECK-NEXT:    local.get 2
2730; CHECK-NEXT:    local.get 0
2731; CHECK-NEXT:    call op_2_to_0
2732; CHECK-NEXT:    local.get 0
2733; CHECK-NEXT:    local.get 1
2734; CHECK-NEXT:    call op_2_to_0
2735; CHECK-NEXT:    # fallthrough-return
2736  %t0 = call {i32, i32, i32} @op_0_to_3()
2737  %t1 = extractvalue {i32, i32, i32} %t0, 2
2738  %t2 = extractvalue {i32, i32, i32} %t0, 0
2739  call void @op_2_to_0(i32 %t1, i32 %t2)
2740  %t3 = extractvalue {i32, i32, i32} %t0, 0
2741  %t4 = extractvalue {i32, i32, i32} %t0, 1
2742  call void @op_2_to_0(i32 %t3, i32 %t4)
2743  ret void
2744}
2745
2746define void @f403() {
2747; CHECK-LABEL: f403:
2748; CHECK:         .functype f403 () -> ()
2749; CHECK-NEXT:    .local i32, i32
2750; CHECK-NEXT:  # %bb.0:
2751; CHECK-NEXT:    call op_0_to_3
2752; CHECK-NEXT:    local.set 1
2753; CHECK-NEXT:    drop
2754; CHECK-NEXT:    local.set 0
2755; CHECK-NEXT:    local.get 1
2756; CHECK-NEXT:    local.get 0
2757; CHECK-NEXT:    call op_2_to_0
2758; CHECK-NEXT:    local.get 0
2759; CHECK-NEXT:    local.get 1
2760; CHECK-NEXT:    call op_2_to_0
2761; CHECK-NEXT:    # fallthrough-return
2762  %t0 = call {i32, i32, i32} @op_0_to_3()
2763  %t1 = extractvalue {i32, i32, i32} %t0, 2
2764  %t2 = extractvalue {i32, i32, i32} %t0, 0
2765  call void @op_2_to_0(i32 %t1, i32 %t2)
2766  %t3 = extractvalue {i32, i32, i32} %t0, 0
2767  %t4 = extractvalue {i32, i32, i32} %t0, 2
2768  call void @op_2_to_0(i32 %t3, i32 %t4)
2769  ret void
2770}
2771
2772define void @f404() {
2773; CHECK-LABEL: f404:
2774; CHECK:         .functype f404 () -> ()
2775; CHECK-NEXT:    .local i32, i32, i32
2776; CHECK-NEXT:  # %bb.0:
2777; CHECK-NEXT:    call op_0_to_3
2778; CHECK-NEXT:    local.set 2
2779; CHECK-NEXT:    local.set 1
2780; CHECK-NEXT:    local.set 0
2781; CHECK-NEXT:    local.get 2
2782; CHECK-NEXT:    local.get 0
2783; CHECK-NEXT:    call op_2_to_0
2784; CHECK-NEXT:    local.get 1
2785; CHECK-NEXT:    local.get 0
2786; CHECK-NEXT:    call op_2_to_0
2787; CHECK-NEXT:    # fallthrough-return
2788  %t0 = call {i32, i32, i32} @op_0_to_3()
2789  %t1 = extractvalue {i32, i32, i32} %t0, 2
2790  %t2 = extractvalue {i32, i32, i32} %t0, 0
2791  call void @op_2_to_0(i32 %t1, i32 %t2)
2792  %t3 = extractvalue {i32, i32, i32} %t0, 1
2793  %t4 = extractvalue {i32, i32, i32} %t0, 0
2794  call void @op_2_to_0(i32 %t3, i32 %t4)
2795  ret void
2796}
2797
2798define void @f405() {
2799; CHECK-LABEL: f405:
2800; CHECK:         .functype f405 () -> ()
2801; CHECK-NEXT:    .local i32, i32, i32
2802; CHECK-NEXT:  # %bb.0:
2803; CHECK-NEXT:    call op_0_to_3
2804; CHECK-NEXT:    local.set 2
2805; CHECK-NEXT:    local.set 1
2806; CHECK-NEXT:    local.set 0
2807; CHECK-NEXT:    local.get 2
2808; CHECK-NEXT:    local.get 0
2809; CHECK-NEXT:    call op_2_to_0
2810; CHECK-NEXT:    local.get 1
2811; CHECK-NEXT:    local.get 1
2812; CHECK-NEXT:    call op_2_to_0
2813; CHECK-NEXT:    # fallthrough-return
2814  %t0 = call {i32, i32, i32} @op_0_to_3()
2815  %t1 = extractvalue {i32, i32, i32} %t0, 2
2816  %t2 = extractvalue {i32, i32, i32} %t0, 0
2817  call void @op_2_to_0(i32 %t1, i32 %t2)
2818  %t3 = extractvalue {i32, i32, i32} %t0, 1
2819  %t4 = extractvalue {i32, i32, i32} %t0, 1
2820  call void @op_2_to_0(i32 %t3, i32 %t4)
2821  ret void
2822}
2823
2824define void @f406() {
2825; CHECK-LABEL: f406:
2826; CHECK:         .functype f406 () -> ()
2827; CHECK-NEXT:    .local i32, i32, i32
2828; CHECK-NEXT:  # %bb.0:
2829; CHECK-NEXT:    call op_0_to_3
2830; CHECK-NEXT:    local.set 2
2831; CHECK-NEXT:    local.set 1
2832; CHECK-NEXT:    local.set 0
2833; CHECK-NEXT:    local.get 2
2834; CHECK-NEXT:    local.get 0
2835; CHECK-NEXT:    call op_2_to_0
2836; CHECK-NEXT:    local.get 1
2837; CHECK-NEXT:    local.get 2
2838; CHECK-NEXT:    call op_2_to_0
2839; CHECK-NEXT:    # fallthrough-return
2840  %t0 = call {i32, i32, i32} @op_0_to_3()
2841  %t1 = extractvalue {i32, i32, i32} %t0, 2
2842  %t2 = extractvalue {i32, i32, i32} %t0, 0
2843  call void @op_2_to_0(i32 %t1, i32 %t2)
2844  %t3 = extractvalue {i32, i32, i32} %t0, 1
2845  %t4 = extractvalue {i32, i32, i32} %t0, 2
2846  call void @op_2_to_0(i32 %t3, i32 %t4)
2847  ret void
2848}
2849
2850define void @f408() {
2851; CHECK-LABEL: f408:
2852; CHECK:         .functype f408 () -> ()
2853; CHECK-NEXT:    .local i32, i32, i32
2854; CHECK-NEXT:  # %bb.0:
2855; CHECK-NEXT:    call op_0_to_3
2856; CHECK-NEXT:    local.set 2
2857; CHECK-NEXT:    local.set 1
2858; CHECK-NEXT:    local.set 0
2859; CHECK-NEXT:    local.get 2
2860; CHECK-NEXT:    local.get 0
2861; CHECK-NEXT:    call op_2_to_0
2862; CHECK-NEXT:    local.get 2
2863; CHECK-NEXT:    local.get 1
2864; CHECK-NEXT:    call op_2_to_0
2865; CHECK-NEXT:    # fallthrough-return
2866  %t0 = call {i32, i32, i32} @op_0_to_3()
2867  %t1 = extractvalue {i32, i32, i32} %t0, 2
2868  %t2 = extractvalue {i32, i32, i32} %t0, 0
2869  call void @op_2_to_0(i32 %t1, i32 %t2)
2870  %t3 = extractvalue {i32, i32, i32} %t0, 2
2871  %t4 = extractvalue {i32, i32, i32} %t0, 1
2872  call void @op_2_to_0(i32 %t3, i32 %t4)
2873  ret void
2874}
2875
2876define void @f410() {
2877; CHECK-LABEL: f410:
2878; CHECK:         .functype f410 () -> ()
2879; CHECK-NEXT:    .local i32, i32, i32
2880; CHECK-NEXT:  # %bb.0:
2881; CHECK-NEXT:    call op_0_to_3
2882; CHECK-NEXT:    local.set 2
2883; CHECK-NEXT:    local.set 1
2884; CHECK-NEXT:    local.set 0
2885; CHECK-NEXT:    local.get 2
2886; CHECK-NEXT:    local.get 1
2887; CHECK-NEXT:    call op_2_to_0
2888; CHECK-NEXT:    local.get 0
2889; CHECK-NEXT:    call op_1_to_0
2890; CHECK-NEXT:    # fallthrough-return
2891  %t0 = call {i32, i32, i32} @op_0_to_3()
2892  %t1 = extractvalue {i32, i32, i32} %t0, 2
2893  %t2 = extractvalue {i32, i32, i32} %t0, 1
2894  call void @op_2_to_0(i32 %t1, i32 %t2)
2895  %t3 = extractvalue {i32, i32, i32} %t0, 0
2896  call void @op_1_to_0(i32 %t3)
2897  ret void
2898}
2899
2900define void @f411() {
2901; CHECK-LABEL: f411:
2902; CHECK:         .functype f411 () -> ()
2903; CHECK-NEXT:    .local i32, i32
2904; CHECK-NEXT:  # %bb.0:
2905; CHECK-NEXT:    call op_0_to_3
2906; CHECK-NEXT:    local.set 1
2907; CHECK-NEXT:    local.set 0
2908; CHECK-NEXT:    drop
2909; CHECK-NEXT:    local.get 1
2910; CHECK-NEXT:    local.get 0
2911; CHECK-NEXT:    call op_2_to_0
2912; CHECK-NEXT:    local.get 0
2913; CHECK-NEXT:    call op_1_to_0
2914; CHECK-NEXT:    # fallthrough-return
2915  %t0 = call {i32, i32, i32} @op_0_to_3()
2916  %t1 = extractvalue {i32, i32, i32} %t0, 2
2917  %t2 = extractvalue {i32, i32, i32} %t0, 1
2918  call void @op_2_to_0(i32 %t1, i32 %t2)
2919  %t3 = extractvalue {i32, i32, i32} %t0, 1
2920  call void @op_1_to_0(i32 %t3)
2921  ret void
2922}
2923
2924define void @f412() {
2925; CHECK-LABEL: f412:
2926; CHECK:         .functype f412 () -> ()
2927; CHECK-NEXT:    .local i32, i32
2928; CHECK-NEXT:  # %bb.0:
2929; CHECK-NEXT:    call op_0_to_3
2930; CHECK-NEXT:    local.set 1
2931; CHECK-NEXT:    local.set 0
2932; CHECK-NEXT:    drop
2933; CHECK-NEXT:    local.get 1
2934; CHECK-NEXT:    local.get 0
2935; CHECK-NEXT:    call op_2_to_0
2936; CHECK-NEXT:    local.get 1
2937; CHECK-NEXT:    call op_1_to_0
2938; CHECK-NEXT:    # fallthrough-return
2939  %t0 = call {i32, i32, i32} @op_0_to_3()
2940  %t1 = extractvalue {i32, i32, i32} %t0, 2
2941  %t2 = extractvalue {i32, i32, i32} %t0, 1
2942  call void @op_2_to_0(i32 %t1, i32 %t2)
2943  %t3 = extractvalue {i32, i32, i32} %t0, 2
2944  call void @op_1_to_0(i32 %t3)
2945  ret void
2946}
2947
2948define void @f413() {
2949; CHECK-LABEL: f413:
2950; CHECK:         .functype f413 () -> ()
2951; CHECK-NEXT:    .local i32, i32, i32
2952; CHECK-NEXT:  # %bb.0:
2953; CHECK-NEXT:    call op_0_to_3
2954; CHECK-NEXT:    local.set 2
2955; CHECK-NEXT:    local.set 1
2956; CHECK-NEXT:    local.set 0
2957; CHECK-NEXT:    local.get 2
2958; CHECK-NEXT:    local.get 1
2959; CHECK-NEXT:    call op_2_to_0
2960; CHECK-NEXT:    local.get 0
2961; CHECK-NEXT:    local.get 0
2962; CHECK-NEXT:    call op_2_to_0
2963; CHECK-NEXT:    # fallthrough-return
2964  %t0 = call {i32, i32, i32} @op_0_to_3()
2965  %t1 = extractvalue {i32, i32, i32} %t0, 2
2966  %t2 = extractvalue {i32, i32, i32} %t0, 1
2967  call void @op_2_to_0(i32 %t1, i32 %t2)
2968  %t3 = extractvalue {i32, i32, i32} %t0, 0
2969  %t4 = extractvalue {i32, i32, i32} %t0, 0
2970  call void @op_2_to_0(i32 %t3, i32 %t4)
2971  ret void
2972}
2973
2974define void @f414() {
2975; CHECK-LABEL: f414:
2976; CHECK:         .functype f414 () -> ()
2977; CHECK-NEXT:    .local i32, i32, i32
2978; CHECK-NEXT:  # %bb.0:
2979; CHECK-NEXT:    call op_0_to_3
2980; CHECK-NEXT:    local.set 2
2981; CHECK-NEXT:    local.set 1
2982; CHECK-NEXT:    local.set 0
2983; CHECK-NEXT:    local.get 2
2984; CHECK-NEXT:    local.get 1
2985; CHECK-NEXT:    call op_2_to_0
2986; CHECK-NEXT:    local.get 0
2987; CHECK-NEXT:    local.get 1
2988; CHECK-NEXT:    call op_2_to_0
2989; CHECK-NEXT:    # fallthrough-return
2990  %t0 = call {i32, i32, i32} @op_0_to_3()
2991  %t1 = extractvalue {i32, i32, i32} %t0, 2
2992  %t2 = extractvalue {i32, i32, i32} %t0, 1
2993  call void @op_2_to_0(i32 %t1, i32 %t2)
2994  %t3 = extractvalue {i32, i32, i32} %t0, 0
2995  %t4 = extractvalue {i32, i32, i32} %t0, 1
2996  call void @op_2_to_0(i32 %t3, i32 %t4)
2997  ret void
2998}
2999
3000define void @f415() {
3001; CHECK-LABEL: f415:
3002; CHECK:         .functype f415 () -> ()
3003; CHECK-NEXT:    .local i32, i32, i32
3004; CHECK-NEXT:  # %bb.0:
3005; CHECK-NEXT:    call op_0_to_3
3006; CHECK-NEXT:    local.set 2
3007; CHECK-NEXT:    local.set 1
3008; CHECK-NEXT:    local.set 0
3009; CHECK-NEXT:    local.get 2
3010; CHECK-NEXT:    local.get 1
3011; CHECK-NEXT:    call op_2_to_0
3012; CHECK-NEXT:    local.get 0
3013; CHECK-NEXT:    local.get 2
3014; CHECK-NEXT:    call op_2_to_0
3015; CHECK-NEXT:    # fallthrough-return
3016  %t0 = call {i32, i32, i32} @op_0_to_3()
3017  %t1 = extractvalue {i32, i32, i32} %t0, 2
3018  %t2 = extractvalue {i32, i32, i32} %t0, 1
3019  call void @op_2_to_0(i32 %t1, i32 %t2)
3020  %t3 = extractvalue {i32, i32, i32} %t0, 0
3021  %t4 = extractvalue {i32, i32, i32} %t0, 2
3022  call void @op_2_to_0(i32 %t3, i32 %t4)
3023  ret void
3024}
3025
3026define void @f416() {
3027; CHECK-LABEL: f416:
3028; CHECK:         .functype f416 () -> ()
3029; CHECK-NEXT:    .local i32, i32, i32
3030; CHECK-NEXT:  # %bb.0:
3031; CHECK-NEXT:    call op_0_to_3
3032; CHECK-NEXT:    local.set 2
3033; CHECK-NEXT:    local.set 1
3034; CHECK-NEXT:    local.set 0
3035; CHECK-NEXT:    local.get 2
3036; CHECK-NEXT:    local.get 1
3037; CHECK-NEXT:    call op_2_to_0
3038; CHECK-NEXT:    local.get 1
3039; CHECK-NEXT:    local.get 0
3040; CHECK-NEXT:    call op_2_to_0
3041; CHECK-NEXT:    # fallthrough-return
3042  %t0 = call {i32, i32, i32} @op_0_to_3()
3043  %t1 = extractvalue {i32, i32, i32} %t0, 2
3044  %t2 = extractvalue {i32, i32, i32} %t0, 1
3045  call void @op_2_to_0(i32 %t1, i32 %t2)
3046  %t3 = extractvalue {i32, i32, i32} %t0, 1
3047  %t4 = extractvalue {i32, i32, i32} %t0, 0
3048  call void @op_2_to_0(i32 %t3, i32 %t4)
3049  ret void
3050}
3051
3052define void @f418() {
3053; CHECK-LABEL: f418:
3054; CHECK:         .functype f418 () -> ()
3055; CHECK-NEXT:    .local i32, i32
3056; CHECK-NEXT:  # %bb.0:
3057; CHECK-NEXT:    call op_0_to_3
3058; CHECK-NEXT:    local.set 1
3059; CHECK-NEXT:    local.set 0
3060; CHECK-NEXT:    drop
3061; CHECK-NEXT:    local.get 1
3062; CHECK-NEXT:    local.get 0
3063; CHECK-NEXT:    call op_2_to_0
3064; CHECK-NEXT:    local.get 0
3065; CHECK-NEXT:    local.get 1
3066; CHECK-NEXT:    call op_2_to_0
3067; CHECK-NEXT:    # fallthrough-return
3068  %t0 = call {i32, i32, i32} @op_0_to_3()
3069  %t1 = extractvalue {i32, i32, i32} %t0, 2
3070  %t2 = extractvalue {i32, i32, i32} %t0, 1
3071  call void @op_2_to_0(i32 %t1, i32 %t2)
3072  %t3 = extractvalue {i32, i32, i32} %t0, 1
3073  %t4 = extractvalue {i32, i32, i32} %t0, 2
3074  call void @op_2_to_0(i32 %t3, i32 %t4)
3075  ret void
3076}
3077
3078define void @f419() {
3079; CHECK-LABEL: f419:
3080; CHECK:         .functype f419 () -> ()
3081; CHECK-NEXT:    .local i32, i32, i32
3082; CHECK-NEXT:  # %bb.0:
3083; CHECK-NEXT:    call op_0_to_3
3084; CHECK-NEXT:    local.set 2
3085; CHECK-NEXT:    local.set 1
3086; CHECK-NEXT:    local.set 0
3087; CHECK-NEXT:    local.get 2
3088; CHECK-NEXT:    local.get 1
3089; CHECK-NEXT:    call op_2_to_0
3090; CHECK-NEXT:    local.get 2
3091; CHECK-NEXT:    local.get 0
3092; CHECK-NEXT:    call op_2_to_0
3093; CHECK-NEXT:    # fallthrough-return
3094  %t0 = call {i32, i32, i32} @op_0_to_3()
3095  %t1 = extractvalue {i32, i32, i32} %t0, 2
3096  %t2 = extractvalue {i32, i32, i32} %t0, 1
3097  call void @op_2_to_0(i32 %t1, i32 %t2)
3098  %t3 = extractvalue {i32, i32, i32} %t0, 2
3099  %t4 = extractvalue {i32, i32, i32} %t0, 0
3100  call void @op_2_to_0(i32 %t3, i32 %t4)
3101  ret void
3102}
3103
3104define void @f422() {
3105; CHECK-LABEL: f422:
3106; CHECK:         .functype f422 () -> ()
3107; CHECK-NEXT:    .local i32, i32
3108; CHECK-NEXT:  # %bb.0:
3109; CHECK-NEXT:    call op_0_to_3
3110; CHECK-NEXT:    local.set 1
3111; CHECK-NEXT:    drop
3112; CHECK-NEXT:    local.set 0
3113; CHECK-NEXT:    local.get 1
3114; CHECK-NEXT:    local.get 1
3115; CHECK-NEXT:    call op_2_to_0
3116; CHECK-NEXT:    local.get 0
3117; CHECK-NEXT:    call op_1_to_0
3118; CHECK-NEXT:    # fallthrough-return
3119  %t0 = call {i32, i32, i32} @op_0_to_3()
3120  %t1 = extractvalue {i32, i32, i32} %t0, 2
3121  %t2 = extractvalue {i32, i32, i32} %t0, 2
3122  call void @op_2_to_0(i32 %t1, i32 %t2)
3123  %t3 = extractvalue {i32, i32, i32} %t0, 0
3124  call void @op_1_to_0(i32 %t3)
3125  ret void
3126}
3127
3128define void @f423() {
3129; CHECK-LABEL: f423:
3130; CHECK:         .functype f423 () -> ()
3131; CHECK-NEXT:    .local i32, i32
3132; CHECK-NEXT:  # %bb.0:
3133; CHECK-NEXT:    call op_0_to_3
3134; CHECK-NEXT:    local.set 1
3135; CHECK-NEXT:    local.set 0
3136; CHECK-NEXT:    drop
3137; CHECK-NEXT:    local.get 1
3138; CHECK-NEXT:    local.get 1
3139; CHECK-NEXT:    call op_2_to_0
3140; CHECK-NEXT:    local.get 0
3141; CHECK-NEXT:    call op_1_to_0
3142; CHECK-NEXT:    # fallthrough-return
3143  %t0 = call {i32, i32, i32} @op_0_to_3()
3144  %t1 = extractvalue {i32, i32, i32} %t0, 2
3145  %t2 = extractvalue {i32, i32, i32} %t0, 2
3146  call void @op_2_to_0(i32 %t1, i32 %t2)
3147  %t3 = extractvalue {i32, i32, i32} %t0, 1
3148  call void @op_1_to_0(i32 %t3)
3149  ret void
3150}
3151
3152define void @f425() {
3153; CHECK-LABEL: f425:
3154; CHECK:         .functype f425 () -> ()
3155; CHECK-NEXT:    .local i32, i32
3156; CHECK-NEXT:  # %bb.0:
3157; CHECK-NEXT:    call op_0_to_3
3158; CHECK-NEXT:    local.set 1
3159; CHECK-NEXT:    drop
3160; CHECK-NEXT:    local.set 0
3161; CHECK-NEXT:    local.get 1
3162; CHECK-NEXT:    local.get 1
3163; CHECK-NEXT:    call op_2_to_0
3164; CHECK-NEXT:    local.get 0
3165; CHECK-NEXT:    local.get 0
3166; CHECK-NEXT:    call op_2_to_0
3167; CHECK-NEXT:    # fallthrough-return
3168  %t0 = call {i32, i32, i32} @op_0_to_3()
3169  %t1 = extractvalue {i32, i32, i32} %t0, 2
3170  %t2 = extractvalue {i32, i32, i32} %t0, 2
3171  call void @op_2_to_0(i32 %t1, i32 %t2)
3172  %t3 = extractvalue {i32, i32, i32} %t0, 0
3173  %t4 = extractvalue {i32, i32, i32} %t0, 0
3174  call void @op_2_to_0(i32 %t3, i32 %t4)
3175  ret void
3176}
3177
3178define void @f426() {
3179; CHECK-LABEL: f426:
3180; CHECK:         .functype f426 () -> ()
3181; CHECK-NEXT:    .local i32, i32, i32
3182; CHECK-NEXT:  # %bb.0:
3183; CHECK-NEXT:    call op_0_to_3
3184; CHECK-NEXT:    local.set 2
3185; CHECK-NEXT:    local.set 1
3186; CHECK-NEXT:    local.set 0
3187; CHECK-NEXT:    local.get 2
3188; CHECK-NEXT:    local.get 2
3189; CHECK-NEXT:    call op_2_to_0
3190; CHECK-NEXT:    local.get 0
3191; CHECK-NEXT:    local.get 1
3192; CHECK-NEXT:    call op_2_to_0
3193; CHECK-NEXT:    # fallthrough-return
3194  %t0 = call {i32, i32, i32} @op_0_to_3()
3195  %t1 = extractvalue {i32, i32, i32} %t0, 2
3196  %t2 = extractvalue {i32, i32, i32} %t0, 2
3197  call void @op_2_to_0(i32 %t1, i32 %t2)
3198  %t3 = extractvalue {i32, i32, i32} %t0, 0
3199  %t4 = extractvalue {i32, i32, i32} %t0, 1
3200  call void @op_2_to_0(i32 %t3, i32 %t4)
3201  ret void
3202}
3203
3204define void @f428() {
3205; CHECK-LABEL: f428:
3206; CHECK:         .functype f428 () -> ()
3207; CHECK-NEXT:    .local i32, i32, i32
3208; CHECK-NEXT:  # %bb.0:
3209; CHECK-NEXT:    call op_0_to_3
3210; CHECK-NEXT:    local.set 2
3211; CHECK-NEXT:    local.set 1
3212; CHECK-NEXT:    local.set 0
3213; CHECK-NEXT:    local.get 2
3214; CHECK-NEXT:    local.get 2
3215; CHECK-NEXT:    call op_2_to_0
3216; CHECK-NEXT:    local.get 1
3217; CHECK-NEXT:    local.get 0
3218; CHECK-NEXT:    call op_2_to_0
3219; CHECK-NEXT:    # fallthrough-return
3220  %t0 = call {i32, i32, i32} @op_0_to_3()
3221  %t1 = extractvalue {i32, i32, i32} %t0, 2
3222  %t2 = extractvalue {i32, i32, i32} %t0, 2
3223  call void @op_2_to_0(i32 %t1, i32 %t2)
3224  %t3 = extractvalue {i32, i32, i32} %t0, 1
3225  %t4 = extractvalue {i32, i32, i32} %t0, 0
3226  call void @op_2_to_0(i32 %t3, i32 %t4)
3227  ret void
3228}
3229
3230define void @f429() {
3231; CHECK-LABEL: f429:
3232; CHECK:         .functype f429 () -> ()
3233; CHECK-NEXT:    .local i32, i32
3234; CHECK-NEXT:  # %bb.0:
3235; CHECK-NEXT:    call op_0_to_3
3236; CHECK-NEXT:    local.set 1
3237; CHECK-NEXT:    local.set 0
3238; CHECK-NEXT:    drop
3239; CHECK-NEXT:    local.get 1
3240; CHECK-NEXT:    local.get 1
3241; CHECK-NEXT:    call op_2_to_0
3242; CHECK-NEXT:    local.get 0
3243; CHECK-NEXT:    local.get 0
3244; CHECK-NEXT:    call op_2_to_0
3245; CHECK-NEXT:    # fallthrough-return
3246  %t0 = call {i32, i32, i32} @op_0_to_3()
3247  %t1 = extractvalue {i32, i32, i32} %t0, 2
3248  %t2 = extractvalue {i32, i32, i32} %t0, 2
3249  call void @op_2_to_0(i32 %t1, i32 %t2)
3250  %t3 = extractvalue {i32, i32, i32} %t0, 1
3251  %t4 = extractvalue {i32, i32, i32} %t0, 1
3252  call void @op_2_to_0(i32 %t3, i32 %t4)
3253  ret void
3254}
3255
3256