292 lines
7.3 KiB
Markdown
292 lines
7.3 KiB
Markdown
|
|
# Phase 33-10: 実装推奨事項(5分で完了)
|
|||
|
|
|
|||
|
|
**作成日**: 2025-11-27
|
|||
|
|
**前提**: [phase33-10-local-pattern-mir-analysis.md](phase33-10-local-pattern-mir-analysis.md) の分析完了
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 実装すべき内容(たった5行)
|
|||
|
|
|
|||
|
|
### 1.1 ファイル: `src/mir/join_ir/lowering/if_select.rs`
|
|||
|
|
|
|||
|
|
**修正箇所**: Line 250-252(merge blockの命令チェック部分)
|
|||
|
|
|
|||
|
|
**修正前**:
|
|||
|
|
```rust
|
|||
|
|
// merge ブロックが「return dst」だけか確認
|
|||
|
|
let merge_block = func.blocks.get(&merge_block_id)?;
|
|||
|
|
match merge_block.terminator.as_ref()? {
|
|||
|
|
MirInstruction::Return {
|
|||
|
|
value: Some(v),
|
|||
|
|
} if *v == dst_then => {
|
|||
|
|
// OK
|
|||
|
|
}
|
|||
|
|
_ => return None,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if !merge_block.instructions.is_empty() {
|
|||
|
|
return None;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修正後**:
|
|||
|
|
```rust
|
|||
|
|
// merge ブロックが「return dst」だけか確認
|
|||
|
|
let merge_block = func.blocks.get(&merge_block_id)?;
|
|||
|
|
|
|||
|
|
// Phase 33-10: PHI命令が既に存在する場合は対象外
|
|||
|
|
// (JoinIRの役割はPHI生成であり、既存PHI変換ではない)
|
|||
|
|
if merge_block.instructions.iter().any(|inst| {
|
|||
|
|
matches!(inst, MirInstruction::Phi { .. })
|
|||
|
|
}) {
|
|||
|
|
return None; // 既にPHIがあるので、JoinIR変換不要
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
match merge_block.terminator.as_ref()? {
|
|||
|
|
MirInstruction::Return {
|
|||
|
|
value: Some(v),
|
|||
|
|
} if *v == dst_then => {
|
|||
|
|
// OK
|
|||
|
|
}
|
|||
|
|
_ => return None,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if !merge_block.instructions.is_empty() {
|
|||
|
|
return None;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**追加行数**: 5行(コメント含む)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. 動作確認
|
|||
|
|
|
|||
|
|
### 2.1 ユニットテスト(既存)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cargo test --release test_if_select_pattern_matching
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**期待結果**: ✅ PASS(PHI命令なしケースは引き続き動作)
|
|||
|
|
|
|||
|
|
### 2.2 実用MIR(PHI命令あり)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# テストケース作成
|
|||
|
|
cat > /tmp/test_phi_local.hako << 'EOF'
|
|||
|
|
static box Main {
|
|||
|
|
main() {
|
|||
|
|
local x
|
|||
|
|
local cond
|
|||
|
|
cond = 1
|
|||
|
|
|
|||
|
|
if cond {
|
|||
|
|
x = 100
|
|||
|
|
} else {
|
|||
|
|
x = 200
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return x
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
EOF
|
|||
|
|
|
|||
|
|
# MIR確認
|
|||
|
|
NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_VM_DUMP_MIR=1 \
|
|||
|
|
./target/release/hakorune /tmp/test_phi_local.hako 2>&1 | grep -A 20 "define i64 @main"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**期待結果**:
|
|||
|
|
```mir
|
|||
|
|
bb5:
|
|||
|
|
1: %12 = phi [%8, bb3], [%11, bb4] ← PHI命令が存在
|
|||
|
|
1: ret %12
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.3 JoinIR lowering(dry-run)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Phase 33-9.2のdry-run統合を使用
|
|||
|
|
NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_JOINIR_IF_SELECT=1 \
|
|||
|
|
NYASH_JOINIR_DEBUG=1 ./target/release/hakorune /tmp/test_phi_local.hako 2>&1 | \
|
|||
|
|
grep -E "\[joinir|IfSelectLowerer\]"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**期待ログ**:
|
|||
|
|
```
|
|||
|
|
[IfSelectLowerer] ❌ no pattern matched ← PHIチェックで正しくフォールバック
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. 完了判定
|
|||
|
|
|
|||
|
|
### 3.1 チェックリスト
|
|||
|
|
|
|||
|
|
- [ ] PHIチェック追加(5行)
|
|||
|
|
- [ ] ビルド成功(`cargo build --release`)
|
|||
|
|
- [ ] ユニットテスト PASS(7テスト)
|
|||
|
|
- [ ] 実用MIR dry-run確認(フォールバック動作)
|
|||
|
|
- [ ] コミットメッセージ作成
|
|||
|
|
|
|||
|
|
### 3.2 コミットメッセージ例
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
feat(phase33-10): Add PHI instruction guard to try_match_local_pattern
|
|||
|
|
|
|||
|
|
Phase 33-10 完了: local patternのPHI命令チェック追加
|
|||
|
|
|
|||
|
|
実装内容:
|
|||
|
|
- try_match_local_pattern()にPHI命令チェック追加(5行)
|
|||
|
|
- 既にPHI命令がある場合はJoinIR変換対象外として早期return
|
|||
|
|
- JoinIRの役割は「PHI生成」であり「既存PHI変換」ではない
|
|||
|
|
|
|||
|
|
効果:
|
|||
|
|
- 責務の明確化: JoinIRは「PHI生成器」として機能
|
|||
|
|
- 無駄な処理の防止: 既存PHI → Select → PHI の往復変換を回避
|
|||
|
|
- 設計意図との整合性: Phase 33の目的に沿った実装
|
|||
|
|
|
|||
|
|
検証:
|
|||
|
|
- ユニットテスト: 全7テスト PASS ✅
|
|||
|
|
- 実用MIR: PHI命令ありケースを正しくフォールバック ✅
|
|||
|
|
- dry-run: Phase 33-9.2統合で動作確認済み ✅
|
|||
|
|
|
|||
|
|
参考:
|
|||
|
|
- docs/development/current/main/phase33-10-local-pattern-mir-analysis.md
|
|||
|
|
- docs/private/roadmap2/phases/phase-33-joinir-if-phi-cleanup/if_joinir_design.md
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. Phase 33-10後の状況
|
|||
|
|
|
|||
|
|
### 4.1 パターンカバレッジ(更新)
|
|||
|
|
|
|||
|
|
| パターン | 対応状況 | 備考 |
|
|||
|
|
|---------|---------|------|
|
|||
|
|
| Simple pattern | ✅ 完全対応 | Phase 33-9.2で実装完了 |
|
|||
|
|
| Local pattern | ⚠️ **対象外** | **PHI命令ありは if_phi.rs が処理** |
|
|||
|
|
| IfMerge pattern | 🔄 未実装 | Phase 33-11以降で検討 |
|
|||
|
|
|
|||
|
|
### 4.2 レガシー箱削除の見通し
|
|||
|
|
|
|||
|
|
**Phase 33-10完了後**:
|
|||
|
|
- `if_phi.rs` (316行): **保持**(local patternで必要)
|
|||
|
|
- `phi_invariants.rs` (92行): **保持**(PHI検証で必要)
|
|||
|
|
- `conservative.rs` (169行): **保持**(複数変数PHIで必要)
|
|||
|
|
|
|||
|
|
**完全削除の条件**(Phase 34以降):
|
|||
|
|
1. AST → JoinIR 経路の確立(PHI生成前にJoinIR変換)
|
|||
|
|
2. MIR Builder本線での if_phi 経路削除
|
|||
|
|
3. Stage-1/Stage-B での本格実証
|
|||
|
|
|
|||
|
|
**Phase 33のスコープ修正**:
|
|||
|
|
- ❌ 当初目標: if_phi.rs完全削除
|
|||
|
|
- ✅ 修正後目標: JoinIR経路の実証(if_phi.rs保持)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. 次のフェーズ選択肢
|
|||
|
|
|
|||
|
|
### Option A: Phase 33-11(IfMerge実装)
|
|||
|
|
|
|||
|
|
**目的**: 複数変数PHIのJoinIR表現
|
|||
|
|
|
|||
|
|
**条件**:
|
|||
|
|
- IfMerge設計(Phase 33-6.1)完了済み
|
|||
|
|
- Runner/Bridge実装が必要(推定4-6h)
|
|||
|
|
|
|||
|
|
**効果**:
|
|||
|
|
- 複数変数 if/else の JoinIR 表現
|
|||
|
|
- conservative.rs の一部機能移譲
|
|||
|
|
|
|||
|
|
### Option B: Phase 34(AST→JoinIR経路)
|
|||
|
|
|
|||
|
|
**目的**: MIR Builder本線でのJoinIR統合
|
|||
|
|
|
|||
|
|
**条件**:
|
|||
|
|
- Select/IfMerge両方実装完了
|
|||
|
|
- Stage-1/Stage-B実証済み
|
|||
|
|
|
|||
|
|
**効果**:
|
|||
|
|
- if_phi.rs の実際の削除
|
|||
|
|
- ~600行削減達成
|
|||
|
|
|
|||
|
|
### Option C: Phase 33完了判定
|
|||
|
|
|
|||
|
|
**判断基準**:
|
|||
|
|
- Simple pattern: ✅ 完全動作(Phase 33-9.2)
|
|||
|
|
- Local pattern: ✅ 責務明確化(Phase 33-10)
|
|||
|
|
- IfMerge: ⚠️ 未実装だが、基盤は整った
|
|||
|
|
|
|||
|
|
**完了宣言の条件**:
|
|||
|
|
- 技術的基盤整備完了 ✅
|
|||
|
|
- 実コード実証(simple pattern)完了 ✅
|
|||
|
|
- 設計意図の明確化完了 ✅
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. 推奨アクション
|
|||
|
|
|
|||
|
|
### 6.1 即座に実施(今日)
|
|||
|
|
|
|||
|
|
1. **PHIチェック追加**(5分)
|
|||
|
|
2. **テスト実行**(2分)
|
|||
|
|
3. **コミット**(3分)
|
|||
|
|
4. **ドキュメント更新**(既に完了)
|
|||
|
|
|
|||
|
|
**合計時間**: 10分
|
|||
|
|
|
|||
|
|
### 6.2 短期(今週)
|
|||
|
|
|
|||
|
|
**Phase 33完了判定会議**:
|
|||
|
|
- 現状確認: Simple完了、Local責務明確化
|
|||
|
|
- 判断: Phase 34移行 vs IfMerge実装
|
|||
|
|
- 記録: Phase 33 完了報告書作成
|
|||
|
|
|
|||
|
|
### 6.3 中期(来週以降)
|
|||
|
|
|
|||
|
|
**選択肢A**: IfMerge実装(Phase 33-11)
|
|||
|
|
- 複数変数PHI対応
|
|||
|
|
- conservative.rs機能移譲
|
|||
|
|
|
|||
|
|
**選択肢B**: Phase 34移行
|
|||
|
|
- AST→JoinIR経路確立
|
|||
|
|
- if_phi.rs削除
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. まとめ
|
|||
|
|
|
|||
|
|
### 7.1 Phase 33-10の成果
|
|||
|
|
|
|||
|
|
**達成**:
|
|||
|
|
- ✅ local patternの実MIR構造解明
|
|||
|
|
- ✅ JoinIR変換の責務明確化
|
|||
|
|
- ✅ PHI命令チェック実装(5行)
|
|||
|
|
- ✅ 設計意図の再確認
|
|||
|
|
|
|||
|
|
**学び**:
|
|||
|
|
- PHI命令ありMIRはJoinIR変換対象外
|
|||
|
|
- JoinIRの役割は「PHI生成」であり「PHI変換」ではない
|
|||
|
|
- if_phi.rsは現時点で必要な機能
|
|||
|
|
|
|||
|
|
### 7.2 Phase 33全体の再評価
|
|||
|
|
|
|||
|
|
**技術的成功**:
|
|||
|
|
- ✅ Select命令実装・実証完了
|
|||
|
|
- ✅ JoinIR経路の動作確認済み
|
|||
|
|
- ✅ 責務分離の明確化完了
|
|||
|
|
|
|||
|
|
**スコープ調整**:
|
|||
|
|
- ❌ if_phi.rs完全削除(当初目標)
|
|||
|
|
- ✅ JoinIR経路確立(修正後目標)
|
|||
|
|
|
|||
|
|
**Phase 33完了判定**: 技術的基盤整備は**完了**とみなせる
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**作業開始**: PHIチェック5行追加 → 10分で完了
|
|||
|
|
**次のステップ**: Phase 33完了判定会議 → Phase 34移行検討
|