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:
2025-12-21 16:47:47 +09:00
parent cda034fe8f
commit 21387f3816
6 changed files with 569 additions and 92 deletions

View File

@ -1,5 +1,36 @@
# Self Current Task — Now (main)
## 2025-12-21Phase 265 P2seq/if_ 実装 - wires/exits 分離)✅
**目的**: 「解決済み配線wires」と「未解決 exitexits」を分離し、Frag 合成の基本パターンを完成させる
**実装完了内容**:
- ✅ Frag に `wires: Vec<EdgeStub>` フィールド追加
- ✅ wires/exits 分離設計確立
- **exits**: target = None のみ(未配線、外へ出る exit
- **wires**: target = Some(...) のみ(配線済み、内部配線)
- ✅ loop_() を wires 対応に更新Break/Continue → wires
- ✅ seq(a, b) 実装完了a.Normal → b.entry が wires、seq の Normal exit は b の Normal
- ✅ if_(header, cond, t, e, join_frag) 実装完了t/e.Normal → join が wires、if の exit は join_frag.exits
- ✅ 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 を混ぜると再配線バグが起きる → 分離して不変条件強化
2. **if_ は join_frag 受け取り**: join: BasicBlockId では「join block」か「join 以降」か曖昧 → join_frag: Frag で明確化
3. **verify は警告のみ**: P2 は wires/exits 分離の証明に集中、Err 化は Phase 266 で MIR 生成時に実施
**重要**: MIR 命令生成はまだしないPhase 266+。Pattern6/7/8 への適用も Phase 266+ に繰り越し。
**次フェーズへの橋渡し**:
- Phase 266: wires を MIR terminator に落とす + NormalizedShadow への Frag 適用
- Phase 267: Pattern6/7/8 を Frag 化 + pattern番号分岐削減
**詳細**: `docs/development/current/main/phases/phase-265/` + `docs/development/current/main/design/edgecfg-fragments.md`
## 2025-12-21Phase 263 P0.2Pattern2 promotion API SSOT
- **Goal**: Pattern2 の “Reject/continue/fallback の揺れ” を **型 + 入口SSOT**で封じ、部分続行(後段で落ちる)を構造で不可能にする

View File

@ -109,7 +109,22 @@ Related:
- **制約**:
- MIR 命令生成なしFrag 層のみ)
- NormalizedShadow 未適用Phase 266 に繰り越し)
- **次**: Phase 265 P2 で seq/if_ 実装
- **(✅ 完了Phase 265 P2: seq/if_ 実装wires/exits 分離)**
- **目的**: 「解決済み配線wires」と「未解決 exitexits」を分離し、Frag 合成の基本パターンを完成
- **完了内容**:
- Frag に `wires: Vec<EdgeStub>` 追加
- wires/exits 分離設計確立exits = target None, wires = target Some
- loop_() を wires 対応に更新
- seq(a, b) 実装a.Normal → wires
- if_(header, cond, t, e, join_frag) 実装t/e.Normal → wires
- verify 強化wires/exits 分離契約、警告のみ)
- 全テスト PASS13個: frag 3 + compose 9 + verify 1
- **設計判断**:
- wires/exits 分離で再配線バグ防止
- if_ は join_frag: Frag で「join 以降」を明確化
- verify は警告のみErr 化は Phase 266
- **次**: Phase 266 で MIR 命令生成 + NormalizedShadow 適用
- **real-app loop regression の横展開VM + LLVM EXE**
- ねらい: 実コード由来ループを 1 本ずつ最小抽出して fixture/smoke で固定する(段階投入)。

View File

@ -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 分離契約追加(警告のみ)
- ✅ 全テスト PASS13個: 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 は未改変(合成能力の証明のみ)。