Unifies initialization and conversion logic across all 4 loop patterns, eliminating code duplication and establishing single source of truth. ## Changes ### Infrastructure (New) - CommonPatternInitializer (117 lines): Unified loop var extraction + CarrierInfo building - JoinIRConversionPipeline (127 lines): Unified JoinIR→MIR→Merge flow ### Pattern Refactoring - Pattern 1: Uses CommonPatternInitializer + JoinIRConversionPipeline (-25 lines) - Pattern 2: Uses CommonPatternInitializer + JoinIRConversionPipeline (-25 lines) - Pattern 3: Uses CommonPatternInitializer + JoinIRConversionPipeline (-25 lines) - Pattern 4: Uses CommonPatternInitializer + JoinIRConversionPipeline (-40 lines) ### Code Reduction - Total reduction: ~115 lines across all patterns - Zero code duplication in initialization/conversion - Pattern files: 806 lines total (down from ~920) ### Quality Improvements - Single source of truth for initialization - Consistent conversion flow across all patterns - Guaranteed boundary.loop_var_name setting (prevents SSA-undef bugs) - Improved maintainability and testability ### Testing - All 4 patterns tested and passing: - Pattern 1 (Simple While): ✅ - Pattern 2 (With Break): ✅ - Pattern 3 (If-Else PHI): ✅ - Pattern 4 (With Continue): ✅ ### Documentation - Phase 33-22 inventory and results document - Updated joinir-architecture-overview.md with new infrastructure ## Breaking Changes None - pure refactoring with no API changes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
5.7 KiB
5.7 KiB
Phase 33-17: JoinIR モジュール化実装完了
実施日: 2025-12-07
🎯 実装サマリー
Phase 33-17-A: instruction_rewriter 分割(完了✅)
実施内容:
-
✅
tail_call_classifier.rs作成(109行、テスト含む)- TailCallKind enum
- classify_tail_call() 関数
- 単体テスト4ケース追加
-
✅
merge_result.rs作成(46行)- MergeResult struct
- ヘルパーメソッド(new, add_exit_phi_input, add_carrier_input)
-
✅
instruction_rewriter.rsリファクタリング- 649行 → 589行(60行削減、9.2%減)
- 重複コード削除
- 新モジュールへの委譲
-
✅
merge/mod.rs更新- 新モジュール宣言追加
- 公開API再エクスポート(MergeResult, TailCallKind, classify_tail_call)
-
✅ ビルド確認
cargo build --release成功- 警告のみ(既存の未使用変数警告)
- エラー0件
📊 効果測定
ファイルサイズ変化
| ファイル | Before | After | 削減率 |
|---|---|---|---|
| instruction_rewriter.rs | 649行 | 589行 | -9.2% |
| tail_call_classifier.rs | - | 109行 | 新規 |
| merge_result.rs | - | 46行 | 新規 |
| 合計 | 649行 | 744行 | +14.6% |
注: 合計行数は増加しているが、これは以下の理由により正常:
- テストコード追加(40行)
- ドキュメントコメント追加(30行)
- ヘルパーメソッド追加(25行)
実質的な削減:
- 重複コード削除: 60行
- 可読性向上: 各ファイル200行以下達成(instruction_rewriter除く)
🏗️ アーキテクチャ改善
Before (Phase 33-16)
instruction_rewriter.rs (649行)
- TailCallKind enum定義
- classify_tail_call()関数
- MergeResult struct定義
- merge_and_rewrite()巨大関数
After (Phase 33-17)
tail_call_classifier.rs (109行)
- TailCallKind enum + classify_tail_call()
- 単体テスト完備
✅ 単一責任: 分類ロジックのみ
merge_result.rs (46行)
- MergeResult struct + ヘルパー
✅ 単一責任: データ構造管理のみ
instruction_rewriter.rs (589行)
- merge_and_rewrite()実装
- 上記2モジュールに委譲
✅ 単一責任: 命令変換のみ
🎯 箱理論への準拠
TailCallClassifier Box
- 責務: tail call の分類ロジック
- 入力: is_entry_func_entry_block, has_loop_header_phis, has_boundary
- 出力: TailCallKind (LoopEntry/BackEdge/ExitJump)
- 独立性: ✅ 完全に独立してテスト可能
MergeResult Box
- 責務: マージ結果のデータ保持
- 状態: exit_block_id, exit_phi_inputs, carrier_inputs
- 操作: add_exit_phi_input(), add_carrier_input()
- 独立性: ✅ 他のBoxに依存しない
InstructionRewriter Box
- 責務: JoinIR命令のMIRへの変換
- 委譲: TailCallClassifier, MergeResult
- 独立性: ⚠️ まだ589行(次Phase対象)
🚀 次のステップ
Phase 33-17-B: loop_header_phi_builder 分割(推奨)
目標:
- loop_header_phi_builder.rs: 318行 → 170行
- loop_header_phi_info.rs: 新規 150行
理由:
- データ構造(LoopHeaderPhiInfo)とビルダーロジックを分離
- LoopHeaderPhiInfo を他モジュールから独立利用可能に
実装タスク:
-
loop_header_phi_info.rs 作成
- LoopHeaderPhiInfo struct
- CarrierPhiEntry struct
- get/set メソッド
-
loop_header_phi_builder.rs リファクタリング
- LoopHeaderPhiBuilder のみ残す
- build(), finalize() 実装
-
merge/mod.rs 更新
- loop_header_phi_info モジュール追加
- 公開API再エクスポート
Phase 33-17-C: instruction_rewriter さらなる分割(検討中)
現状:
- instruction_rewriter.rs: まだ589行(目標200行の2.9倍)
候補分割案:
-
boundary_injector_wrapper.rs (180行)
- BoundaryInjector 呼び出しロジック
- Copy命令生成
-
instruction_mapper.rs (350行)
- merge_and_rewrite() コア処理
- Call→Jump変換
- 命令リマッピング
-
parameter_binder.rs (60行)
- tail call パラメータバインディング
- Copy命令生成
判断基準:
- ✅ 実施: instruction_rewriter が400行を超える場合
- ⚠️ 保留: 300-400行なら現状維持
- ❌ 不要: 300行以下なら分割不要
📈 プロジェクト全体への影響
コード品質
- ✅ 単体テスト追加: TailCallClassifier(4ケース)
- ✅ ドキュメント改善: 箱理論の役割明記
- ✅ 保守性向上: 関心の分離完全実現
ビルド時間
- 影響なし(1分02秒 → 1分03秒、誤差範囲)
テスト通過
- 既存テスト: 全てパス(確認済み)
- 新規テスト: 4ケース追加(全てパス)
🎉 達成事項
- ✅ instruction_rewriter.rs の責務分離完了
- ✅ TailCallClassifier Box の完全独立化
- ✅ MergeResult Box のデータ管理責任明確化
- ✅ 単体テスト整備(4ケース追加)
- ✅ ビルド成功・既存テストパス確認
- ✅ 箱理論への完全準拠
📝 レビューポイント
良かった点
- 分割粒度が適切(109行、46行)
- テストコードを同時に追加
- 既存のAPIを破壊しない設計
改善点
- instruction_rewriter.rs がまだ589行(さらなる分割検討余地)
- ドキュメントコメントをより充実させる余地
次の改善機会
- Phase 33-17-B: loop_header_phi_builder 分割
- Phase 33-17-C: instruction_rewriter さらなる分割(必要に応じて)
Status: Phase 33-17-A 完了✅ Build: Success(1m 03s) Tests: All Pass Next: Phase 33-17-B 実施検討