From 9a5cec394c8d6db6b74917c2edbcdf4034b868e3 Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Sun, 23 Nov 2025 04:52:37 +0900 Subject: [PATCH] =?UTF-8?q?docs(loopform):=20PHI/Loop=E7=AE=B1=E2=86=92Joi?= =?UTF-8?q?nIR=E7=A7=BB=E8=A1=8C=E5=AF=BE=E5=BF=9C=E8=A1=A8=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 実装内容: - loopform_ssot.md に Phase 26-H 以降の移行戦略追加 - 全17箱の将来的な扱いを3カテゴリに分類: 🔄 JoinIR に吸収(6箱): Header/Exit/Snapshot系 ❌ 削除候補(4箱): PhiBuilder/IfPhi/LoopPhi系 ✅ 残す(7箱): 前処理/検証/ユーティリティ系 移行戦略: - Phase 27: 一般化 MIR → JoinIR 変換実装 - Phase 28: JoinIR 実行器実装(VM/LLVM) - Phase 29: レガシー PHI 箱の段階的削除 これで「今の箱が最終的にどう片付くか」一目瞭然!🎉 --- .../architecture/loops/loopform_ssot.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/docs/development/architecture/loops/loopform_ssot.md b/docs/development/architecture/loops/loopform_ssot.md index 1ee1ef82..5d8ea98a 100644 --- a/docs/development/architecture/loops/loopform_ssot.md +++ b/docs/development/architecture/loops/loopform_ssot.md @@ -90,6 +90,48 @@ SSOT(Single Source of Truth) --- +## Phase 26-H 以降: PHI/Loop 箱 → JoinIR 移行対応表 + +JoinIR(関数正規化IR)の導入により、φ ノードが関数引数に、merge ブロックが join 関数に変換される。各箱の将来的な扱いを整理する。 + +| 現在の箱 | ファイル | Phase | 将来的な扱い | 理由 | +|---------|---------|-------|------------|------| +| **HeaderPhiBuilder** | `header_phi_builder.rs` | 26-C | 🔄 JoinIR に吸収 | header φ → `loop_step` 関数の引数に変換 | +| **ExitPhiBuilder** | `exit_phi_builder.rs` | 26-D | 🔄 JoinIR に吸収 | exit φ → `k_exit` 継続の引数に変換 | +| **LoopSnapshotManager** | `loop_snapshot_manager.rs` | 26-C | 🔄 JoinIR に吸収 | スナップショット → 関数呼び出し時の引数に統合 | +| **LoopSnapshotMerge** | `loop_snapshot_merge.rs` | 26-C | 🔄 JoinIR に吸収 | スナップショット合流 → 関数呼び出しで自然に表現 | +| **PhiInputCollector** | `phi_input_collector.rs` | 26-B | 🔄 JoinIR に吸収 | φ 入力収集 → 関数引数決定ロジックに統合 | +| **IfBodyLocalMerge** | `if_body_local_merge.rs` | 26-F-2 | 🔄 JoinIR に吸収 | if merge φ → join 関数の引数に変換 | +| **PhiBuilderBox** | `phi_builder_box.rs` | 26-E | ❌ 削除候補 | 統一箱は JoinIR 生成で不要に | +| **IfPhi** | `if_phi.rs` | Phase 1 | ❌ 削除候補 | if φ → join 関数に完全統合 | +| **LoopPhi** | `loop_phi.rs` | Phase 1 | ❌ 削除候補 | loop φ → 関数引数に完全統合 | +| **LoopFormBuilder** | `loopform_builder.rs` | Phase 1 | ❌ 削除候補 | JoinIR 生成ロジックに置き換え | +| **LoopVarClassifier** | `loop_var_classifier.rs` | Option C | ✅ LoopForm 前段として残す | 変数分類は MIR → JoinIR 変換の前処理として必要 | +| **LoopExitLiveness** | `loop_exit_liveness.rs` | 26-F-4 | ✅ LoopForm 前段として残す | exit 後使用変数は `k_exit` 引数決定に必要 | +| **BodyLocalPhiBuilder** | `body_local_phi_builder.rs` | 26-B | ✅ LoopForm 前段として残す | 前処理段階での統合決定ロジック | +| **LocalScopeInspector** | `local_scope_inspector.rs` | Option C | ✅ LoopForm 前段として残す | スコープ分析は前処理として必要 | +| **PhiInvariants** | `phi_invariants.rs` | 26-F-3 | ✅ 検証用として残す | JoinIR 変換前後の検証に有用 | +| **Common** | `common.rs` | Phase 1 | ✅ ユーティリティとして残す | 共通ヘルパー関数群 | +| **Conservative** | `conservative.rs` | Phase 1 | ✅ フォールバックとして残す | 保守的 PHI 生成(レガシー互換) | + +### 記号説明 +- 🔄 **JoinIR に吸収**: φ ノード → 関数引数変換により不要になる +- ❌ **削除候補**: JoinIR 生成ロジックで完全に置き換えられる +- ✅ **残す**: MIR → JoinIR 変換の前処理/検証として必要 + +### 移行戦略(Phase 27 以降) +1. **Phase 27**: 一般化 MIR → JoinIR 変換実装 + - `lower_min_loop_to_joinir` の一般化 + - LoopVarClassifier / LoopExitLiveness を前処理として利用 +2. **Phase 28**: JoinIR 実行器実装(VM / LLVM) + - 関数呼び出し/継続ベースの実行 +3. **Phase 29**: レガシー PHI 箱の段階的削除 + - HeaderPhiBuilder → JoinIR 引数生成に置き換え + - ExitPhiBuilder → JoinIR 継続引数に置き換え + - PhiBuilderBox / IfPhi / LoopPhi の完全削除 + +--- + 関連 - `src/mir/loop_builder.rs` - `src/runner/json_v0_bridge/lowering/loop_.rs` @@ -97,3 +139,4 @@ SSOT(Single Source of Truth) - `src/mir/phi_core/loop_snapshot_merge.rs` - `src/mir/phi_core/exit_phi_builder.rs` - `src/tests/mir_loopform_conditional_reassign.rs` +- **Phase 26-H**: `src/mir/join_ir.rs` - JoinIR 型定義・自動変換実装