Commit d79f6ad
The roadmap's non-leaf thin-forwarder entry described the lever as the next
buildable piece. Implementing it this session revealed its soundness is
non-local: pruning a forwarder's save-set is only correct if every callee
preserves r4-r8, which the optimized path does not — `alloc_i32_scratch` hands
out the callee-saved [R4..R8] pool with no saving push, so even the
silicon-validated `control_step` clobbers r4/r6/r8 (masked because it is
top-level / callers fall back to the pushing direct selector). That is a systemic
base-selector ABI bug (#490), latent in the self-contained optimized path (gale
ships `--relocatable`, which uses the register-preserving direct selector), that
BLOCKS this lever's flip.
Updates the trace so the lever's blocked-by relationship is recorded (not a gate
surprise): the lever stays unmerged on `wip/nonleaf-prologue-blocked-on-leaf-clobber`
(its differential is the #490 repro) until the systemic fix lands. Docs-only,
frozen-safe; rivet validate clean (0 non-xref errors).
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 397c6bf commit d79f6ad
1 file changed
Lines changed: 21 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
575 | 575 | | |
576 | 576 | | |
577 | 577 | | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
578 | 599 | | |
579 | 600 | | |
580 | 601 | | |
| |||
0 commit comments