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

7.3 KiB
Raw Blame History

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-252merge 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

期待結果: PASSPHI命令なしケースは引き続き動作

2.2 実用MIRPHI命令あり

# テストケース作成
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 loweringdry-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
  • ユニットテスト 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移行検討