Files
hakorune/docs/development/current/main/phases/phase-29y/20-RC-INSERTION-SSOT.md

51 lines
2.4 KiB
Markdown
Raw Normal View History

# Phase 29y: RC insertion SSOT1箇所で決める
2025-12-27 14:17:18 +09:00
Status: Ready (docs-first, post self-host)
Scope: retain/release/weak_drop の発火点を “分散実装しない” ための SSOT を固定する。
## 0. 目的
- RCイベントretain/release/weak_dropを **1箇所**で挿入し、backend差と hidden root を減らす
- 「SSA last-use = 寿命」にならないよう、drop点を **binding scope / explicit drop / 上書き**に限定する
## 1. 置き場所SSOT
推奨: `emit_frag()` で CFG が確定した後、codegen直前に **1回だけ**走る “RC insertion pass”
- ここなら PHI/loop/early-exit/cleanup を全部見た状態で挿入できる
- lowering 各所に retain/release を散らさないSSOTを壊さない
## 2. 入力と出力(概念)
入力:
- “CFG確定後” の IRFrag / block graph
- 変数スコープ境界binding scopeの情報
出力:
- RCイベントが明示された IR例: `rc.retain`, `rc.release`, `rc.weak_drop` の effect 列)
重要:
- RCイベント列は “見える化” であり、RCの実体カウンタ値/Alive判定は runtimeNyRTに委譲する
## 3. drop点の規則最小
禁止(意味論を壊しやすい):
- SSA last-use を根拠に release するweak_to_strong で観測できて破綻し得る)
許可(意味論に沿う):
- explicit drop: `x = null` の直前に “旧値の release”
- 上書き: `x = <new>` の直前に “旧値の release”
- スコープ終端: binding scope の終端で “そのスコープの binding が保持していた current value の release”
## 4. PHI / loop / early-exit の罠(最低限)
- PHI: “入力値” を間違って release すると破綻する。drop対象は binding の current value と一致する必要がある
- loop: back-edge とスコープ終端の相互作用(継続で生存する値/上書きされる値)を分類する
- early-exitreturn/break/continue: exit edge により “どのスコープが閉じるか” が変わるため、cleanupと統合する必要がある
## 5. 実装に切る時の最小タスク3つ以内
1) insertion pass の入口/出口を固定どのIRを入力にし、何を出力するか
2) drop点の規則を最小実装上書き/explicit drop/スコープ終端)
3) verify不変条件を追加PHI/edge数と drop点が矛盾しないこと