; 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 -target-abi=experimental-mv | FileCheck %s

; Test that the multivalue stackification works

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
}
