Files
wasmtime/cranelift/filetests/filetests/wasm/duplicate-loads-dynamic-memory.wat
Nick Fitzgerald f4a2d5337a Cranelift: GVN uadd_overflow_trap (#5520)
* Switch duplicate loads w/ dynamic memories test to `min_size = 0`

This test was accidentally hitting a special case for bounds checks for when we
know that `offset + access_size < min_size` and can skip some steps. This
commit changes the `min_size` of the memory to zero so that we are forced to do
fully general bounds checks.

* Cranelift: Mark `uadd_overflow_trap` as okay for GVN

Although this improves our test sequence for duplicate loads with dynamic
memories, it unfortunately doesn't have any effect on sightglass benchmarks:

```
instantiation :: instructions-retired :: benchmarks/pulldown-cmark/benchmark.wasm

  No difference in performance.

  [34448 35607.23 37158] gvn_uadd_overflow_trap.so
  [34566 35734.05 36585] main.so

instantiation :: instructions-retired :: benchmarks/spidermonkey/benchmark.wasm

  No difference in performance.

  [44101 60449.62 92712] gvn_uadd_overflow_trap.so
  [44011 60436.37 92690] main.so

instantiation :: instructions-retired :: benchmarks/bz2/benchmark.wasm

  No difference in performance.

  [35595 36675.72 38153] gvn_uadd_overflow_trap.so
  [35440 36670.42 37993] main.so

compilation :: instructions-retired :: benchmarks/bz2/benchmark.wasm

  No difference in performance.

  [17370195 17405125.62 17471222] gvn_uadd_overflow_trap.so
  [17369324 17404859.43 17470725] main.so

execution :: instructions-retired :: benchmarks/spidermonkey/benchmark.wasm

  No difference in performance.

  [7055720520 7055886880.32 7056265930] gvn_uadd_overflow_trap.so
  [7055719554 7055843809.33 7056193289] main.so

compilation :: instructions-retired :: benchmarks/spidermonkey/benchmark.wasm

  No difference in performance.

  [683589861 683767276.00 684098366] gvn_uadd_overflow_trap.so
  [683590024 683767998.02 684097885] main.so

execution :: instructions-retired :: benchmarks/pulldown-cmark/benchmark.wasm

  No difference in performance.

  [46436883 46437135.10 46437823] gvn_uadd_overflow_trap.so
  [46436883 46437087.67 46437785] main.so

compilation :: instructions-retired :: benchmarks/pulldown-cmark/benchmark.wasm

  No difference in performance.

  [126522461 126565812.58 126647044] gvn_uadd_overflow_trap.so
  [126522176 126565757.75 126647522] main.so

execution :: instructions-retired :: benchmarks/bz2/benchmark.wasm

  No difference in performance.

  [653010531 653010533.03 653010544] gvn_uadd_overflow_trap.so
  [653010531 653010533.18 653010537] main.so
```

* cranelift-codegen-meta: Rename `side_effects_okay_for_gvn` to `side_effects_idempotent`

* cranelift-filetests: Ensure there is a trailing newline for blessed Wasm tests
2023-01-04 22:03:16 -08:00

115 lines
4.3 KiB
Plaintext

;;! target = "x86_64"
;;!
;;! optimize = true
;;!
;;! settings = [
;;! "enable_heap_access_spectre_mitigation=true",
;;! "opt_level=speed_and_size"
;;! ]
;;!
;;! [globals.vmctx]
;;! type = "i64"
;;! vmctx = true
;;!
;;! [globals.heap_base]
;;! type = "i64"
;;! load = { base = "vmctx", offset = 0 }
;;!
;;! [globals.heap_bound]
;;! type = "i64"
;;! load = { base = "vmctx", offset = 8 }
;;!
;;! [[heaps]]
;;! base = "heap_base"
;;! min_size = 0
;;! offset_guard_size = 0xffffffff
;;! index_type = "i32"
;;! style = { kind = "dynamic", bound = "heap_bound" }
(module
(memory (export "memory") 0)
(func (export "load-without-offset") (param i32) (result i32 i32)
local.get 0
i32.load
local.get 0
i32.load
)
(func (export "load-with-offset") (param i32) (result i32 i32)
local.get 0
i32.load offset=1234
local.get 0
i32.load offset=1234
)
)
;; function u0:0(i32, i64 vmctx) -> i32, i32 fast {
;; gv0 = vmctx
;; gv1 = load.i64 notrap aligned gv0+8
;; gv2 = load.i64 notrap aligned gv0
;;
;; block0(v0: i32, v1: i64):
;; @0057 v4 = uextend.i64 v0
;; v14 -> v4
;; @0057 v5 = iconst.i64 4
;; v15 -> v5
;; @0057 v6 = uadd_overflow_trap v4, v5, heap_oob ; v5 = 4
;; v16 -> v6
;; @0057 v7 = load.i64 notrap aligned v1+8
;; v17 -> v7
;; @0057 v8 = load.i64 notrap aligned v1
;; v18 -> v8
;; @0057 v9 = iadd v8, v4
;; v19 -> v9
;; @0057 v10 = iconst.i64 0
;; v20 -> v10
;; @0057 v11 = icmp ugt v6, v7
;; v21 -> v11
;; @0057 v12 = select_spectre_guard v11, v10, v9 ; v10 = 0
;; v22 -> v12
;; @0057 v13 = load.i32 little heap v12
;; v2 -> v13
;; v23 -> v13
;; v3 -> v23
;; @005f jump block1
;;
;; block1:
;; @005f return v13, v13
;; }
;;
;; function u0:1(i32, i64 vmctx) -> i32, i32 fast {
;; gv0 = vmctx
;; gv1 = load.i64 notrap aligned gv0+8
;; gv2 = load.i64 notrap aligned gv0
;;
;; block0(v0: i32, v1: i64):
;; @0064 v4 = uextend.i64 v0
;; v15 -> v4
;; @0064 v5 = iconst.i64 1238
;; v16 -> v5
;; @0064 v6 = uadd_overflow_trap v4, v5, heap_oob ; v5 = 1238
;; v17 -> v6
;; @0064 v7 = load.i64 notrap aligned v1+8
;; v18 -> v7
;; @0064 v8 = load.i64 notrap aligned v1
;; v19 -> v8
;; @0064 v9 = iadd v8, v4
;; v20 -> v9
;; v26 = iconst.i64 1234
;; v27 -> v26
;; @0064 v10 = iadd v9, v26 ; v26 = 1234
;; v21 -> v10
;; @0064 v11 = iconst.i64 0
;; v22 -> v11
;; @0064 v12 = icmp ugt v6, v7
;; v23 -> v12
;; @0064 v13 = select_spectre_guard v12, v11, v10 ; v11 = 0
;; v24 -> v13
;; @0064 v14 = load.i32 little heap v13
;; v2 -> v14
;; v25 -> v14
;; v3 -> v25
;; @006e jump block1
;;
;; block1:
;; @006e return v14, v14
;; }