Inline jump tables in parsed br_table instructions (#5755)
As jump tables are used by at most one br_table instruction, inline their definition in those instructions instead of requiring them to be declared as function-level metadata.
This commit is contained in:
@@ -11,7 +11,6 @@ function u0:0(i64 vmctx, i64) fast {
|
||||
gv2 = load.i64 notrap aligned gv1
|
||||
sig0 = (i64 vmctx, i64) fast
|
||||
fn0 = colocated u0:2 sig0
|
||||
jt0 = jump_table [block1]
|
||||
stack_limit = gv2
|
||||
|
||||
block0(v0: i64, v1: i64):
|
||||
@@ -33,7 +32,7 @@ function u0:0(i64 vmctx, i64) fast {
|
||||
|
||||
block4:
|
||||
@002e call fn0(v0, v0)
|
||||
@0030 br_table v8, block1, jt0
|
||||
@0030 br_table v8, block1, [block1]
|
||||
|
||||
block1:
|
||||
@0036 return
|
||||
|
||||
@@ -17,7 +17,6 @@ function u0:33() system_v {
|
||||
ss0 = explicit_slot 32
|
||||
sig0 = (i64, i64, i64, i64, i64) -> i64, i64 system_v
|
||||
fn0 = colocated u0:0 sig0
|
||||
jt0 = jump_table [block36, block38]
|
||||
block0:
|
||||
v80 = iconst.i32 0
|
||||
v91 = iconst.i64 0
|
||||
@@ -28,7 +27,7 @@ block0:
|
||||
v237 = iconst.i64 0
|
||||
v238, v239 = call fn0(v236, v237, v91, v92, v235) ; v236 = 0, v237 = 0, v91 = 0, v92 = 0, v235 = 0
|
||||
v97 = iadd v238, v96 ; v96 = 0
|
||||
br_table v80, block37, jt0 ; v80 = 0
|
||||
br_table v80, block37, [block36, block38] ; v80 = 0
|
||||
block36:
|
||||
trap user0
|
||||
block37:
|
||||
|
||||
@@ -3,10 +3,8 @@ set unwind_info=false
|
||||
target aarch64 use_bti
|
||||
|
||||
function %f1(i32) -> i32 {
|
||||
jt0 = jump_table [block1, block2, block3]
|
||||
|
||||
block0(v0: i32):
|
||||
br_table v0, block4, jt0
|
||||
br_table v0, block4, [block1, block2, block3]
|
||||
|
||||
block1:
|
||||
v1 = iconst.i32 1
|
||||
@@ -62,12 +60,10 @@ block5(v5: i32):
|
||||
; ret
|
||||
|
||||
function %f2(i64) -> i64 {
|
||||
jt0 = jump_table [block2]
|
||||
|
||||
block0(v0: i64):
|
||||
v1 = ireduce.i32 v0
|
||||
v2 = load.i64 notrap aligned table v0
|
||||
br_table v1, block1, jt0
|
||||
br_table v1, block1, [block2]
|
||||
|
||||
block1:
|
||||
return v2
|
||||
|
||||
@@ -3,10 +3,8 @@ set unwind_info=false
|
||||
target aarch64
|
||||
|
||||
function %f(i32) -> i32 {
|
||||
jt0 = jump_table [block1, block2, block3]
|
||||
|
||||
block0(v0: i32):
|
||||
br_table v0, block4, jt0
|
||||
br_table v0, block4, [block1, block2, block3]
|
||||
|
||||
block1:
|
||||
v1 = iconst.i32 1
|
||||
|
||||
@@ -2,10 +2,8 @@ test compile precise-output
|
||||
target s390x
|
||||
|
||||
function %f(i32) -> i32 {
|
||||
jt0 = jump_table [block1, block2, block3]
|
||||
|
||||
block0(v0: i32):
|
||||
br_table v0, block4, jt0
|
||||
br_table v0, block4, [block1, block2, block3]
|
||||
|
||||
block1:
|
||||
v1 = iconst.i32 1
|
||||
|
||||
@@ -34,7 +34,6 @@ function u0:31(i64, i32, i32, i8, i8) -> i32, i32 system_v {
|
||||
fn3 = colocated u0:11 sig3
|
||||
fn4 = u0:110 sig4
|
||||
fn5 = u0:110 sig5
|
||||
jt0 = jump_table [block2, block4, block5, block6, block7]
|
||||
|
||||
block0(v0: i64, v1: i32, v2: i32, v3: i8, v4: i8):
|
||||
v34 -> v0
|
||||
@@ -82,7 +81,7 @@ function u0:31(i64, i32, i32, i8, i8) -> i32, i32 system_v {
|
||||
@0005 jump block37
|
||||
|
||||
block37:
|
||||
@0005 br_table v10, block36, jt0
|
||||
@0005 br_table v10, block36, [block2, block4, block5, block6, block7]
|
||||
|
||||
block2:
|
||||
@0001 v11 = stack_load.i8 ss3+1
|
||||
|
||||
@@ -181,10 +181,8 @@ block2:
|
||||
; ret
|
||||
|
||||
function %f5(i32) -> i8 {
|
||||
jt0 = jump_table [block1, block2]
|
||||
|
||||
block0(v0: i32):
|
||||
br_table v0, block1, jt0
|
||||
br_table v0, block1, [block1, block2]
|
||||
|
||||
block1:
|
||||
v1 = iconst.i8 1
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
test compile precise-output
|
||||
target x86_64
|
||||
|
||||
;; From: https://github.com/bytecodealliance/wasmtime/issues/2670
|
||||
|
||||
function %f() system_v {
|
||||
jt0 = jump_table [block1]
|
||||
|
||||
block0:
|
||||
return
|
||||
|
||||
block1:
|
||||
trap unreachable
|
||||
}
|
||||
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
|
||||
@@ -4,11 +4,10 @@ target aarch64
|
||||
target x86_64
|
||||
|
||||
function %br_table_opt() {
|
||||
jt0 = jump_table [block1, block2]
|
||||
|
||||
block0:
|
||||
v0 = iconst.i32 1
|
||||
br_table v0, block2, jt0
|
||||
br_table v0, block2, [block1, block2]
|
||||
|
||||
block1:
|
||||
return
|
||||
|
||||
@@ -2,11 +2,10 @@ test licm
|
||||
target aarch64
|
||||
|
||||
function %rewrite_jump_table() {
|
||||
jt0 = jump_table [block1, block2]
|
||||
|
||||
block0:
|
||||
v0 = iconst.i32 1
|
||||
br_table v0, block1, jt0
|
||||
br_table v0, block1, [block1, block2]
|
||||
|
||||
block1:
|
||||
return
|
||||
@@ -17,7 +16,6 @@ function %rewrite_jump_table() {
|
||||
}
|
||||
|
||||
; sameln: function
|
||||
; nextln: jt0 = jump_table [block1, block3]
|
||||
; check: block3:
|
||||
; nextln: v4 = iconst.i8 0
|
||||
; nextln: jump block2
|
||||
|
||||
@@ -81,11 +81,8 @@ block1(v92: i32, v93: f32):
|
||||
; nextln: }
|
||||
|
||||
function %jumptable(i32) {
|
||||
jt200 = jump_table []
|
||||
jt2 = jump_table [block10, block40, block20, block30]
|
||||
|
||||
block10(v3: i32):
|
||||
br_table v3, block50, jt2
|
||||
br_table v3, block50, [block10, block40, block20, block30]
|
||||
|
||||
block20:
|
||||
trap user2
|
||||
@@ -97,10 +94,8 @@ block50:
|
||||
trap user1
|
||||
}
|
||||
; sameln: function %jumptable(i32) fast {
|
||||
; check: jt2 = jump_table [block10, block40, block20, block30]
|
||||
; check: jt200 = jump_table []
|
||||
; check: block10(v3: i32):
|
||||
; nextln: br_table v3, block50, jt2
|
||||
; nextln: br_table v3, block50, [block10, block40, block20, block30]
|
||||
; nextln:
|
||||
; nextln: block20:
|
||||
; nextln: trap user2
|
||||
|
||||
@@ -7,10 +7,8 @@ target s390x
|
||||
target riscv64
|
||||
|
||||
function %br_table_i32(i32) -> i32 {
|
||||
jt0 = jump_table [block1, block2, block2, block3]
|
||||
|
||||
block0(v0: i32):
|
||||
br_table v0, block4, jt0
|
||||
br_table v0, block4, [block1, block2, block2, block3]
|
||||
|
||||
block1:
|
||||
v1 = iconst.i32 1
|
||||
@@ -46,17 +44,15 @@ block5(v5: i32):
|
||||
; 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 {
|
||||
jt0 = jump_table []
|
||||
|
||||
block0(v0: i32):
|
||||
jump block1
|
||||
|
||||
block1 cold:
|
||||
br_table v0, block2, jt0
|
||||
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
|
||||
; run: %br_table_cold_block(1) == 0
|
||||
|
||||
@@ -1,19 +1,15 @@
|
||||
test verifier
|
||||
|
||||
function %br_invalid_default(i32) {
|
||||
jt0 = jump_table [block1, block1]
|
||||
|
||||
block0(v0: i32):
|
||||
br_table v0, block2, jt0 ; error: invalid block reference block2
|
||||
br_table v0, block2, [block1, block1] ; error: invalid block reference block2
|
||||
block1:
|
||||
return
|
||||
}
|
||||
|
||||
function %br(i32) {
|
||||
jt0 = jump_table [block1, block2] ; error: invalid block reference block2
|
||||
|
||||
block0(v0: i32):
|
||||
br_table v0, block1, jt0
|
||||
br_table v0, block1, [block1, block3] ; error: invalid block reference block3
|
||||
block1:
|
||||
return
|
||||
}
|
||||
|
||||
@@ -66,10 +66,9 @@ function %fn_call_incorrect_arg_type(i64) {
|
||||
; TODO: Should we instead just verify that jump tables contain no blocks that take arguments? This
|
||||
; error doesn't occur if no instruction uses the jump table.
|
||||
function %jump_table_args() {
|
||||
jt1 = jump_table [block1]
|
||||
block0:
|
||||
v0 = iconst.i32 0
|
||||
br_table v0, block2, jt1 ; error: takes no arguments, but had target block1 with 1 arguments
|
||||
br_table v0, block2, [block1] ; error: takes no arguments, but had target block1 with 1 arguments
|
||||
|
||||
block1(v5: i32):
|
||||
return
|
||||
|
||||
@@ -45,10 +45,8 @@ block0:
|
||||
}
|
||||
|
||||
function %br_table(i32) {
|
||||
jt0 = jump_table [block3, block1, block2]
|
||||
|
||||
block0(v0: i32):
|
||||
br_table v0, block4, jt0
|
||||
br_table v0, block4, [block3, block1, block2]
|
||||
|
||||
block4:
|
||||
trap heap_oob
|
||||
|
||||
Reference in New Issue
Block a user