* Cranelift: implement `heap_{load,store}` instruction legalization
This does not remove `heap_addr` yet, but it does factor out the common
bounds-check-and-compute-the-native-address functionality that is shared between
all of `heap_{addr,load,store}`.
Finally, this adds a missing optimization for when we can dedupe explicit bounds
checks for static memories and Spectre mitigations.
* Cranelift: Enable `heap_load_store_*` run tests on all targets
23 lines
621 B
Plaintext
23 lines
621 B
Plaintext
test legalizer
|
|
set enable_heap_access_spectre_mitigation=true
|
|
target x86_64
|
|
|
|
;; The offset guard is large enough that we don't need explicit bounds checks.
|
|
|
|
function %test(i64 vmctx, i32) -> i64 {
|
|
gv0 = vmctx
|
|
gv1 = load.i64 notrap aligned gv0+0
|
|
heap0 = static gv1, min 0x1000, bound 0x1000, offset_guard 0xffff_ffff, index_type i32
|
|
|
|
block0(v0: i64, v1: i32):
|
|
v2 = heap_addr.i64 heap0, v1, 0, 4
|
|
return v2
|
|
}
|
|
|
|
; check: block0(v0: i64, v1: i32):
|
|
; nextln: v3 = uextend.i64 v1
|
|
; nextln: v4 = load.i64 notrap aligned v0
|
|
; nextln: v5 = iadd v4, v3
|
|
; nextln: v2 -> v5
|
|
; nextln: return v2
|