Skip to content

Commit

Permalink
Add some disas tests for a few more Wasm GC instructions (bytecodeall…
Browse files Browse the repository at this point in the history
…iance#9453)

This helps us keep track of their code quality, and the way that some of them
are reusing our implementation of `ref.test`.
  • Loading branch information
fitzgen authored Oct 11, 2024
1 parent 1a31606 commit ec05264
Show file tree
Hide file tree
Showing 4 changed files with 323 additions and 0 deletions.
90 changes: 90 additions & 0 deletions tests/disas/gc/br-on-cast-fail.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
;;! target = "x86_64"
;;! flags = "-W function-references,gc"
;;! test = "optimize"

(module
(type $s (struct))
(import "" "f" (func $f))
(import "" "g" (func $g))
(func (param anyref)
block (result anyref)
(br_on_cast_fail 0 anyref (ref $s) (local.get 0))
(call $f)
return
end
(call $g)
return
)
)
;; function u0:2(i64 vmctx, i64, i32) tail {
;; ss0 = explicit_slot 4, align = 4
;; gv0 = vmctx
;; gv1 = load.i64 notrap aligned readonly gv0+8
;; gv2 = load.i64 notrap aligned gv1
;; gv3 = vmctx
;; sig0 = (i64 vmctx, i32 uext, i32 uext) -> i32 uext system_v
;; sig1 = (i64 vmctx, i64) tail
;; sig2 = (i64 vmctx, i64) tail
;; fn0 = colocated u1:35 sig0
;; fn1 = u0:0 sig1
;; fn2 = u0:1 sig2
;; stack_limit = gv2
;;
;; block0(v0: i64, v1: i64, v2: i32):
;; v44 = stack_addr.i64 ss0
;; store notrap v2, v44
;; v46 = iconst.i32 0
;; @002e v4 = icmp eq v2, v46 ; v46 = 0
;; @002e v5 = uextend.i32 v4
;; @002e v7 = iconst.i32 1
;; v54 = select v2, v7, v46 ; v7 = 1, v46 = 0
;; @002e brif v5, block5(v54), block3
;;
;; block3:
;; v61 = iconst.i32 1
;; v62 = band.i32 v2, v61 ; v61 = 1
;; v63 = iconst.i32 0
;; v64 = select v62, v63, v61 ; v63 = 0, v61 = 1
;; @002e brif v62, block5(v64), block4
;;
;; block4:
;; @002e v20 = uextend.i64 v2
;; @002e v21 = iconst.i64 4
;; @002e v22 = uadd_overflow_trap v20, v21, user1 ; v21 = 4
;; @002e v23 = iconst.i64 8
;; @002e v24 = uadd_overflow_trap v22, v23, user1 ; v23 = 8
;; @002e v19 = load.i64 notrap aligned readonly v0+48
;; @002e v25 = icmp ule v24, v19
;; @002e trapz v25, user1
;; @002e v18 = load.i64 notrap aligned readonly v0+40
;; @002e v26 = iadd v18, v22
;; @002e v27 = load.i32 notrap aligned readonly v26
;; @002e v15 = load.i64 notrap aligned readonly v0+80
;; @002e v16 = load.i32 notrap aligned readonly v15
;; @002e v28 = icmp eq v27, v16
;; @002e v29 = uextend.i32 v28
;; @002e brif v29, block7(v29), block6
;;
;; block6:
;; @002e v31 = call fn0(v0, v27, v16), stack_map=[i32 @ ss0+0]
;; @002e jump block7(v31)
;;
;; block7(v32: i32):
;; @002e jump block5(v32)
;;
;; block5(v33: i32):
;; v40 = load.i32 notrap v44
;; @002e brif v33, block8, block2
;;
;; block8:
;; @0034 v35 = load.i64 notrap aligned readonly v0+88
;; @0034 v36 = load.i64 notrap aligned readonly v0+104
;; @0034 call_indirect sig1, v35(v36, v0)
;; @0036 return
;;
;; block2:
;; @0038 v38 = load.i64 notrap aligned readonly v0+112
;; @0038 v39 = load.i64 notrap aligned readonly v0+128
;; @0038 call_indirect sig2, v38(v39, v0)
;; @003a return
;; }
90 changes: 90 additions & 0 deletions tests/disas/gc/br-on-cast.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
;;! target = "x86_64"
;;! flags = "-W function-references,gc"
;;! test = "optimize"

(module
(type $s (struct))
(import "" "f" (func $f))
(import "" "g" (func $g))
(func (param anyref)
block (result (ref $s))
(br_on_cast 0 anyref (ref $s) (local.get 0))
(call $f)
return
end
(call $g)
return
)
)
;; function u0:2(i64 vmctx, i64, i32) tail {
;; ss0 = explicit_slot 4, align = 4
;; gv0 = vmctx
;; gv1 = load.i64 notrap aligned readonly gv0+8
;; gv2 = load.i64 notrap aligned gv1
;; gv3 = vmctx
;; sig0 = (i64 vmctx, i32 uext, i32 uext) -> i32 uext system_v
;; sig1 = (i64 vmctx, i64) tail
;; sig2 = (i64 vmctx, i64) tail
;; fn0 = colocated u1:35 sig0
;; fn1 = u0:0 sig1
;; fn2 = u0:1 sig2
;; stack_limit = gv2
;;
;; block0(v0: i64, v1: i64, v2: i32):
;; v44 = stack_addr.i64 ss0
;; store notrap v2, v44
;; v46 = iconst.i32 0
;; @002f v4 = icmp eq v2, v46 ; v46 = 0
;; @002f v5 = uextend.i32 v4
;; @002f v7 = iconst.i32 1
;; v54 = select v2, v7, v46 ; v7 = 1, v46 = 0
;; @002f brif v5, block5(v54), block3
;;
;; block3:
;; v61 = iconst.i32 1
;; v62 = band.i32 v2, v61 ; v61 = 1
;; v63 = iconst.i32 0
;; v64 = select v62, v63, v61 ; v63 = 0, v61 = 1
;; @002f brif v62, block5(v64), block4
;;
;; block4:
;; @002f v20 = uextend.i64 v2
;; @002f v21 = iconst.i64 4
;; @002f v22 = uadd_overflow_trap v20, v21, user1 ; v21 = 4
;; @002f v23 = iconst.i64 8
;; @002f v24 = uadd_overflow_trap v22, v23, user1 ; v23 = 8
;; @002f v19 = load.i64 notrap aligned readonly v0+48
;; @002f v25 = icmp ule v24, v19
;; @002f trapz v25, user1
;; @002f v18 = load.i64 notrap aligned readonly v0+40
;; @002f v26 = iadd v18, v22
;; @002f v27 = load.i32 notrap aligned readonly v26
;; @002f v15 = load.i64 notrap aligned readonly v0+80
;; @002f v16 = load.i32 notrap aligned readonly v15
;; @002f v28 = icmp eq v27, v16
;; @002f v29 = uextend.i32 v28
;; @002f brif v29, block7(v29), block6
;;
;; block6:
;; @002f v31 = call fn0(v0, v27, v16), stack_map=[i32 @ ss0+0]
;; @002f jump block7(v31)
;;
;; block7(v32: i32):
;; @002f jump block5(v32)
;;
;; block5(v33: i32):
;; v40 = load.i32 notrap v44
;; @002f brif v33, block2, block8
;;
;; block8:
;; @0035 v35 = load.i64 notrap aligned readonly v0+88
;; @0035 v36 = load.i64 notrap aligned readonly v0+104
;; @0035 call_indirect sig1, v35(v36, v0)
;; @0037 return
;;
;; block2:
;; @0039 v38 = load.i64 notrap aligned readonly v0+112
;; @0039 v39 = load.i64 notrap aligned readonly v0+128
;; @0039 call_indirect sig2, v38(v39, v0)
;; @003b return
;; }
73 changes: 73 additions & 0 deletions tests/disas/gc/call-indirect-and-subtyping.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
;;! target = "x86_64"
;;! flags = "-W function-references,gc"
;;! test = "optimize"

(module
(type $t1 (sub (func)))
(type $t2 (sub $t1 (func)))
(type $t3 (sub $t2 (func)))

(import "" "f2" (func $f2 (type $t2)))
(import "" "f3" (func $f3 (type $t3)))

(table (ref null $t2) (elem $f2 $f3))

(func (export "run") (param i32)
(call_indirect (type $t1) (local.get 0))
)
)
;; function u0:2(i64 vmctx, i64, i32) tail {
;; gv0 = vmctx
;; gv1 = load.i64 notrap aligned readonly gv0+8
;; gv2 = load.i64 notrap aligned gv1
;; gv3 = vmctx
;; gv4 = load.i64 notrap aligned readonly gv3+136
;; sig0 = (i64 vmctx, i64) tail
;; sig1 = (i64 vmctx, i32 uext, i64) -> i64 system_v
;; sig2 = (i64 vmctx, i32 uext, i32 uext) -> i32 uext system_v
;; fn0 = colocated u1:9 sig1
;; fn1 = colocated u1:35 sig2
;; stack_limit = gv2
;;
;; block0(v0: i64, v1: i64, v2: i32):
;; @005c v3 = iconst.i32 2
;; @005c v4 = icmp uge v2, v3 ; v3 = 2
;; @005c v9 = iconst.i64 0
;; @005c v6 = load.i64 notrap aligned readonly v0+136
;; @005c v5 = uextend.i64 v2
;; v30 = iconst.i64 3
;; @005c v7 = ishl v5, v30 ; v30 = 3
;; @005c v8 = iadd v6, v7
;; @005c v10 = select_spectre_guard v4, v9, v8 ; v9 = 0
;; @005c v11 = load.i64 user5 aligned table v10
;; v31 = iconst.i64 -2
;; @005c v12 = band v11, v31 ; v31 = -2
;; @005c brif v11, block3(v12), block2
;;
;; block2 cold:
;; @005c v14 = iconst.i32 0
;; @005c v17 = call fn0(v0, v14, v5) ; v14 = 0
;; @005c jump block3(v17)
;;
;; block3(v13: i64):
;; @005c v21 = load.i32 user6 aligned readonly v13+16
;; @005c v19 = load.i64 notrap aligned readonly v0+80
;; @005c v20 = load.i32 notrap aligned readonly v19
;; @005c v22 = icmp eq v21, v20
;; @005c v23 = uextend.i32 v22
;; @005c brif v23, block5(v23), block4
;;
;; block4:
;; @005c v25 = call fn1(v0, v21, v20)
;; @005c jump block5(v25)
;;
;; block5(v26: i32):
;; @005c trapz v26, user7
;; @005c v27 = load.i64 notrap aligned readonly v13+8
;; @005c v28 = load.i64 notrap aligned readonly v13+24
;; @005c call_indirect sig0, v27(v28, v0)
;; @005f jump block1
;;
;; block1:
;; @005f return
;; }
70 changes: 70 additions & 0 deletions tests/disas/gc/ref-cast.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
;;! target = "x86_64"
;;! flags = "-W function-references,gc"
;;! test = "optimize"

(module
(type $s (struct))
(func (param anyref) (result (ref $s))
(ref.cast (ref $s) (local.get 0))
)
)
;; function u0:0(i64 vmctx, i64, i32) -> i32 tail {
;; ss0 = explicit_slot 4, align = 4
;; gv0 = vmctx
;; gv1 = load.i64 notrap aligned readonly gv0+8
;; gv2 = load.i64 notrap aligned gv1
;; gv3 = vmctx
;; sig0 = (i64 vmctx, i32 uext, i32 uext) -> i32 uext system_v
;; fn0 = colocated u1:35 sig0
;; stack_limit = gv2
;;
;; block0(v0: i64, v1: i64, v2: i32):
;; v38 = stack_addr.i64 ss0
;; store notrap v2, v38
;; v40 = iconst.i32 0
;; @001e v4 = icmp eq v2, v40 ; v40 = 0
;; @001e v5 = uextend.i32 v4
;; @001e v7 = iconst.i32 1
;; v48 = select v2, v7, v40 ; v7 = 1, v40 = 0
;; @001e brif v5, block4(v48), block2
;;
;; block2:
;; v55 = iconst.i32 1
;; v56 = band.i32 v2, v55 ; v55 = 1
;; v57 = iconst.i32 0
;; v58 = select v56, v57, v55 ; v57 = 0, v55 = 1
;; @001e brif v56, block4(v58), block3
;;
;; block3:
;; @001e v20 = uextend.i64 v2
;; @001e v21 = iconst.i64 4
;; @001e v22 = uadd_overflow_trap v20, v21, user1 ; v21 = 4
;; @001e v23 = iconst.i64 8
;; @001e v24 = uadd_overflow_trap v22, v23, user1 ; v23 = 8
;; @001e v19 = load.i64 notrap aligned readonly v0+48
;; @001e v25 = icmp ule v24, v19
;; @001e trapz v25, user1
;; @001e v18 = load.i64 notrap aligned readonly v0+40
;; @001e v26 = iadd v18, v22
;; @001e v27 = load.i32 notrap aligned readonly v26
;; @001e v15 = load.i64 notrap aligned readonly v0+80
;; @001e v16 = load.i32 notrap aligned readonly v15
;; @001e v28 = icmp eq v27, v16
;; @001e v29 = uextend.i32 v28
;; @001e brif v29, block6(v29), block5
;;
;; block5:
;; @001e v31 = call fn0(v0, v27, v16), stack_map=[i32 @ ss0+0]
;; @001e jump block6(v31)
;;
;; block6(v32: i32):
;; @001e jump block4(v32)
;;
;; block4(v33: i32):
;; @001e trapz v33, user19
;; v34 = load.i32 notrap v38
;; @0021 jump block1
;;
;; block1:
;; @0021 return v34
;; }

0 comments on commit ec05264

Please sign in to comment.