feat(edgecfg): Phase 265 P2 - seq/if_ 実装(wires/exits 分離)
## 目的 「解決済み配線(wires)」と「未解決 exit(exits)」を分離し、 Frag 合成の基本パターンを完成させる。 ## 実装内容 ### 1. Frag 構造体の変更 - `wires: Vec<EdgeStub>` フィールド追加 - 不変条件: - exits: target = None のみ(未配線、外へ出る exit) - wires: target = Some(...) のみ(配線済み、内部配線) ### 2. loop_() の wires 対応 - Break/Continue を exits から wires に移動 - P1 テスト 3個を wires 検証に更新 ### 3. seq(a, b) 実装 - a.Normal → b.entry を wires に追加(内部配線) - seq の exits[Normal] は b の Normal のみ - 新規テスト 2個追加 ### 4. if_(header, cond, t, e, join_frag) 実装 - シグネチャ変更: join: BasicBlockId → join_frag: Frag - t/e.Normal → join_frag.entry を wires に追加 - if の exits は join_frag.exits - 新規テスト 2個追加 ### 5. verify_frag_invariants() 強化 - wires/exits 分離契約の検証追加(警告のみ) - Err 化は Phase 266 で実施 ## テスト結果 - edgecfg::api: 13/13 PASS(frag 3 + compose 9 + verify 1) - 全 lib テスト: 1388/1388 PASS(退行なし) ## 核心的な設計判断 1. **wires/exits 分離**: - 問題: 解決済み配線と未解決 exit を混ぜると再配線バグ - 解決: 分離して不変条件を強化 - 効果: Phase 266 で wires を MIR terminator に落とすだけ 2. **if_ は join_frag 受け取り**: - 問題: join: BasicBlockId では「join block」か「join 以降」か曖昧 - 解決: join_frag: Frag で「join 以降」を明確化 - 効果: PHI 生成の柔軟性確保 3. **verify は警告のみ**: - P2 の役割: wires/exits 分離の証明に集中 - Phase 266 で MIR 生成時に厳格化 ## 次フェーズへの橋渡し - Phase 266: wires を MIR terminator に落とす - Phase 267: Pattern6/7/8 を Frag 化 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -164,6 +164,48 @@ Frag = { entry_block, exits: Map<ExitKind, Vec<EdgeStub>> }
|
||||
- ❌ MIR 命令生成(Phase 266+)
|
||||
- ❌ NormalizedShadow/JoinIR層への適用(Phase 266+、JoinIR-VM Bridge 改修後)
|
||||
|
||||
次フェーズ(Phase 265 P2)で seq/if_ 実装 + pattern番号分岐削減へ。
|
||||
現時点では既存 pattern6/7/8 や merge/EdgeCFG は未改変(配線能力の証明のみ)。
|
||||
**Phase 265 P2 完了!(2025-12-21)**
|
||||
|
||||
**実装完了内容**:
|
||||
- ✅ Frag に `wires: Vec<EdgeStub>` フィールド追加
|
||||
- ✅ wires/exits 分離設計確立
|
||||
- **exits**: target = None のみ(未配線、外へ出る exit)
|
||||
- **wires**: target = Some(...) のみ(配線済み、内部配線)
|
||||
- ✅ loop_() を wires 対応に更新(Break/Continue → wires)
|
||||
- ✅ seq(a, b) 実装完了(a.Normal → wires)
|
||||
- ✅ if_(header, cond, t, e, join_frag) 実装完了(t/e.Normal → wires)
|
||||
- ✅ verify_frag_invariants() に wires/exits 分離契約追加(警告のみ)
|
||||
- ✅ 全テスト PASS(13個: frag 3個 + compose 9個 + verify 1個)
|
||||
|
||||
**設計判断の記録**:
|
||||
|
||||
1. **なぜ wires/exits を分離するか?**
|
||||
- 問題: 解決済み配線と未解決 exit を混ぜると、次の合成で内部配線が再度配線対象になる
|
||||
- 決定: wires/exits を分離し、不変条件を強化
|
||||
- 理由: 合成の意味が素直になり、Phase 266 で wires を MIR terminator に落とすだけ
|
||||
|
||||
2. **なぜ if_ は join_frag を受け取るか?**
|
||||
- 問題: join: BasicBlockId だと、if の Normal exit が「join block」か「join 以降」か曖昧
|
||||
- 決定: join_frag: Frag を受け取る
|
||||
- 理由: if の Normal exit = join 以降(join_frag.exits)が明確、PHI 生成の柔軟性確保
|
||||
|
||||
3. **なぜ verify は警告のみか?**
|
||||
- P2 の役割: wires/exits 分離の証明に集中(MIR 命令生成なし)
|
||||
- Phase 266 で MIR 生成時に verify を厳格化(target 違反 → Err)
|
||||
|
||||
**次フェーズへの橋渡し**:
|
||||
|
||||
次フェーズ(Phase 266): JoinIR-VM Bridge 改修 + MIR 命令生成
|
||||
- wires を MIR terminator に落とす(EdgeStub.target → set_terminator_jump)
|
||||
- BlockAllocator と Frag 配線の連動
|
||||
- NormalizedShadow への Frag 適用
|
||||
- verify の Err 化(wires/exits 契約違反 → Err)
|
||||
|
||||
Phase 267: Pattern6/7/8 への展開
|
||||
- Pattern6 (ScanWithInit) を Frag 化
|
||||
- Pattern7 (SplitScan) を Frag 化
|
||||
- Pattern8 (BoolPredicateScan) を Frag 化
|
||||
- 再利用性の確認(pattern番号分岐削減)
|
||||
|
||||
現時点では既存 pattern6/7/8 や merge/EdgeCFG は未改変(合成能力の証明のみ)。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user