You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The 2026-07-31/08-01 stackmap campaign (#7108, branch exp/stackmap-viability, full write-up in docs/statepoint-gc-experiment.md) ends with every road to native-root file-size parity converging on one experiment that has not been run: RewriteStatepointsForGC over managed-pointer SSA.
Why this is the only remaining road, now demonstrated rather than argued:
The explicit statepoint bridge is correct and speed-competitive (quiet-host geo −1.1% vs shadow, RSS flat) but its metadata measures 3.83 MB against 150 KB of text recovered on the real test-drizzle-pg app (~25×) after a −59% reduction campaign (audited call effects, noreturn elision, safepoint contract). The remaining records are dominated by base/derived pairs and per-safepoint spill slots that explicit emission cannot avoid.
The cheap alternative was built and killed: a compact per-function metadata mode measured 10–13× smaller and was deleted as a proven negative result (bd066d62b, deleted at a95f59e96). A ten-line churn loop corrupts deterministically under moving minors, bit-identically even with the walker's visits disabled — the mutator reads from-space through stale heap-derived values in optimized SSA. The same module carries 79 gc.relocates under the statepoint backend. Design law: root metadata without relocation semantics is unsound under an optimizing compiler. Per-call plain maps only kept the window small enough for probes to pass (that mode is also deleted — its Register R#N locations are unrecoverable by construction).
What the experiment is (#7108 costed it as option 1, "weeks"):
Tag functions gc "statepoint-example", let opt -passes=rewrite-statepoints-for-gc insert statepoints, results, relocates, and downstream-use rewrites — deleting the hand-emission and its conservative CFG-union liveness.
Acceptance: the existing gate stack (8 probes × forced evacuation × verify-walker vs pinned Node, statepoint-report deltas, quiet-host matrix) plus the real-app criterion that defines success: __llvm_stackmaps + __text delta vs shadow ≤ 0 on test-drizzle-pg — i.e., LLVM-computed liveness (dead-root pruning is free in RS4GC) must close what audited elision provably cannot.
Interaction: repsel promotion (#7034 line) independently shrinks the recorded set — every value proven non-pointer deletes its records in either backend. The two compose; neither replaces the other.
The 2026-07-31/08-01 stackmap campaign (#7108, branch
exp/stackmap-viability, full write-up indocs/statepoint-gc-experiment.md) ends with every road to native-root file-size parity converging on one experiment that has not been run:RewriteStatepointsForGCover managed-pointer SSA.Why this is the only remaining road, now demonstrated rather than argued:
test-drizzle-pgapp (~25×) after a −59% reduction campaign (audited call effects, noreturn elision, safepoint contract). The remaining records are dominated by base/derived pairs and per-safepoint spill slots that explicit emission cannot avoid.bd066d62b, deleted ata95f59e96). A ten-line churn loop corrupts deterministically under moving minors, bit-identically even with the walker's visits disabled — the mutator reads from-space through stale heap-derived values in optimized SSA. The same module carries 79gc.relocates under the statepoint backend. Design law: root metadata without relocation semantics is unsound under an optimizing compiler. Per-call plain maps only kept the window small enough for probes to pass (that mode is also deleted — itsRegister R#Nlocations are unrecoverable by construction).What the experiment is (#7108 costed it as option 1, "weeks"):
ptr addrspace(1)in SSA — the whole-NaN-box carrier is already proven (Stack maps vs the codegen shadow stack: viability experiment (Q1 passes; 0.44 MB text saved for 4.5-16.6 MB metadata) #7108 Q1:bitcast double → i64 → inttoptr, folds to zero instructions, relocated end-to-end at runtime).gc "statepoint-example", letopt -passes=rewrite-statepoints-for-gcinsert statepoints, results, relocates, and downstream-use rewrites — deleting the hand-emission and its conservative CFG-union liveness.opt(Homebrew LLVM; Xcode ships none). Verified working end-to-end in Stack maps vs the codegen shadow stack: viability experiment (Q1 passes; 0.44 MB text saved for 4.5-16.6 MB metadata) #7108. Gate the mode onoptpresence; this is the distribution decision that issue named, scoped here to research.Acceptance: the existing gate stack (8 probes × forced evacuation × verify-walker vs pinned Node, statepoint-report deltas, quiet-host matrix) plus the real-app criterion that defines success:
__llvm_stackmaps+__textdelta vs shadow ≤ 0 ontest-drizzle-pg— i.e., LLVM-computed liveness (dead-root pruning is free in RS4GC) must close what audited elision provably cannot.Interaction: repsel promotion (#7034 line) independently shrinks the recorded set — every value proven non-pointer deletes its records in either backend. The two compose; neither replaces the other.