docs: record Phase 265/266 EdgeCFG progress and research note
This commit is contained in:
@ -9,6 +9,7 @@
|
||||
|
||||
- JoinIR の地図(navigation SSOT): `docs/development/current/main/design/joinir-design-map.md`
|
||||
- Join-Explicit CFG Construction(north star): `docs/development/current/main/design/join-explicit-cfg-construction.md`
|
||||
- EdgeCFG Flow Fragments(Structured→CFG lowering SSOT): `docs/development/current/main/design/edgecfg-fragments.md`
|
||||
- Catch / Cleanup / Async(設計メモ): `docs/development/current/main/design/exception-cleanup-async.md`
|
||||
- Loop Canonicalizer(設計 SSOT): `docs/development/current/main/design/loop-canonicalizer.md`
|
||||
- ControlTree / StepTree(構造SSOT): `docs/development/current/main/design/control-tree.md`
|
||||
|
||||
@ -195,11 +195,13 @@ Frag = { entry_block, exits: Map<ExitKind, Vec<EdgeStub>> }
|
||||
|
||||
**次フェーズへの橋渡し**:
|
||||
|
||||
次フェーズ(Phase 266): JoinIR-VM Bridge 改修 + MIR 命令生成
|
||||
- wires を MIR terminator に落とす(EdgeStub.target → set_terminator_jump)
|
||||
- BlockAllocator と Frag 配線の連動
|
||||
- NormalizedShadow への Frag 適用
|
||||
- verify の Err 化(wires/exits 契約違反 → Err)
|
||||
次フェーズ(Phase 266): wires → MIR terminator 生成(test-only PoC)
|
||||
- wires を MIR terminator に落とす SSOT を追加(`emit_wires`)
|
||||
- verify の strict 版を追加(`verify_frag_invariants_strict`、段階導入)
|
||||
|
||||
次フェーズ(Phase 267): JoinIR/NormalizedShadow への適用 + Branch 生成
|
||||
- NormalizedShadow/JoinIR で Frag/wires を実戦投入(層境界を守って段階的に)
|
||||
- Branch の terminator 生成(wires → MIR)を追加
|
||||
|
||||
Phase 267: Pattern6/7/8 への展開
|
||||
- Pattern6 (ScanWithInit) を Frag 化
|
||||
@ -209,3 +211,58 @@ Phase 267: Pattern6/7/8 への展開
|
||||
|
||||
現時点では既存 pattern6/7/8 や merge/EdgeCFG は未改変(合成能力の証明のみ)。
|
||||
|
||||
**Phase 266 P0-P2 完了!(2025-12-21)**
|
||||
|
||||
**実装完了内容**:
|
||||
- ✅ emit.rs 作成(wires → MIR terminator 変換の SSOT)
|
||||
- emit_wires() 実装(from グループ化 + Return の target=None 許可)
|
||||
- unit test 4個(jump/return/unwired/multiple_from_same_block)
|
||||
- ✅ verify_frag_invariants_strict() 追加(段階導入を壊さない)
|
||||
- 既存の verify_frag_invariants() は変更なし(警告のまま)
|
||||
- wires/exits 分離契約を Err 化(Return の target=None は許可)
|
||||
- ✅ mod.rs 更新(emit module エクスポート)
|
||||
- ✅ 全テスト PASS(1392 passed: 既存 1388 + 新規 4個)
|
||||
|
||||
**実装の核心原則**:
|
||||
|
||||
1. **from ごとにグループ化して1本だけ許可**
|
||||
- BTreeMap で from ごとにグループ化
|
||||
- 1 block = 1 terminator 制約を厳格に強制
|
||||
|
||||
2. **Return は target=None を許可**
|
||||
- Return は target が意味を持たない(emit_wires で無視される)
|
||||
- Fail-Fast 対象は Normal/Break/Continue/Unwind の target=None のみ
|
||||
|
||||
3. **verify_frag_invariants_strict() 別名で用意**
|
||||
- 既存の verify_frag_invariants() は警告のまま維持
|
||||
- 新規 verify_frag_invariants_strict() で Err 化
|
||||
- PoC/emit 側だけ strict を使用(段階導入を壊さない)
|
||||
|
||||
4. **Phase 260 terminator 語彙ルールを厳守**
|
||||
- Jump: set_jump_with_edge_args() を使用
|
||||
- Return: set_terminator() + set_return_env() を使用
|
||||
|
||||
**設計判断の記録**:
|
||||
|
||||
1. **なぜ from グループ化が必要か?**
|
||||
- 問題: 同じ block に複数 terminator を設定すると上書きになる
|
||||
- 決定: from ごとにグループ化し、1本だけ許可(Fail-Fast)
|
||||
- 理由: 1 block = 1 terminator は MIR の不変条件
|
||||
|
||||
2. **なぜ Return は target=None を許可するか?**
|
||||
- 問題: Return は呼び出し元に戻るので、target が意味を持たない
|
||||
- 決定: Return のみ target=None を許可
|
||||
- 理由: Normal/Break/Continue/Unwind は明確な target が必要
|
||||
|
||||
3. **なぜ verify_frag_invariants_strict() を別名にしたか?**
|
||||
- 問題: 既存の verify_frag_invariants() を Err 化すると、既存コードが壊れる
|
||||
- 決定: 新規に strict 版を追加し、段階導入
|
||||
- 理由: Phase 267+ で既存コードを段階的に strict へ移行
|
||||
|
||||
**次フェーズへの橋渡し**:
|
||||
|
||||
Phase 267: JoinIR Pattern への適用
|
||||
- NormalizedShadow への Frag 適用
|
||||
- Pattern6/7/8 を Frag 化
|
||||
- Branch 生成 + pattern番号分岐削減
|
||||
- fixture + smoke test
|
||||
|
||||
@ -5,6 +5,7 @@ Scope: JoinIR→MIR の「暗黙 ABI」を消し、Join を第一級に扱う CF
|
||||
Related:
|
||||
- Navigation SSOT: `docs/development/current/main/design/joinir-design-map.md`
|
||||
- Investigation (Phase 256): `docs/development/current/main/investigations/phase-256-joinir-contract-questions.md`
|
||||
- Structured→CFG lowering SSOT(Frag/ExitKind): `docs/development/current/main/design/edgecfg-fragments.md`
|
||||
- Decisions: `docs/development/current/main/20-Decisions.md`
|
||||
- Future features (catch/cleanup, cleanup/defer, async): `docs/development/current/main/design/exception-cleanup-async.md`
|
||||
|
||||
@ -122,3 +123,15 @@ Strangler 期間は “読む側だけ寄せる” と取りこぼしが起き
|
||||
- `set_terminator(...)` のような入口に寄せ、successors/preds の同期漏れを構造で潰す
|
||||
- **verify(Fail-Fast)**
|
||||
- terminator から計算した successors と、キャッシュ `block.successors` の一致をチェックして “同期漏れ” を即死させる
|
||||
|
||||
## pattern(番号)の位置づけ(収束のさせ方)
|
||||
|
||||
重要: “pattern番号で分岐する” こと自体は長期的には消したい(臭い)。ただし **IR上の形(terminator/exit種別)で分岐する**のは普通で、むしろ正しい。
|
||||
|
||||
収束方針:
|
||||
|
||||
- EdgeCFG の基盤が固まった後、Structured→CFG lowering の中心概念を **pattern番号**ではなく **ExitKind と Frag(fragment)**に移す
|
||||
- pattern は “Extractor(形の認識)/ Plan(最小要件の抽出)” までに縮退し、merge/配線層へ逆流させない
|
||||
- 最終的に残る実装は `seq/if/loop/cleanup` 等の **合成則**と、`join(block params)` だけになる
|
||||
|
||||
設計SSOT: `docs/development/current/main/design/edgecfg-fragments.md`
|
||||
|
||||
Reference in New Issue
Block a user