3256 lines
		
	
	
		
			94 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			3256 lines
		
	
	
		
			94 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 | |
| ; NOTE: Test functions have been generated by multivalue-stackify.py.
 | |
| 
 | |
| ; RUN: llc < %s -verify-machineinstrs -mattr=+multivalue | FileCheck %s
 | |
| 
 | |
| ; Test that the multivalue stackification works
 | |
| 
 | |
| target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
 | |
| target triple = "wasm32-unknown-unknown"
 | |
| 
 | |
| declare {i32} @op_0_to_1()
 | |
| declare {i32, i32} @op_0_to_2()
 | |
| declare {i32, i32, i32} @op_0_to_3()
 | |
| declare void @op_1_to_0(i32 %t0)
 | |
| declare {i32} @op_1_to_1(i32 %t0)
 | |
| declare {i32, i32} @op_1_to_2(i32 %t0)
 | |
| declare {i32, i32, i32} @op_1_to_3(i32 %t0)
 | |
| declare void @op_2_to_0(i32 %t0, i32 %t1)
 | |
| declare {i32} @op_2_to_1(i32 %t0, i32 %t1)
 | |
| declare {i32, i32} @op_2_to_2(i32 %t0, i32 %t1)
 | |
| declare {i32, i32, i32} @op_2_to_3(i32 %t0, i32 %t1)
 | |
| 
 | |
| define void @f2() {
 | |
| ; CHECK-LABEL: f2:
 | |
| ; CHECK:         .functype f2 () -> ()
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f3() {
 | |
| ; CHECK-LABEL: f3:
 | |
| ; CHECK:         .functype f3 () -> ()
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f12() {
 | |
| ; CHECK-LABEL: f12:
 | |
| ; CHECK:         .functype f12 () -> ()
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f13() {
 | |
| ; CHECK-LABEL: f13:
 | |
| ; CHECK:         .functype f13 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f14() {
 | |
| ; CHECK-LABEL: f14:
 | |
| ; CHECK:         .functype f14 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.tee 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f15() {
 | |
| ; CHECK-LABEL: f15:
 | |
| ; CHECK:         .functype f15 () -> ()
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f16() {
 | |
| ; CHECK-LABEL: f16:
 | |
| ; CHECK:         .functype f16 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f17() {
 | |
| ; CHECK-LABEL: f17:
 | |
| ; CHECK:         .functype f17 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f25() {
 | |
| ; CHECK-LABEL: f25:
 | |
| ; CHECK:         .functype f25 () -> ()
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f26() {
 | |
| ; CHECK-LABEL: f26:
 | |
| ; CHECK:         .functype f26 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f27() {
 | |
| ; CHECK-LABEL: f27:
 | |
| ; CHECK:         .functype f27 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f28() {
 | |
| ; CHECK-LABEL: f28:
 | |
| ; CHECK:         .functype f28 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.tee 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f29() {
 | |
| ; CHECK-LABEL: f29:
 | |
| ; CHECK:         .functype f29 () -> ()
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f30() {
 | |
| ; CHECK-LABEL: f30:
 | |
| ; CHECK:         .functype f30 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f31() {
 | |
| ; CHECK-LABEL: f31:
 | |
| ; CHECK:         .functype f31 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f32() {
 | |
| ; CHECK-LABEL: f32:
 | |
| ; CHECK:         .functype f32 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f33() {
 | |
| ; CHECK-LABEL: f33:
 | |
| ; CHECK:         .functype f33 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f34() {
 | |
| ; CHECK-LABEL: f34:
 | |
| ; CHECK:         .functype f34 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f35() {
 | |
| ; CHECK-LABEL: f35:
 | |
| ; CHECK:         .functype f35 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f36() {
 | |
| ; CHECK-LABEL: f36:
 | |
| ; CHECK:         .functype f36 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f129() {
 | |
| ; CHECK-LABEL: f129:
 | |
| ; CHECK:         .functype f129 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f131() {
 | |
| ; CHECK-LABEL: f131:
 | |
| ; CHECK:         .functype f131 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32} %t0, 0
 | |
|   %t3 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f132() {
 | |
| ; CHECK-LABEL: f132:
 | |
| ; CHECK:         .functype f132 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32} %t0, 1
 | |
|   %t3 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f133() {
 | |
| ; CHECK-LABEL: f133:
 | |
| ; CHECK:         .functype f133 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32} %t0, 1
 | |
|   %t3 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f141() {
 | |
| ; CHECK-LABEL: f141:
 | |
| ; CHECK:         .functype f141 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f143() {
 | |
| ; CHECK-LABEL: f143:
 | |
| ; CHECK:         .functype f143 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32} %t0, 0
 | |
|   %t3 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f144() {
 | |
| ; CHECK-LABEL: f144:
 | |
| ; CHECK:         .functype f144 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32} %t0, 0
 | |
|   %t3 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f145() {
 | |
| ; CHECK-LABEL: f145:
 | |
| ; CHECK:         .functype f145 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32} %t0, 1
 | |
|   %t3 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f155() {
 | |
| ; CHECK-LABEL: f155:
 | |
| ; CHECK:         .functype f155 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f159() {
 | |
| ; CHECK-LABEL: f159:
 | |
| ; CHECK:         .functype f159 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f167() {
 | |
| ; CHECK-LABEL: f167:
 | |
| ; CHECK:         .functype f167 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f168() {
 | |
| ; CHECK-LABEL: f168:
 | |
| ; CHECK:         .functype f168 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f171() {
 | |
| ; CHECK-LABEL: f171:
 | |
| ; CHECK:         .functype f171 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f180() {
 | |
| ; CHECK-LABEL: f180:
 | |
| ; CHECK:         .functype f180 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f181() {
 | |
| ; CHECK-LABEL: f181:
 | |
| ; CHECK:         .functype f181 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f183() {
 | |
| ; CHECK-LABEL: f183:
 | |
| ; CHECK:         .functype f183 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f193() {
 | |
| ; CHECK-LABEL: f193:
 | |
| ; CHECK:         .functype f193 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f195() {
 | |
| ; CHECK-LABEL: f195:
 | |
| ; CHECK:         .functype f195 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32} @op_0_to_2()
 | |
|   %t1 = extractvalue {i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f291() {
 | |
| ; CHECK-LABEL: f291:
 | |
| ; CHECK:         .functype f291 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f292() {
 | |
| ; CHECK-LABEL: f292:
 | |
| ; CHECK:         .functype f292 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f294() {
 | |
| ; CHECK-LABEL: f294:
 | |
| ; CHECK:         .functype f294 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f295() {
 | |
| ; CHECK-LABEL: f295:
 | |
| ; CHECK:         .functype f295 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f296() {
 | |
| ; CHECK-LABEL: f296:
 | |
| ; CHECK:         .functype f296 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f297() {
 | |
| ; CHECK-LABEL: f297:
 | |
| ; CHECK:         .functype f297 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f298() {
 | |
| ; CHECK-LABEL: f298:
 | |
| ; CHECK:         .functype f298 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f299() {
 | |
| ; CHECK-LABEL: f299:
 | |
| ; CHECK:         .functype f299 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f300() {
 | |
| ; CHECK-LABEL: f300:
 | |
| ; CHECK:         .functype f300 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f301() {
 | |
| ; CHECK-LABEL: f301:
 | |
| ; CHECK:         .functype f301 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f302() {
 | |
| ; CHECK-LABEL: f302:
 | |
| ; CHECK:         .functype f302 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f304() {
 | |
| ; CHECK-LABEL: f304:
 | |
| ; CHECK:         .functype f304 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f305() {
 | |
| ; CHECK-LABEL: f305:
 | |
| ; CHECK:         .functype f305 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f306() {
 | |
| ; CHECK-LABEL: f306:
 | |
| ; CHECK:         .functype f306 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f307() {
 | |
| ; CHECK-LABEL: f307:
 | |
| ; CHECK:         .functype f307 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f308() {
 | |
| ; CHECK-LABEL: f308:
 | |
| ; CHECK:         .functype f308 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f310() {
 | |
| ; CHECK-LABEL: f310:
 | |
| ; CHECK:         .functype f310 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f311() {
 | |
| ; CHECK-LABEL: f311:
 | |
| ; CHECK:         .functype f311 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f312() {
 | |
| ; CHECK-LABEL: f312:
 | |
| ; CHECK:         .functype f312 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f313() {
 | |
| ; CHECK-LABEL: f313:
 | |
| ; CHECK:         .functype f313 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f314() {
 | |
| ; CHECK-LABEL: f314:
 | |
| ; CHECK:         .functype f314 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f315() {
 | |
| ; CHECK-LABEL: f315:
 | |
| ; CHECK:         .functype f315 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t2)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f317() {
 | |
| ; CHECK-LABEL: f317:
 | |
| ; CHECK:         .functype f317 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f318() {
 | |
| ; CHECK-LABEL: f318:
 | |
| ; CHECK:         .functype f318 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f319() {
 | |
| ; CHECK-LABEL: f319:
 | |
| ; CHECK:         .functype f319 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f320() {
 | |
| ; CHECK-LABEL: f320:
 | |
| ; CHECK:         .functype f320 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f321() {
 | |
| ; CHECK-LABEL: f321:
 | |
| ; CHECK:         .functype f321 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f322() {
 | |
| ; CHECK-LABEL: f322:
 | |
| ; CHECK:         .functype f322 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f323() {
 | |
| ; CHECK-LABEL: f323:
 | |
| ; CHECK:         .functype f323 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f324() {
 | |
| ; CHECK-LABEL: f324:
 | |
| ; CHECK:         .functype f324 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t1)
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t2, i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f327() {
 | |
| ; CHECK-LABEL: f327:
 | |
| ; CHECK:         .functype f327 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f328() {
 | |
| ; CHECK-LABEL: f328:
 | |
| ; CHECK:         .functype f328 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f333() {
 | |
| ; CHECK-LABEL: f333:
 | |
| ; CHECK:         .functype f333 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f334() {
 | |
| ; CHECK-LABEL: f334:
 | |
| ; CHECK:         .functype f334 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 2
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f336() {
 | |
| ; CHECK-LABEL: f336:
 | |
| ; CHECK:         .functype f336 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 2
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f337() {
 | |
| ; CHECK-LABEL: f337:
 | |
| ; CHECK:         .functype f337 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f338() {
 | |
| ; CHECK-LABEL: f338:
 | |
| ; CHECK:         .functype f338 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f339() {
 | |
| ; CHECK-LABEL: f339:
 | |
| ; CHECK:         .functype f339 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f340() {
 | |
| ; CHECK-LABEL: f340:
 | |
| ; CHECK:         .functype f340 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f343() {
 | |
| ; CHECK-LABEL: f343:
 | |
| ; CHECK:         .functype f343 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f344() {
 | |
| ; CHECK-LABEL: f344:
 | |
| ; CHECK:         .functype f344 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f346() {
 | |
| ; CHECK-LABEL: f346:
 | |
| ; CHECK:         .functype f346 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f347() {
 | |
| ; CHECK-LABEL: f347:
 | |
| ; CHECK:         .functype f347 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f348() {
 | |
| ; CHECK-LABEL: f348:
 | |
| ; CHECK:         .functype f348 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f349() {
 | |
| ; CHECK-LABEL: f349:
 | |
| ; CHECK:         .functype f349 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f350() {
 | |
| ; CHECK-LABEL: f350:
 | |
| ; CHECK:         .functype f350 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f351() {
 | |
| ; CHECK-LABEL: f351:
 | |
| ; CHECK:         .functype f351 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f352() {
 | |
| ; CHECK-LABEL: f352:
 | |
| ; CHECK:         .functype f352 () -> ()
 | |
| ; CHECK-NEXT:    .local i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f354() {
 | |
| ; CHECK-LABEL: f354:
 | |
| ; CHECK:         .functype f354 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 2
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f356() {
 | |
| ; CHECK-LABEL: f356:
 | |
| ; CHECK:         .functype f356 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.tee 2
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f357() {
 | |
| ; CHECK-LABEL: f357:
 | |
| ; CHECK:         .functype f357 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f358() {
 | |
| ; CHECK-LABEL: f358:
 | |
| ; CHECK:         .functype f358 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f359() {
 | |
| ; CHECK-LABEL: f359:
 | |
| ; CHECK:         .functype f359 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.tee 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f360() {
 | |
| ; CHECK-LABEL: f360:
 | |
| ; CHECK:         .functype f360 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f362() {
 | |
| ; CHECK-LABEL: f362:
 | |
| ; CHECK:         .functype f362 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f363() {
 | |
| ; CHECK-LABEL: f363:
 | |
| ; CHECK:         .functype f363 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f364() {
 | |
| ; CHECK-LABEL: f364:
 | |
| ; CHECK:         .functype f364 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f366() {
 | |
| ; CHECK-LABEL: f366:
 | |
| ; CHECK:         .functype f366 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f367() {
 | |
| ; CHECK-LABEL: f367:
 | |
| ; CHECK:         .functype f367 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f370() {
 | |
| ; CHECK-LABEL: f370:
 | |
| ; CHECK:         .functype f370 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f371() {
 | |
| ; CHECK-LABEL: f371:
 | |
| ; CHECK:         .functype f371 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f372() {
 | |
| ; CHECK-LABEL: f372:
 | |
| ; CHECK:         .functype f372 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f373() {
 | |
| ; CHECK-LABEL: f373:
 | |
| ; CHECK:         .functype f373 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f374() {
 | |
| ; CHECK-LABEL: f374:
 | |
| ; CHECK:         .functype f374 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f376() {
 | |
| ; CHECK-LABEL: f376:
 | |
| ; CHECK:         .functype f376 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f377() {
 | |
| ; CHECK-LABEL: f377:
 | |
| ; CHECK:         .functype f377 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f379() {
 | |
| ; CHECK-LABEL: f379:
 | |
| ; CHECK:         .functype f379 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f383() {
 | |
| ; CHECK-LABEL: f383:
 | |
| ; CHECK:         .functype f383 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f385() {
 | |
| ; CHECK-LABEL: f385:
 | |
| ; CHECK:         .functype f385 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f386() {
 | |
| ; CHECK-LABEL: f386:
 | |
| ; CHECK:         .functype f386 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f387() {
 | |
| ; CHECK-LABEL: f387:
 | |
| ; CHECK:         .functype f387 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f388() {
 | |
| ; CHECK-LABEL: f388:
 | |
| ; CHECK:         .functype f388 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f389() {
 | |
| ; CHECK-LABEL: f389:
 | |
| ; CHECK:         .functype f389 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f390() {
 | |
| ; CHECK-LABEL: f390:
 | |
| ; CHECK:         .functype f390 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f391() {
 | |
| ; CHECK-LABEL: f391:
 | |
| ; CHECK:         .functype f391 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f392() {
 | |
| ; CHECK-LABEL: f392:
 | |
| ; CHECK:         .functype f392 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f395() {
 | |
| ; CHECK-LABEL: f395:
 | |
| ; CHECK:         .functype f395 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f396() {
 | |
| ; CHECK-LABEL: f396:
 | |
| ; CHECK:         .functype f396 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f398() {
 | |
| ; CHECK-LABEL: f398:
 | |
| ; CHECK:         .functype f398 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f399() {
 | |
| ; CHECK-LABEL: f399:
 | |
| ; CHECK:         .functype f399 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f400() {
 | |
| ; CHECK-LABEL: f400:
 | |
| ; CHECK:         .functype f400 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f402() {
 | |
| ; CHECK-LABEL: f402:
 | |
| ; CHECK:         .functype f402 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f403() {
 | |
| ; CHECK-LABEL: f403:
 | |
| ; CHECK:         .functype f403 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f404() {
 | |
| ; CHECK-LABEL: f404:
 | |
| ; CHECK:         .functype f404 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f405() {
 | |
| ; CHECK-LABEL: f405:
 | |
| ; CHECK:         .functype f405 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f406() {
 | |
| ; CHECK-LABEL: f406:
 | |
| ; CHECK:         .functype f406 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f408() {
 | |
| ; CHECK-LABEL: f408:
 | |
| ; CHECK:         .functype f408 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f410() {
 | |
| ; CHECK-LABEL: f410:
 | |
| ; CHECK:         .functype f410 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f411() {
 | |
| ; CHECK-LABEL: f411:
 | |
| ; CHECK:         .functype f411 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f412() {
 | |
| ; CHECK-LABEL: f412:
 | |
| ; CHECK:         .functype f412 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f413() {
 | |
| ; CHECK-LABEL: f413:
 | |
| ; CHECK:         .functype f413 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f414() {
 | |
| ; CHECK-LABEL: f414:
 | |
| ; CHECK:         .functype f414 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f415() {
 | |
| ; CHECK-LABEL: f415:
 | |
| ; CHECK:         .functype f415 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f416() {
 | |
| ; CHECK-LABEL: f416:
 | |
| ; CHECK:         .functype f416 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f418() {
 | |
| ; CHECK-LABEL: f418:
 | |
| ; CHECK:         .functype f418 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f419() {
 | |
| ; CHECK-LABEL: f419:
 | |
| ; CHECK:         .functype f419 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f422() {
 | |
| ; CHECK-LABEL: f422:
 | |
| ; CHECK:         .functype f422 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f423() {
 | |
| ; CHECK-LABEL: f423:
 | |
| ; CHECK:         .functype f423 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_1_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_1_to_0(i32 %t3)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f425() {
 | |
| ; CHECK-LABEL: f425:
 | |
| ; CHECK:         .functype f425 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f426() {
 | |
| ; CHECK-LABEL: f426:
 | |
| ; CHECK:         .functype f426 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f428() {
 | |
| ; CHECK-LABEL: f428:
 | |
| ; CHECK:         .functype f428 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 2
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    local.get 2
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 0
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| define void @f429() {
 | |
| ; CHECK-LABEL: f429:
 | |
| ; CHECK:         .functype f429 () -> ()
 | |
| ; CHECK-NEXT:    .local i32, i32
 | |
| ; CHECK-NEXT:  # %bb.0:
 | |
| ; CHECK-NEXT:    call op_0_to_3
 | |
| ; CHECK-NEXT:    local.set 1
 | |
| ; CHECK-NEXT:    local.set 0
 | |
| ; CHECK-NEXT:    drop
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    local.get 1
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    local.get 0
 | |
| ; CHECK-NEXT:    call op_2_to_0
 | |
| ; CHECK-NEXT:    # fallthrough-return
 | |
|   %t0 = call {i32, i32, i32} @op_0_to_3()
 | |
|   %t1 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   %t2 = extractvalue {i32, i32, i32} %t0, 2
 | |
|   call void @op_2_to_0(i32 %t1, i32 %t2)
 | |
|   %t3 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   %t4 = extractvalue {i32, i32, i32} %t0, 1
 | |
|   call void @op_2_to_0(i32 %t3, i32 %t4)
 | |
|   ret void
 | |
| }
 | |
| 
 |