Files
wasmtime/cranelift/filetests/filetests/runtests/br_table.clif
Trevor Elliott 80c147d9c0 Rework br_table to use BlockCall (#5731)
Rework br_table to use BlockCall, allowing us to avoid adding new nodes during ssa construction to hold block arguments. Additionally, many places where we previously matched on InstructionData to extract branch destinations can be replaced with a use of branch_destination or branch_destination_mut.
2023-02-16 09:23:27 -08:00

103 lines
2.1 KiB
Plaintext

test interpret
test run
target aarch64
target aarch64 use_bti
target x86_64
target s390x
target riscv64
function %br_table_i32(i32) -> i32 {
block0(v0: i32):
br_table v0, block4, [block1, block2, block2, block3]
block1:
v1 = iconst.i32 1
jump block5(v1)
block2:
v2 = iconst.i32 2
jump block5(v2)
block3:
v3 = iconst.i32 3
jump block5(v3)
block4:
v4 = iconst.i32 4
jump block5(v4)
block5(v5: i32):
v6 = iadd.i32 v0, v5
return v6
}
; run: %br_table_i32(0) == 1
; run: %br_table_i32(1) == 3
; run: %br_table_i32(2) == 4
; run: %br_table_i32(3) == 6
; run: %br_table_i32(4) == 8
; run: %br_table_i32(5) == 9
; run: %br_table_i32(6) == 10
; run: %br_table_i32(-1) == 3
; RISC-V had a bug where having a br_table on a cold block would cause a segfault
; See #5496 for more details.
function %br_table_cold_block(i32) -> i32 system_v {
block0(v0: i32):
jump block1
block1 cold:
br_table v0, block2, []
block2:
v1 = iconst.i32 0
return v1
}
; run: %br_table_cold_block(0) == 0
; run: %br_table_cold_block(1) == 0
function %br_table_i32_inline(i32) -> i32 {
block0(v0: i32):
v1 = iconst.i32 1
v2 = iconst.i32 2
v3 = iconst.i32 3
v4 = iconst.i32 4
br_table v0, block1(v4), [block1(v1), block1(v2), block1(v2), block1(v3)]
block1(v5: i32):
return v5
}
; run: %br_table_i32_inline(0) == 1
; run: %br_table_i32_inline(1) == 2
; run: %br_table_i32_inline(2) == 2
; run: %br_table_i32_inline(3) == 3
; run: %br_table_i32_inline(4) == 4
; run: %br_table_i32_inline(297) == 4
; run: %br_table_i32_inline(65535) == 4
function %br_table_i32_inline_varied(i32) -> i32 {
block0(v0: i32):
v1 = iconst.i32 1
v2 = iconst.i32 2
v3 = iconst.i32 3
v4 = iconst.i32 4
br_table v0, block1(v4), [block1(v1), block2(v2, v4), block2(v4, v3), block1(v3)]
block2(v6: i32, v7: i32):
v8 = iadd v6, v7
jump block1(v8)
block1(v5: i32):
return v5
}
; run: %br_table_i32_inline_varied(0) == 1
; run: %br_table_i32_inline_varied(1) == 6
; run: %br_table_i32_inline_varied(2) == 7
; run: %br_table_i32_inline_varied(3) == 3
; run: %br_table_i32_inline_varied(4) == 4
; run: %br_table_i32_inline_varied(297) == 4
; run: %br_table_i32_inline_varied(65535) == 4