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
{{ message }}
Repository navigation
gc_root_dominance_check: 96 false-positive violations on #11554's template-coerce join (shadow mode follows the phi past the replacing slow edge) #11604
gc-root-dominance (scripts/gc_root_dominance_check.py over the corpus) reports 96 violations on main, all the same shape. It was seen on the labelled full-tier run of #11551 (job 108725972491), which was rebased on main 73fc6b9. #11551 doesn't touch codegen.
So in template-literal lowering, the result of js_jsvalue_to_string_method_box is not rooted until after a call to js_template_string_coerce_box, which can run a moving minor. That is a dangling-root hazard: the "rooted slot holding a dangling pointer" class described in docs/src/internals/gc-rooting-invariant.md.
Suspected source: #11554 (S2, "GC-leaf fast paths for ... template coercion"), which split js_template_string_coerce_box into an inline string/SSO tag test plus the helper as the cold arm. The helper still collects, and the operand root store now lands after it. gc-root-dominance runs only in the full tier and label-gated workflows, so #11554's own PR run never executed it.
Fix: the root store must dominate the coerce-box call, or the operand must be re-derived after it. Then gc-root-dominance must be back to 0 violations, since the allowlist is empty by policy.
changed the title [-]GC root-dominance: 96 violations on main — js_jsvalue_to_string_method_box result stored after the collecting js_template_string_coerce_box (template literal lowering, likely #11554)[/-][+]gc_root_dominance_check: 96 false-positive violations on #11554's template-coerce join (shadow mode follows the phi past the replacing slow edge)[/+]on Sep 28, 2026
Root-caused in #11606: this is a checker false positive, not a rooting hazard. On the slow arm the phi yields the helper's result (%r17), so %r11 is dead after being passed to js_template_string_coerce_box; the fast arm, which stores %r11, has no collector. The shadow-mode walk followed the phi back to %r11 and counted the slow arm's collector anyway. --statepoints already handled this (#7664). The fix is in the checker, and the codegen is unchanged.
Activity
[-]GC root-dominance: 96 violations on main — js_jsvalue_to_string_method_box result stored after the collecting js_template_string_coerce_box (template literal lowering, likely #11554)[/-][+]gc_root_dominance_check: 96 false-positive violations on #11554's template-coerce join (shadow mode follows the phi past the replacing slow edge)[/+]proggeramlug commentedon Sep 28, 2026
Root-caused in #11606: this is a checker false positive, not a rooting hazard. On the slow arm the phi yields the helper's result (
%r17), so%r11is dead after being passed tojs_template_string_coerce_box; the fast arm, which stores%r11, has no collector. The shadow-mode walk followed the phi back to%r11and counted the slow arm's collector anyway.--statepointsalready handled this (#7664). The fix is in the checker, and the codegen is unchanged.fix(gc-root-dominance): a phi edge that replaces the value is not in …
fix(gc-root-dominance): a phi edge that replaces the value is not in …
fix(gc-root-dominance): a phi edge that replaces the value is not in …