Path: blob/main/tests/disas/dynamic-memory-no-spectre-access-same-index-different-offsets.wat
3130 views
;;! target = "x86_64"
;;! test = "optimize"
;;! flags = [
;;! "-Ccranelift-enable-heap-access-spectre-mitigation=false",
;;! "-Ostatic-memory-maximum-size=0",
;;! "-Odynamic-memory-guard-size=0xffff",
;;! ]
(module
(memory (export "memory") 0)
(func (export "loads") (param i32) (result i32 i32 i32)
;; Within the guard region.
local.get 0
i32.load offset=0
;; Also within the guard region, bounds check should GVN with previous.
local.get 0
i32.load offset=4
;; Outside the guard region, needs additional bounds checks.
local.get 0
i32.load offset=0x000fffff
)
;; Same as above, but for stores.
(func (export "stores") (param i32 i32 i32 i32)
local.get 0
local.get 1
i32.store offset=0
local.get 0
local.get 2
i32.store offset=4
local.get 0
local.get 3
i32.store offset=0x000fffff
)
)
;; function u0:0(i64 vmctx, i64, i32) -> i32, i32, i32 tail {
;; gv0 = vmctx
;; gv1 = load.i64 notrap aligned readonly gv0+8
;; gv2 = load.i64 notrap aligned gv1+24
;; gv3 = vmctx
;; gv4 = load.i64 notrap aligned gv3+64
;; gv5 = load.i64 notrap aligned can_move checked gv3+56
;; stack_limit = gv2
;;
;; block0(v0: i64, v1: i64, v2: i32):
;; @0047 v7 = load.i64 notrap aligned v0+64
;; @0047 v6 = uextend.i64 v2
;; @0047 v8 = icmp ugt v6, v7
;; @0047 trapnz v8, heap_oob
;; @0047 v9 = load.i64 notrap aligned can_move checked v0+56
;; @0047 v10 = iadd v9, v6
;; @0047 v11 = load.i32 little heap v10
;; @004c v17 = iconst.i64 4
;; @004c v18 = iadd v10, v17 ; v17 = 4
;; @004c v19 = load.i32 little heap v18
;; @0051 v21 = iconst.i64 0x0010_0003
;; @0051 v22 = uadd_overflow_trap v6, v21, heap_oob ; v21 = 0x0010_0003
;; @0051 v24 = icmp ugt v22, v7
;; @0051 trapnz v24, heap_oob
;; @0051 v27 = iconst.i64 0x000f_ffff
;; @0051 v28 = iadd v10, v27 ; v27 = 0x000f_ffff
;; @0051 v29 = load.i32 little heap v28
;; @0056 jump block1
;;
;; block1:
;; @0056 return v11, v19, v29
;; }
;;
;; function u0:1(i64 vmctx, i64, i32, i32, i32, i32) tail {
;; gv0 = vmctx
;; gv1 = load.i64 notrap aligned readonly gv0+8
;; gv2 = load.i64 notrap aligned gv1+24
;; gv3 = vmctx
;; gv4 = load.i64 notrap aligned gv3+64
;; gv5 = load.i64 notrap aligned can_move checked gv3+56
;; stack_limit = gv2
;;
;; block0(v0: i64, v1: i64, v2: i32, v3: i32, v4: i32, v5: i32):
;; @005d v7 = load.i64 notrap aligned v0+64
;; @005d v6 = uextend.i64 v2
;; @005d v8 = icmp ugt v6, v7
;; @005d trapnz v8, heap_oob
;; @005d v9 = load.i64 notrap aligned can_move checked v0+56
;; @005d v10 = iadd v9, v6
;; @005d store little heap v3, v10
;; @0064 v16 = iconst.i64 4
;; @0064 v17 = iadd v10, v16 ; v16 = 4
;; @0064 store little heap v4, v17
;; @006b v19 = iconst.i64 0x0010_0003
;; @006b v20 = uadd_overflow_trap v6, v19, heap_oob ; v19 = 0x0010_0003
;; @006b v22 = icmp ugt v20, v7
;; @006b trapnz v22, heap_oob
;; @006b v25 = iconst.i64 0x000f_ffff
;; @006b v26 = iadd v10, v25 ; v25 = 0x000f_ffff
;; @006b store little heap v5, v26
;; @0070 jump block1
;;
;; block1:
;; @0070 return
;; }