From e1e828b2000f0cb4c30b4b4480348160d3b491e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Wed, 5 Aug 2026 17:20:54 +0200 Subject: [PATCH 1/2] fix(ci): the dependency-scale dominance corpus was vacuous too #7452 fixed the curated corpus and missed this one. Same cause: the checker anchors on @js_shadow_slot_bind call sites, statepoints became the default root lowering in #7370 and express roots as gc.statepoint relocation bundles instead, so the corpus carried 81 modules with ZERO of the checker's subject. before: 81 modules, 0 bind call sites after: 81 modules, 7719 bind call sites CI's own floors say what the corpus is supposed to look like -- the step comment reads '81 modules, ~12900 functions, ~7700 root stores' and sets --min-binds 4000. The fixed corpus measures 81 / 12899 / 7719, i.e. the floors were written against the shadow-stack lowering and this restores exactly the state they were set from. Both gated arms exit 0 with 40/40 seeded violations caught. This is the corpus #7280 created BECAUSE the curated one reads zero while twenty lines of stock zod fault, so leaving it measuring nothing defeats the reason it exists. --- scripts/gc_root_dominance_dep_corpus.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/gc_root_dominance_dep_corpus.sh b/scripts/gc_root_dominance_dep_corpus.sh index 315610121f..0c719872e4 100755 --- a/scripts/gc_root_dominance_dep_corpus.sh +++ b/scripts/gc_root_dominance_dep_corpus.sh @@ -82,7 +82,16 @@ trap 'rm -rf "$scratch"' EXIT # (it is off by default since #7161, so without it the corpus cannot express a # back-edge collection at all). PERRY_INLINE_SHADOW_SLOT=0 makes every root # store the @js_shadow_slot_bind call form the checker anchors on. -if ! env PERRY_GC_MOVING_LOOP_POLLS=1 \ +# PERRY_RS4GC=0 selects the SHADOW-STACK root lowering, for the same reason as +# the sibling corpus (#7452): statepoints became the default in #7370 and +# express roots as `gc.statepoint` relocation bundles rather than +# `@js_shadow_slot_bind` calls, so without this the corpus contains ZERO of the +# checker's subject. #7452 fixed the curated corpus and missed this one -- it +# was still emitting 81 modules with 0 bind call sites, i.e. a dependency-scale +# gate measuring nothing, which is exactly the failure #7280 created it to +# avoid. +if ! env PERRY_RS4GC=0 \ + PERRY_GC_MOVING_LOOP_POLLS=1 \ PERRY_INLINE_SHADOW_SLOT=0 \ PERRY_NO_AUTO_OPTIMIZE=1 \ "$PERRY_BIN" compile "$ENTRY" -o "$scratch/dep-corpus" --trace llvm \ From 7efca3983d40329e28ee0f139822445d8a7682b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Wed, 5 Aug 2026 17:21:09 +0200 Subject: [PATCH 2/2] docs: changelog fragment for #7460 --- changelog.d/7460-dep-corpus-vacuous.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7460-dep-corpus-vacuous.md diff --git a/changelog.d/7460-dep-corpus-vacuous.md b/changelog.d/7460-dep-corpus-vacuous.md new file mode 100644 index 0000000000..9fee32a8a9 --- /dev/null +++ b/changelog.d/7460-dep-corpus-vacuous.md @@ -0,0 +1 @@ +- **The dependency-scale GC root-dominance corpus was measuring nothing, and now isn't.** #7452 restored the curated corpus and missed its sibling: the checker anchors on `@js_shadow_slot_bind` call sites, statepoints became the default root lowering in #7370 and express roots as `gc.statepoint` relocation bundles, so the dependency corpus emitted 81 modules with **zero** of the checker's subject. Selecting the shadow-stack lowering restores it to 7719 root stores across 12899 functions — matching CI's own documented floors ("81 modules, ~12900 functions, ~7700 root stores"), which were written against that lowering. Both gated arms exit 0 with 40/40 seeded violations caught. This is the corpus #7280 created *because* the curated one reads zero while twenty lines of stock `zod` fault, so leaving it vacuous defeated the reason it exists. (#7460)