Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/tests/disas/dynamic-memory-no-spectre-access-same-index-different-offsets.wat
1691 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+16
;;     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+16
;;     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
;; }