Skip to content
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
31 changes: 23 additions & 8 deletions majit/majit-backend-wasm/src/codegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -669,8 +669,10 @@ pub fn label_ref_capture_slots(inputargs: &[InputArg], ops: &[Op]) -> usize {
LabelResumeData::collect(inputargs, ops).ref_slots
}

/// First free value position — one past the highest id any input arg or op
/// result occupies. `majit_gc::rewrite::remove_ref_constants` numbers the
/// First free value position — one past the highest id any value reference in
/// the trace occupies (input args, op results, and every op argument, including
/// a folded value the constants pool alone binds).
/// `majit_gc::rewrite::remove_ref_constants` numbers the
/// `LoadFromGcTable` results it emits from here upward, so the operand
/// numbering the optimizer produced stays untouched. Same id set
/// `collect_guards_and_vars` sizes `num_vars` from, so the loads land inside
Expand Down Expand Up @@ -1303,12 +1305,25 @@ fn collect_guards_and_vars(inputargs: &[InputArg], ops: &[Op]) -> (Vec<GuardExit
{
max_var = op.pos.get().raw() + 1;
}
if op.opcode == OpCode::Label {
for a in op.getarglist().iter() {
let a = a.to_opref();
if a != OpRef::NONE && !a.is_constant() && a.raw() + 1 > max_var {
max_var = a.raw() + 1;
}
// Every value an op reads occupies a local, whether or not the trace
// also contains an op that produces it: constant folding and the short
// preamble leave a folded value bound only by the constants pool, and
// `unbound_pool_const_seeds` materializes it in the prologue. Counting
// only op results would under-size `num_vars` for such a value and,
// through `next_value_pos`, let `remove_ref_constants` reuse its id for
// a `LoadFromGcTable` — whose store then lands after the read, so the
// read returns the zero wasm initializes the local to.
let widen = |a: OpRef, max_var: &mut u32| {
if a != OpRef::NONE && !a.is_constant() && a.raw() + 1 > *max_var {
*max_var = a.raw() + 1;
}
};
for a in op.getarglist().iter() {
widen(a.to_opref(), &mut max_var);
}
Comment on lines +1321 to +1323

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve float types for operand-only locals

When the folded value this loop now admits is a Float that survives only as an operand/constant-pool seed, num_vars is widened for its raw id but collect_value_types still marks only input args and op results as F64, leaving this new local as I64. A later Float* op resolves the same OpRef via emit_resolve_f64 and emits local.get of an i64 local where wasm expects f64, so folded-float short-preamble traces are rejected/invalid instead of compiling correctly; the operand census needs to propagate the value type (or decline) along with increasing num_vars.

Useful? React with 👍 / 👎.

Comment on lines +1321 to +1323

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Include operand-only refs in wasm ref tracking

When this loop now admits non-constant operand ids that have no producer, only num_vars is widened. The Ref census used by RefHomes, write_barrier_base, and LABEL captures still marks only input args/op results, so a pool-seeded Ref used as a store value or live across a collecting call is treated as an i64 scalar: wasm can omit the write barrier/root slot and the GC may miss a young object or fail to forward it. The same operand walk needs to propagate Ref-ness, or decline, rather than only increasing max_var.

AGENTS.md reference: AGENTS.md:L14-L20

Useful? React with 👍 / 👎.

if let Some(fa) = op.getfailargs() {
for a in fa.iter() {
widen(a.to_opref(), &mut max_var);
}
}

Expand Down
2 changes: 1 addition & 1 deletion pyre/bench/synth/closure_per_call.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=471
guard_failures=470
internal_compile_panics=0
loops_aborted=0
loops_compiled=4
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=8
bridges_compiled=18
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1605
guard_failures=3610
internal_compile_panics=0
loops_aborted=0
loops_compiled=6
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=8
bridges_compiled=18
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1605
guard_failures=3610
internal_compile_panics=0
loops_aborted=0
loops_compiled=6
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=8
bridges_compiled=18
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1605
guard_failures=3610
internal_compile_panics=0
loops_aborted=0
loops_compiled=6
4 changes: 2 additions & 2 deletions pyre/bench/synth/const_arg_call_resume.cranelift.jitstats
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=7
bridges_compiled=9
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1403
guard_failures=1804
internal_compile_panics=0
loops_aborted=0
loops_compiled=3
4 changes: 2 additions & 2 deletions pyre/bench/synth/const_arg_call_resume.dynasm.jitstats
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=7
bridges_compiled=9
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1403
guard_failures=1804
internal_compile_panics=0
loops_aborted=0
loops_compiled=3
4 changes: 2 additions & 2 deletions pyre/bench/synth/const_arg_call_resume.wasm.jitstats
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=7
bridges_compiled=9
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1404
guard_failures=1804
internal_compile_panics=0
loops_aborted=0
loops_compiled=3
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
bridges_compiled=2
bridges_compiled=3
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
bridges_compiled=2
bridges_compiled=3
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=2
bridges_compiled=3
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=401
guard_failures=601
internal_compile_panics=0
loops_aborted=0
loops_compiled=4
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
bridges_compiled=5
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1016
internal_compile_panics=0
loops_aborted=0
loops_compiled=15
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=2
bridges_compiled=4
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=406
guard_failures=606
internal_compile_panics=0
loops_aborted=0
loops_compiled=6
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=2
bridges_compiled=4
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=406
guard_failures=606
internal_compile_panics=0
loops_aborted=0
loops_compiled=6
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=3
bridges_compiled=5
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=608
guard_failures=1008
internal_compile_panics=0
loops_aborted=0
loops_compiled=6
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=11
bridges_compiled=12
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=2261
guard_failures=2461
internal_compile_panics=0
loops_aborted=0
loops_compiled=3
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=11
bridges_compiled=12
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=2261
guard_failures=2461
internal_compile_panics=0
loops_aborted=0
loops_compiled=3
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=11
bridges_compiled=12
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=2261
guard_failures=2461
internal_compile_panics=0
loops_aborted=0
loops_compiled=3
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=816
guard_failures=817
internal_compile_panics=0
loops_aborted=0
loops_compiled=17
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=816
guard_failures=817
internal_compile_panics=0
loops_aborted=0
loops_compiled=17
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=818
guard_failures=820
internal_compile_panics=0
loops_aborted=0
loops_compiled=17
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=2
bridges_compiled=4
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=404
guard_failures=607
internal_compile_panics=0
loops_aborted=0
loops_compiled=5
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=2
bridges_compiled=4
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=404
guard_failures=607
internal_compile_panics=0
loops_aborted=0
loops_compiled=5
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=2
bridges_compiled=4
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=404
guard_failures=804
internal_compile_panics=0
loops_aborted=0
loops_compiled=5
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=7
bridges_compiled=8
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1654
guard_failures=1670
internal_compile_panics=0
loops_aborted=0
loops_compiled=4
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=7
bridges_compiled=8
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1654
guard_failures=1670
internal_compile_panics=0
loops_aborted=0
loops_compiled=4
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=8
bridges_compiled=9
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1836
guard_failures=2037
internal_compile_panics=0
loops_aborted=0
loops_compiled=4
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1335
guard_failures=1345
internal_compile_panics=0
loops_aborted=1
loops_compiled=12
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1335
guard_failures=1345
internal_compile_panics=0
loops_aborted=1
loops_compiled=12
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1335
guard_failures=1345
internal_compile_panics=0
loops_aborted=1
loops_compiled=12
2 changes: 1 addition & 1 deletion pyre/bench/synth/minmax_key_rooting.cranelift.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1
guard_failures=5
internal_compile_panics=0
loops_aborted=0
loops_compiled=1
2 changes: 1 addition & 1 deletion pyre/bench/synth/minmax_key_rooting.dynasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1
guard_failures=5
internal_compile_panics=0
loops_aborted=0
loops_compiled=1
2 changes: 1 addition & 1 deletion pyre/bench/synth/minmax_key_rooting.wasm.jitstats
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=1
guard_failures=5
internal_compile_panics=0
loops_aborted=0
loops_compiled=1
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
bridges_compiled=2
bridges_compiled=6
descr_set_absent=0
descr_set_ambiguous=0
descr_set_stale_absent=0
fbw_rolled_back_with_effects=0
guard_failures=401
guard_failures=1202
internal_compile_panics=0
loops_aborted=0
loops_compiled=2
Loading
Loading