Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 32 additions & 4 deletions 36 crates/cranelift/src/func_environ/gc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1477,8 +1477,29 @@ impl FuncEnvironment<'_> {
&mut self,
builder: &mut FunctionBuilder,
) -> WasmResult<ir::Value> {
let global = self.get_gc_heap_base_global(&mut builder.func);
Ok(builder.ins().global_value(self.pointer_type(), global))
let pointer_type = self.pointer_type();
let offset = i32::from(self.offsets.ptr.vmstore_context_gc_heap_base());

let mut flags = ir::MemFlagsData::trusted();
let memory_tunables =
wasmtime_environ::MemoryTunables::new(self.tunables, MemoryKind::GcHeap);

// If the memory cannot move (i.e. its base pointer cannot change across
// calls) then the base pointer is readonly and this load instruction
// can move (i.e. can be LICM'd out of a loop body).
if !self
.tunables
.gc_heap_memory_type()
.memory_may_move(&memory_tunables)
{
flags.set_readonly();
flags.set_can_move();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The name collision ("may move" and "can move") tripped me up for a bit here. Worth a comment? ("memory_may_move means that the base pointer can change, so the load of the base pointer cannot be moved within the code.")

}

let store_context_ptr = self.get_vmstore_context_ptr(builder);
Ok(builder
.ins()
.load(pointer_type, flags, store_context_ptr, offset))
}

fn get_gc_heap_bound_global(&mut self, func: &mut ir::Function) -> ir::GlobalValue {
Expand Down Expand Up @@ -1507,8 +1528,15 @@ impl FuncEnvironment<'_> {
&mut self,
builder: &mut FunctionBuilder,
) -> WasmResult<ir::Value> {
let global = self.get_gc_heap_bound_global(&mut builder.func);
Ok(builder.ins().global_value(self.pointer_type(), global))
let pointer_type = self.pointer_type();
let offset = i32::from(self.offsets.ptr.vmstore_context_gc_heap_current_length());
let store_context_ptr = self.get_vmstore_context_ptr(builder);
Ok(builder.ins().load(
pointer_type,
ir::MemFlagsData::trusted(),
store_context_ptr,
offset,
))
}

/// Get or create the `Heap` for our GC heap.
Expand Down
110 changes: 55 additions & 55 deletions 110 tests/disas/array-copy-anyref.wat
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
;;
;; block0(v0: i64, v1: i64, v2: i32, v3: i32, v4: i32, v5: i32, v6: i32):
;; @002b trapz v2, user16
;; @002b v115 = load.i64 notrap aligned readonly can_move v0+8
;; @002b v8 = load.i64 notrap aligned readonly can_move v115+32
;; @002b v109 = load.i64 notrap aligned readonly can_move v0+8
;; @002b v8 = load.i64 notrap aligned readonly can_move v109+32
;; @002b v7 = uextend.i64 v2
;; @002b v9 = iadd v8, v7
;; @002b v10 = iconst.i64 16
Expand All @@ -36,64 +36,64 @@
;; @002b v19 = icmp ugt v18, v13
;; @002b trapnz v19, user17
;; @002b trapz v4, user16
;; @002b v29 = uextend.i64 v4
;; @002b v31 = iadd v8, v29
;; @002b v33 = iadd v31, v10 ; v10 = 16
;; @002b v34 = load.i32 user2 readonly region0 v33
;; @002b v36 = uextend.i64 v5
;; @002b v40 = iadd v36, v15
;; @002b v35 = uextend.i64 v34
;; @002b v41 = icmp ugt v40, v35
;; @002b trapnz v41, user17
;; @002b v57 = load.i64 notrap aligned v115+40
;; @002b v23 = iconst.i64 20
;; @002b v24 = iadd v9, v23 ; v23 = 20
;; v119 = iconst.i64 2
;; v120 = ishl v14, v119 ; v119 = 2
;; @002b v28 = iadd v24, v120
;; v124 = ishl v15, v119 ; v119 = 2
;; @002b v59 = uadd_overflow_trap v28, v124, user2
;; @002b v58 = iadd v8, v57
;; @002b v60 = icmp ugt v59, v58
;; @002b trapnz v60, user2
;; @002b v46 = iadd v31, v23 ; v23 = 20
;; v122 = ishl v36, v119 ; v119 = 2
;; @002b v50 = iadd v46, v122
;; @002b v64 = uadd_overflow_trap v50, v124, user2
;; @002b v65 = icmp ugt v64, v58
;; @002b trapnz v65, user2
;; @002b v30 = uextend.i64 v4
;; @002b v32 = iadd v8, v30
;; @002b v34 = iadd v32, v10 ; v10 = 16
;; @002b v35 = load.i32 user2 readonly region0 v34
;; @002b v37 = uextend.i64 v5
;; @002b v41 = iadd v37, v15
;; @002b v36 = uextend.i64 v35
;; @002b v42 = icmp ugt v41, v36
;; @002b trapnz v42, user17
;; @002b v61 = load.i64 notrap aligned v109+40
;; @002b v24 = iconst.i64 20
;; @002b v25 = iadd v9, v24 ; v24 = 20
;; v113 = iconst.i64 2
;; v114 = ishl v14, v113 ; v113 = 2
;; @002b v29 = iadd v25, v114
;; v118 = ishl v15, v113 ; v113 = 2
;; @002b v63 = uadd_overflow_trap v29, v118, user2
;; @002b v62 = iadd v8, v61
;; @002b v64 = icmp ugt v63, v62
;; @002b trapnz v64, user2
;; @002b v48 = iadd v32, v24 ; v24 = 20
;; v116 = ishl v37, v113 ; v113 = 2
;; @002b v52 = iadd v48, v116
;; @002b v70 = uadd_overflow_trap v52, v118, user2
;; @002b v71 = icmp ugt v70, v62
;; @002b trapnz v71, user2
;; @002b brif v6, block2, block5
;;
;; block2:
;; @002b v66 = icmp.i64 ult v28, v50
;; @002b v71 = iadd.i64 v28, v124
;; @002b v72 = iadd.i64 v50, v124
;; @002b v74 = iadd.i32 v5, v6
;; @002b v26 = iconst.i64 4
;; @002b v97 = iconst.i32 1
;; @002b brif v66, block3(v28, v50, v5), block4(v71, v72, v74)
;; @002b v72 = icmp.i64 ult v29, v52
;; @002b v77 = iadd.i64 v29, v118
;; @002b v78 = iadd.i64 v52, v118
;; @002b v80 = iadd.i32 v5, v6
;; @002b v27 = iconst.i64 4
;; @002b v103 = iconst.i32 1
;; @002b brif v72, block3(v29, v52, v5), block4(v77, v78, v80)
;;
;; block3(v75: i64, v76: i64, v77: i32):
;; @002b v80 = load.i32 user2 little region0 v76
;; @002b store user2 little region0 v80, v75
;; v131 = iconst.i64 4
;; v132 = iadd v76, v131 ; v131 = 4
;; @002b v87 = icmp eq v132, v72
;; v133 = iadd v75, v131 ; v131 = 4
;; v134 = iconst.i32 1
;; v135 = iadd v77, v134 ; v134 = 1
;; @002b brif v87, block5, block3(v133, v132, v135)
;; block3(v81: i64, v82: i64, v83: i32):
;; @002b v86 = load.i32 user2 little region0 v82
;; @002b store user2 little region0 v86, v81
;; v125 = iconst.i64 4
;; v126 = iadd v82, v125 ; v125 = 4
;; @002b v93 = icmp eq v126, v78
;; v127 = iadd v81, v125 ; v125 = 4
;; v128 = iconst.i32 1
;; v129 = iadd v83, v128 ; v128 = 1
;; @002b brif v93, block5, block3(v127, v126, v129)
;;
;; block4(v88: i64, v89: i64, v90: i32):
;; v126 = iconst.i64 4
;; v127 = isub v89, v126 ; v126 = 4
;; @002b v99 = load.i32 user2 little region0 v127
;; v128 = isub v88, v126 ; v126 = 4
;; @002b store user2 little region0 v99, v128
;; @002b v100 = icmp eq v127, v50
;; v129 = iconst.i32 1
;; v130 = isub v90, v129 ; v129 = 1
;; @002b brif v100, block5, block4(v128, v127, v130)
;; block4(v94: i64, v95: i64, v96: i32):
;; v120 = iconst.i64 4
;; v121 = isub v95, v120 ; v120 = 4
;; @002b v105 = load.i32 user2 little region0 v121
;; v122 = isub v94, v120 ; v120 = 4
;; @002b store user2 little region0 v105, v122
;; @002b v106 = icmp eq v121, v52
;; v123 = iconst.i32 1
;; v124 = isub v96, v123 ; v123 = 1
;; @002b brif v106, block5, block4(v122, v121, v124)
;;
;; block5:
;; @002f jump block1
Expand Down
58 changes: 29 additions & 29 deletions 58 tests/disas/array-copy-i64.wat
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
;;
;; block0(v0: i64, v1: i64, v2: i32, v3: i32, v4: i32, v5: i32, v6: i32):
;; @002b trapz v2, user16
;; @002b v80 = load.i64 notrap aligned readonly can_move v0+8
;; @002b v8 = load.i64 notrap aligned readonly can_move v80+32
;; @002b v74 = load.i64 notrap aligned readonly can_move v0+8
;; @002b v8 = load.i64 notrap aligned readonly can_move v74+32
;; @002b v7 = uextend.i64 v2
;; @002b v9 = iadd v8, v7
;; @002b v10 = iconst.i64 16
Expand All @@ -38,33 +38,33 @@
;; @002b v19 = icmp ugt v18, v13
;; @002b trapnz v19, user17
;; @002b trapz v4, user16
;; @002b v29 = uextend.i64 v4
;; @002b v31 = iadd v8, v29
;; @002b v33 = iadd v31, v10 ; v10 = 16
;; @002b v34 = load.i32 user2 readonly region0 v33
;; @002b v36 = uextend.i64 v5
;; @002b v40 = iadd v36, v15
;; @002b v35 = uextend.i64 v34
;; @002b v41 = icmp ugt v40, v35
;; @002b trapnz v41, user17
;; @002b v57 = load.i64 notrap aligned v80+40
;; @002b v23 = iconst.i64 24
;; @002b v24 = iadd v9, v23 ; v23 = 24
;; v84 = iconst.i64 3
;; v85 = ishl v14, v84 ; v84 = 3
;; @002b v28 = iadd v24, v85
;; v89 = ishl v15, v84 ; v84 = 3
;; @002b v59 = uadd_overflow_trap v28, v89, user2
;; @002b v58 = iadd v8, v57
;; @002b v60 = icmp ugt v59, v58
;; @002b trapnz v60, user2
;; @002b v46 = iadd v31, v23 ; v23 = 24
;; v87 = ishl v36, v84 ; v84 = 3
;; @002b v50 = iadd v46, v87
;; @002b v64 = uadd_overflow_trap v50, v89, user2
;; @002b v65 = icmp ugt v64, v58
;; @002b trapnz v65, user2
;; @002b call fn0(v0, v28, v50, v89)
;; @002b v30 = uextend.i64 v4
;; @002b v32 = iadd v8, v30
;; @002b v34 = iadd v32, v10 ; v10 = 16
;; @002b v35 = load.i32 user2 readonly region0 v34
;; @002b v37 = uextend.i64 v5
;; @002b v41 = iadd v37, v15
;; @002b v36 = uextend.i64 v35
;; @002b v42 = icmp ugt v41, v36
;; @002b trapnz v42, user17
;; @002b v61 = load.i64 notrap aligned v74+40
;; @002b v24 = iconst.i64 24
;; @002b v25 = iadd v9, v24 ; v24 = 24
;; v78 = iconst.i64 3
;; v79 = ishl v14, v78 ; v78 = 3
;; @002b v29 = iadd v25, v79
;; v83 = ishl v15, v78 ; v78 = 3
;; @002b v63 = uadd_overflow_trap v29, v83, user2
;; @002b v62 = iadd v8, v61
;; @002b v64 = icmp ugt v63, v62
;; @002b trapnz v64, user2
;; @002b v48 = iadd v32, v24 ; v24 = 24
;; v81 = ishl v37, v78 ; v78 = 3
;; @002b v52 = iadd v48, v81
;; @002b v70 = uadd_overflow_trap v52, v83, user2
;; @002b v71 = icmp ugt v70, v62
;; @002b trapnz v71, user2
;; @002b call fn0(v0, v29, v52, v83)
;; @002f jump block1
;;
;; block1:
Expand Down
50 changes: 25 additions & 25 deletions 50 tests/disas/array-copy-i8.wat
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
;;
;; block0(v0: i64, v1: i64, v2: i32, v3: i32, v4: i32, v5: i32, v6: i32):
;; @002b trapz v2, user16
;; @002b v80 = load.i64 notrap aligned readonly can_move v0+8
;; @002b v8 = load.i64 notrap aligned readonly can_move v80+32
;; @002b v74 = load.i64 notrap aligned readonly can_move v0+8
;; @002b v8 = load.i64 notrap aligned readonly can_move v74+32
;; @002b v7 = uextend.i64 v2
;; @002b v9 = iadd v8, v7
;; @002b v10 = iconst.i64 16
Expand All @@ -38,29 +38,29 @@
;; @002b v19 = icmp ugt v18, v13
;; @002b trapnz v19, user17
;; @002b trapz v4, user16
;; @002b v29 = uextend.i64 v4
;; @002b v31 = iadd v8, v29
;; @002b v33 = iadd v31, v10 ; v10 = 16
;; @002b v34 = load.i32 user2 readonly region0 v33
;; @002b v36 = uextend.i64 v5
;; @002b v40 = iadd v36, v15
;; @002b v35 = uextend.i64 v34
;; @002b v41 = icmp ugt v40, v35
;; @002b trapnz v41, user17
;; @002b v57 = load.i64 notrap aligned v80+40
;; @002b v23 = iconst.i64 20
;; @002b v24 = iadd v9, v23 ; v23 = 20
;; @002b v28 = iadd v24, v14
;; @002b v59 = uadd_overflow_trap v28, v15, user2
;; @002b v58 = iadd v8, v57
;; @002b v60 = icmp ugt v59, v58
;; @002b trapnz v60, user2
;; @002b v46 = iadd v31, v23 ; v23 = 20
;; @002b v50 = iadd v46, v36
;; @002b v64 = uadd_overflow_trap v50, v15, user2
;; @002b v65 = icmp ugt v64, v58
;; @002b trapnz v65, user2
;; @002b call fn0(v0, v28, v50, v15)
;; @002b v30 = uextend.i64 v4
;; @002b v32 = iadd v8, v30
;; @002b v34 = iadd v32, v10 ; v10 = 16
;; @002b v35 = load.i32 user2 readonly region0 v34
;; @002b v37 = uextend.i64 v5
;; @002b v41 = iadd v37, v15
;; @002b v36 = uextend.i64 v35
;; @002b v42 = icmp ugt v41, v36
;; @002b trapnz v42, user17
;; @002b v61 = load.i64 notrap aligned v74+40
;; @002b v24 = iconst.i64 20
;; @002b v25 = iadd v9, v24 ; v24 = 20
;; @002b v29 = iadd v25, v14
;; @002b v63 = uadd_overflow_trap v29, v15, user2
;; @002b v62 = iadd v8, v61
;; @002b v64 = icmp ugt v63, v62
;; @002b trapnz v64, user2
;; @002b v48 = iadd v32, v24 ; v24 = 20
;; @002b v52 = iadd v48, v37
;; @002b v70 = uadd_overflow_trap v52, v15, user2
;; @002b v71 = icmp ugt v70, v62
;; @002b trapnz v71, user2
;; @002b call fn0(v0, v29, v52, v15)
;; @002f jump block1
;;
;; block1:
Expand Down
Loading
Loading
Morty Proxy This is a proxified and sanitized view of the page, visit original site.