docs(plan): fold in the 2026-08-04 findings - #7397
Conversation
Two things this plan treated as measured were not. Statepoints could not compile on aarch64-ELF at all -- a hard failure on a default-on path, from two stacked bugs (#7390: the compact stack-map parser did not model GNU-as `sym = expr`, emitted only at -O3 and only on ELF; and the assembler was not told the -mcpu the code generator was told, so Graviton-emitted SVE was rejected) behind two toolchain ones (#7384, #7388). And three of the four RS4GC matrix arms had NEVER executed, in any run, for want of a concurrency group (#7393). Every "the ELF arm is the only one red" conclusion rested on arms that never reached a runner. That is a fifth way a gate cannot fail, and it is now written down. Also folded in: nine Layer 3 rooting fixes and the rule they share (ordering, not missing roots; a fault that MOVES is a real fix, one that does not move by a byte was already dead before you rooted it); #7380's type confusion and the `gc_type == GC_TYPE_OBJECT` generalisation; RSS -69% (#7377); and the first honest performance measurement -- two benchmarks that measure nothing (#7395) and the array-store guard's siting cost (#7396). The Layer 1 framing is corrected: lower_exprs_rooted already implements the RFC's proposal for codegen operands, gated on any_later_ref_may_trigger_gc, and all four arms of func_ref.rs use it. So the gap is Layer 3, where #7389 supplies the first structural answer.
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughThe engine plan records aarch64-ELF and RS4GC validation gaps, Layer 3 GC correctness findings, RSS and benchmark measurements, methodology requirements, and revised implementation sequencing. ChangesEngine plan status
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related issues
Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/engine-plan.md`:
- Around line 480-501: Update the incident summary to remove `#7380` from the
“Every one was an ordering bug” group, state that the other eight fixes followed
the root-before-allocation and re-read-after rule, and list `#7380` separately as
the type-confusion case described in the following paragraph.
- Around line 630-639: Correct the sequencing in the numbered plan around the
entries beginning “Performance now has a measured starting point” and “CI
hygiene is a correctness input.” Ensure the steps progress consecutively after
step 5, with the existing step 6 positioned or renumbered before these entries
as appropriate, and preserve the content of each item.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: c2b6d76f-9434-43f4-bb53-94e9ff3254f1
📒 Files selected for processing (2)
changelog.d/7397-plan-update.mddocs/engine-plan.md
| 7. **Performance now has a measured starting point, and two traps in front of | ||
| it.** `bench_fibonacci`/`bench_bitwise` measure nothing (#7395) — fix or | ||
| retire them before any performance claim cites them. `bench_array_ops` is | ||
| 4.5× behind Node with the array-store guard and growth path dominating | ||
| (#7396). **Measure on a quiet host**: a first fix attempt was reverted because | ||
| host load hit 55 and its disassembly check matched an absent symbol. | ||
|
|
||
| 8. **CI hygiene is a correctness input, not housekeeping.** Three of four RS4GC | ||
| arms had never executed (#7393). Before citing any matrix as platform | ||
| coverage, confirm its arms actually reach a runner. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Fix the sequencing numbers.
The sequence goes from step 5 to step 7, then step 8, and then step 6 at Line 640. This makes the plan order ambiguous. Renumber the inserted entries or move step 6 before them.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/engine-plan.md` around lines 630 - 639, Correct the sequencing in the
numbered plan around the entries beginning “Performance now has a measured
starting point” and “CI hygiene is a correctness input.” Ensure the steps
progress consecutively after step 5, with the existing step 6 positioned or
renumbered before these entries as appropriate, and preserve the content of each
item.
Two things this plan treated as measured were not.
Statepoints could not compile on aarch64-ELF at all
A hard failure on a default-on path (aarch64-Linux is inside the target-aware allowed set), from two stacked bugs behind two toolchain ones:
sym = expr— emitted only at-O3, only on ELF-mcputhe code generator was told → Graviton SVE rejectedsetup-llvm22installedllvm-22-devwithoutclang-22The transferable part is the repro: the parser is a pure function over assembly text, so what was needed was ELF text, not an ELF machine.
Three of four RS4GC arms had never executed
Not once, in any run. No
concurrencygroup, so a four-arm matrix multiplied on every push and only aarch64 ever reached a runner — which is why it was the only arm ever seen red or green (#7393).This invalidates conclusions, not just tidiness. Every "the ELF arm is the only one red" statement rested on arms that never ran. Recorded as a fifth way a gate cannot fail: a matrix arm that never reaches a runner presents as platform coverage while reporting nothing.
Layer 1 framing corrected
expr/temp_root.rs::lower_exprs_rootedalready implements what the RFC proposes for codegen operands — left-to-right lowering, each finished value rooted across those that follow, gated onany_later_ref_may_trigger_gc. All four arms oflower_call/func_ref.rsuse it.So the codegen half is substantially built, and #7378's scoring says where the gap is: of four bugs found after the RFC, it would catch one — the other three were Layer 3, where
RuntimeHandleScopeexisted but was optional. #7389 is the first structural answer there.Also folded in
gc_type == GC_TYPE_OBJECT"is this a plain object" test is wrong for RegExpnew#7391's silent failure mode — evacuation copies rather than zeroes, sofoo.prototype = new Array(1,2,3)quietly doesn't take effect with no crashbench_array_ops4.5× behind Node with the store guard's siting — not waste — dominating (perf: array element store pays a cross-crate guard call per element (15% of bench_array_ops) #7396)#7392 and #7394 are noted as in-flight elsewhere rather than closed.
Summary by CodeRabbit