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