Mark loads from globals aligned and notrap.
Mark loads from globals generated by cton_wasm or by legalization as `aligned` and `notrap`, since memory for these globals should be allocated by the runtime environment for that purpose. This reduces the number of potentially trapping instructions, which can reduce the amount of metadata required by embedding environments.
This commit is contained in:
@@ -654,6 +654,9 @@ trap when accessed.
|
||||
address space reserved for the heap, not including the guard pages.
|
||||
:arg GuardBytes: Size of the guard pages in bytes.
|
||||
|
||||
When the base is a global variable, it must be :term:`accessible` and naturally
|
||||
aligned for a pointer value.
|
||||
|
||||
The ``reserved_reg`` option is not yet implemented.
|
||||
|
||||
Dynamic heaps
|
||||
@@ -674,6 +677,9 @@ is resized. The bound of a dynamic heap is stored in a global variable.
|
||||
:arg BoundGV: Global variable containing the current heap bound in bytes.
|
||||
:arg GuardBytes: Size of the guard pages in bytes.
|
||||
|
||||
When the base is a global variable, it must be :term:`accessible` and naturally
|
||||
aligned for a pointer value.
|
||||
|
||||
The ``reserved_reg`` option is not yet implemented.
|
||||
|
||||
Heap examples
|
||||
|
||||
@@ -23,7 +23,7 @@ function %deref(i64 vmctx) -> i64 {
|
||||
ebb1(v1: i64):
|
||||
v2 = global_addr.i64 gv2
|
||||
; check: $(a1=$V) = iadd_imm v1, -16
|
||||
; check: $(p1=$V) = load.i64 $a1
|
||||
; check: $(p1=$V) = load.i64 notrap aligned $a1
|
||||
; check: v2 = iadd_imm $p1, 32
|
||||
return v2
|
||||
; check: return v2
|
||||
@@ -55,7 +55,7 @@ ebb0(v0: i32, v999: i64):
|
||||
; Checks here are assuming that no pipehole opts fold the load offsets.
|
||||
; nextln: $(xoff=$V) = uextend.i64 v0
|
||||
; nextln: $(haddr=$V) = iadd_imm v999, 64
|
||||
; nextln: $(hbase=$V) = load.i64 $haddr
|
||||
; nextln: $(hbase=$V) = load.i64 notrap aligned $haddr
|
||||
; nextln: v1 = iadd $hbase, $xoff
|
||||
v2 = load.f32 v1+16
|
||||
; nextln: v2 = load.f32 v1+16
|
||||
@@ -103,7 +103,7 @@ ebb0(v0: i32, v999: i64):
|
||||
; Checks here are assuming that no pipehole opts fold the load offsets.
|
||||
; nextln: $(xoff=$V) = uextend.i64 v0
|
||||
; nextln: $(haddr=$V) = iadd_imm.i64 v999, 64
|
||||
; nextln: $(hbase=$V) = load.i64 $haddr
|
||||
; nextln: $(hbase=$V) = load.i64 notrap aligned $haddr
|
||||
; nextln: v1 = iadd $hbase, $xoff
|
||||
v2 = load.f32 v1+0x7fff_ffff
|
||||
; nextln: v2 = load.f32 v1+0x7fff_ffff
|
||||
|
||||
Reference in New Issue
Block a user