Files
hakorune/docs/development/current/main/phase33-10-implementation-recommendation.md
nyash-codex 588129db65 feat(joinir): Phase 34-6 MethodCall 構造と本物の substring 意味論
**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>
2025-11-27 17:05:46 +09:00

292 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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-252merge 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
```
**期待結果**: ✅ PASSPHI命令なしケースは引き続き動作
### 2.2 実用MIRPHI命令あり
```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 loweringdry-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`
- [ ] ユニットテスト PASS7テスト
- [ ] 実用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-11IfMerge実装
**目的**: 複数変数PHIのJoinIR表現
**条件**:
- IfMerge設計Phase 33-6.1)完了済み
- Runner/Bridge実装が必要推定4-6h
**効果**:
- 複数変数 if/else の JoinIR 表現
- conservative.rs の一部機能移譲
### Option B: Phase 34AST→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移行検討