feat(joinir): Phase 286 P3.1 - Pattern2 Plan line 完走(after_bb PHI)

Pattern2(Loop with Break)を Plan/Frag SSOT へ移行。

主な変更:
- Pattern2BreakPlan 追加(DomainPlan variant)
- extract_pattern2_plan() 実装(PoC サブセット厳守)
- normalize_pattern2_break() 実装(6-block CFG, 3 PHI)
- after_bb PHI が本質: carrier_out = PHI(header: carrier_current, break_then: carrier_break)
- router に Pattern2 追加(Pattern1 より前、より具体的)

テスト:
- Fixture B (break without update): PASS (出力 11)
- quick smoke: 154/154 PASS

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-26 05:56:30 +09:00
parent f76fb6cd3e
commit b235a5b6db
8 changed files with 658 additions and 12 deletions

View File

@ -1,6 +1,6 @@
# Phase 286: JoinIR Line AbsorptionJoinIR→CorePlan/Frag 収束)
Status: In Progress (P0, P1, P2, P2.1, P2.2, P2.3, P2.4, P2.4.1, P2.6, P2.7 COMPLETE, P3, 286C-2 COMPLETE)
Status: In Progress (P0, P1, P2, P2.1, P2.2, P2.3, P2.4, P2.4.1, P2.6, P2.7, P3, 286C-2 COMPLETE, **P3.1 IN PROGRESS**)
## Goal
@ -322,6 +322,64 @@ Phase 286 では JoinIR line を “第2の lowerer” として放置せず、*
- Build: cargo build --release PASS
- Regression: quick smoke 0 failed
### P3.1 (Pattern2 Plan化 - Loop with Break) 🚧 IN PROGRESS (2025-12-26)
**背景**:
- Pattern2 (Loop with Break) は P2 で別タスク化されたbreak経路の値再接続が複雑
- 詳細: [pattern2-deferred.md](./pattern2-deferred.md)
**本質的課題: after_bb PHI**:
- break経路では carrier 更新が実行されない場合がある
- after_bb に PHI 必要header経路 vs break経路の値選択
```
carrier_out = PHI(header: carrier_current, break_then: carrier_break)
```
**CFG構造**6ブロック:
```
preheader → header(PHI: i_current, carrier_current)
body(break_cond check)
┌────┴────┐
break_then step
(optional ↓
update) header (back-edge)
after_bb(PHI: carrier_out)
header (natural exit when !cond_loop)
```
**実装ステップ**:
1. ✅ Step 0: docs-first - README.md P3.1節追加、pattern2-deferred.md更新
2. Step 1: Fixture B作成 + smoke script追加
3. Step 2: DomainPlan::Pattern2Break + extract_pattern2_plan() 追加
4. Step 3: normalize_pattern2_break() 実装after_bb PHI
5. Step 4: router に Pattern2 追加
6. Step 5: 検証integration 2本 + quick 154/154
**PoC サブセット厳守**:
以下は必ず `Ok(None)` で legacy へ fallbackFail-Fast 回帰防止):
- loop_increment が取れない(構造が複雑)
- break_cond が単一 if でない(ネスト、複数条件)
- break_then が複数文で carrier 更新が特定できない
- carrier が複数PoC は single carrier のみ)
- body 側の carrier 更新が特定できない
**成果物** (予定):
- `apps/tests/phase286_pattern2_break_no_update_min.hako` (新規: break without update fixture)
- `tools/smokes/v2/profiles/integration/apps/phase286_pattern2_break_no_update_vm.sh` (新規)
- `src/mir/builder/control_flow/plan/mod.rs` (変更: Pattern2BreakPlan + DomainPlan variant)
- `src/mir/builder/control_flow/joinir/patterns/extractors/pattern2.rs` (変更: extract_pattern2_plan)
- `src/mir/builder/control_flow/plan/normalizer.rs` (変更: normalize_pattern2_break)
- `src/mir/builder/control_flow/joinir/patterns/router.rs` (変更: Pattern2 Plan line routing)
**成功基準**:
- Fixture A (break with update): `phase286_pattern2_frag_poc` PASS (出力 42)
- Fixture B (break without update): `phase286_pattern2_break_no_update_vm` PASS (出力 11)
- Regression: quick smoke 154 PASS, 0 FAILED
## AcceptanceP0
- 2本の lowering が "設計として" どこで 1 本に収束するかが明文化されている

View File

@ -1,25 +1,26 @@
# Pattern2 (Loop with Break) - Deferred to Future Phase
# Pattern2 (Loop with Break) - Phase 286 P3 で再開
**Date**: 2025-12-26
**Status**: Investigation complete, implementation deferred
**Status**: **IN PROGRESS** (Phase 286 P3)
## Summary
Pattern2 requires complex value reconnection at the exit point:
- break経路ではcarrier更新が実行されない
- after_bbPHI必要header経路 vs break経路の値選択
- **after_bbPHI 必要**header経路 vs break経路の値選択
- compose::loop_との統合、ExitKind::Break配線が必要
Pattern4 (Loop with Continue) PoC成功後の別タスクとして実装予定。
## 実装方針Phase 286 P3
## 再開条件
**after_bb PHI が本質**:
```
carrier_out = PHI(header: carrier_current, break_then: carrier_break)
```
以下が揃った時に Pattern2 Plan化を再開Phase番号は到達点に応じて後で確定
1. after_bb PHI 生成ロジックの設計完了
2. compose::loop_ との統合方針決定
3. ExitKind::Break wiring の実装
- break 前に update あり → carrier_break = 計算結果
- break 前に update なし → carrier_break = carrier_currentそのまま
→ 条件が揃ったら Phase 286 の次の空きスロットにエスカレート
**PoC サブセット厳守**: 取れない形は `Ok(None)` で legacy へFail-Fast 回帰防止)
## Reference