**Phase 34-6 実装完了**: MethodCall 構造を JoinIR に追加し、本物の substring
呼び出しを通すことに成功。
## 主要変更
### 1. MethodCall 構造追加 (34-6.1)
- `src/mir/join_ir/mod.rs`: JoinInst::MethodCall バリアント (+8 lines)
- 構造: `{ dst, receiver, method, args }`
- 設計原則: JoinIR は構造のみ、意味論は MIR レベル
### 2. extract_value 更新 (34-6.2)
- `src/mir/join_ir/frontend/ast_lowerer.rs`: Method 処理本物化 (+37 lines)
- receiver/args を extract_value で再帰処理
- ダミー Const(0) 削除 → 本物の MethodCall 生成
- cond 処理修正: ValueId(0) ハードコード → extract_value で取得
### 3. JoinIR→MIR 変換実装 (34-6.3)
- `src/mir/join_ir_vm_bridge.rs`: MethodCall → BoxCall 変換 (+12 lines)
- `src/mir/join_ir/json.rs`: MethodCall JSON シリアライゼーション (+16 lines)
- `src/mir/join_ir_runner.rs`: MethodCall 未対応エラー (+7 lines)
### 4. テスト更新 (34-6.4)
- `docs/.../fixtures/json_shape_read_value.program.json`: 本物の substring 構造
- `src/tests/joinir_frontend_if_select.rs`: run_joinir_via_vm 使用
- テスト成功: v="hello", at=3 → "hel" ✅
## 成果
- ✅ テスト全通過(1 passed; 0 failed)
- ✅ 設計原則確立: JoinIR = 構造 SSOT、意味論 = MIR レベル
- ✅ Phase 33-10 原則との整合性: Method でも同じ原則適用
**ドキュメント更新**: CURRENT_TASK.md + TASKS.md(Phase 34-6 完了記録)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
7.3 KiB
7.3 KiB
Phase 33-10: 実装推奨事項(5分で完了)
作成日: 2025-11-27 前提: phase33-10-local-pattern-mir-analysis.md の分析完了
1. 実装すべき内容(たった5行)
1.1 ファイル: src/mir/join_ir/lowering/if_select.rs
修正箇所: Line 250-252(merge blockの命令チェック部分)
修正前:
// 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;
}
修正後:
// 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 ユニットテスト(既存)
cargo test --release test_if_select_pattern_matching
期待結果: ✅ PASS(PHI命令なしケースは引き続き動作)
2.2 実用MIR(PHI命令あり)
# テストケース作成
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"
期待結果:
bb5:
1: %12 = phi [%8, bb3], [%11, bb4] ← PHI命令が存在
1: ret %12
2.3 JoinIR lowering(dry-run)
# 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以降):
- AST → JoinIR 経路の確立(PHI生成前にJoinIR変換)
- MIR Builder本線での if_phi 経路削除
- 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 即座に実施(今日)
- PHIチェック追加(5分)
- テスト実行(2分)
- コミット(3分)
- ドキュメント更新(既に完了)
合計時間: 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移行検討