
Multivalue feature of WebAssembly has been standardized for several years now. I think it makes sense to be able to enable it in the feature section by default for our clang/llvm-produced binaries so that the multivalue feature can be used as necessary when necessary within our toolchain and also when running other optimizers (e.g. wasm-opt) after the LLVM code generation. But some WebAssembly toolchains, such as Emscripten, do not provide both mulvalue-returning and not-multivalue-returning versions of libraries. Also allowing the uses of multivalue in the features section does not necessarily mean we generate them whenever we can to the fullest, which is a different code generation / optimization option. So this makes the lowering of multivalue returns conditional on the use of 'experimental-mv' target ABI. This ABI is turned off by default and turned on by passing `-Xclang -target-abi -Xclang experimental-mv` to `clang`, or `-target-abi experimental-mv` to `clang -cc1` or `llc`. But the purpose of this PR is not tying the multivalue lowering to this specific 'experimental-mv'. 'experimental-mv' is just one multivalue ABI we currently have, and it is still experimental, meaning it is not very well optimized or tuned for performance. (e.g. it does not have the limitation of the max number of multivalue-lowered values, which can be detrimental to performance.) We may change the name of this ABI, or improve it, or add a new multivalue ABI in the future. Also I heard that WASI is planning to add their multivalue ABI soon. So the plan is, whenever any one of multivalue ABIs is enabled, we enable the lowering of multivalue returns in the backend. We currently have only 'experimental-mv' in the repo so we only check for that in this PR. Related past discussions: #82714 https://github.com/WebAssembly/tool-conventions/pull/223#issuecomment-2008298652
3254 lines
94 KiB
LLVM
3254 lines
94 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; NOTE: Test functions have been generated by multivalue-stackify.py.
|
|
|
|
; RUN: llc < %s -verify-machineinstrs -mattr=+multivalue -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
|
|
}
|