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.
103 lines
2.1 KiB
Plaintext
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
|