Files
hakorune/docs/development/current/main/phase26-HC-normalized-pattern1-bridge.md

66 lines
4.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.

Status: Active
Scope: Phase 26H.C ― Normalized JoinIR (Pattern1) を MIR に落とす最小ブリッジの設計と比較テスト計画dev専用
# Phase 26H.C 指示書 — Normalized→MIR ブリッジPattern1 最小)+比較テスト
## ゴール
- Normalized JoinIRNormalizedModuleから MIR への「本物のブリッジ」を、Pattern1 最小ケースだけで実装する。
- Structured→MIR と Structured→Normalized→MIR の結果が一致することをテストで確認するdev 専用、CLI はまだ触らない)。
## A. Normalized→Structured or Normalized→MIR の経路方針
- Option 1: Normalized→Structured→既存 MIR ブリッジ
- 長所: 既存の JoinIR→MIR パイプラインを再利用できる。
- 短所: フェーズが一段増えるNormalized→Structured が joinir→joinir の一歩になる)。
- Option 2: Normalized→MIR を直接作るミニブリッジPattern1 限定) **←今回これを優先**
- 長所: TailCall/Env をそのまま MIR に落とす感触を掴める。
- 短所: 一部ロジックが JoinIR→MIR と重複する。
- どちらを選んでも「Pattern1 最小ケース限定」「テスト専用 helper」とする本番パスへは配線しない。今回は Option 2 で進め、必要があれば Option 1 のスケルトンも残す。
## B. Normalized→Structured ミニ変換Option 1 採用時のメモ)
- 追加場所: `src/mir/join_ir/normalized.rs`
- API 例: `pub fn normalize_pattern1_to_structured(norm: &NormalizedModule) -> JoinModule`
- 制約: `norm.phase == JoinIrPhase::Normalized`、関数は 1 つloop_step + 仮の k_exit 程度)を想定。
- 変換の要点:
- EnvLayout の fields から JoinFunction の params を再構成最小なら1引数でも可
- `JpInst::Let``JoinInst::Compute(MirLikeInst::Const/BinOp/UnaryOp/Compare)` に戻す。
- TailCallFn/TailCallKont/If を Pattern1 が生成していた `JoinInst::Call/Jump/Ret` 相当に戻す。
- `NormalizedModule.entry``JoinModule.entry` に写す。
- `NormalizedModule.structured_backup` は比較用に残すが、ブリッジでは本体から再構成する。
## C. Normalized→MIR ミニブリッジ(今回の主経路: Option 2
- 追加ファイル案: `src/mir/join_ir/lowering/normalized_pattern1_to_mir.rs`
- API 例:
```rust
pub fn lower_normalized_pattern1_to_mir(norm: &NormalizedModule) -> crate::mir::Module { ... }
```
- 最低限やること:
- EnvLayout の 1 フィールドを MIR のループ変数に対応させる。
- `JpFunction` 本体を 1 ブロック or 小ブロック列に変換Let→MIR Assign/Compute、TailCallFn→ループ末尾 Jump 等)。
- Pattern1 の `loop_min_while` 相当が生成していた MIR と構造的に一致するかをテストで確認。
- ガード: dev/テスト専用 helper から明示的に呼ぶ。ランナー/CLI には配線しない。
## D. 比較用テストの追加
- テストファイル案: `tests/normalized_pattern1_bridge.rs`
- シナリオ:
1. Structured JoinIR (Pattern1: loop_min_while 相当) を既存 lowerer で生成。
2. そのコピーを `normalize_pattern1_minimal` に通し NormalizedModule を得る。
3. 既存経路: Structured → 既存 JoinIR→MIR ブリッジ → 実行 or MIR dump。
4. 新経路: Structured → Normalized → C のブリッジ)→ MIR → 実行 or MIR dump。
5. 比較:
- 実行結果一致RC + stdout
- 余裕があれば MIR の基本ブロック数や命令種も比較し、構造乖離がないことを確認。
- テスト名例:
- `test_normalized_pattern1_minimal_roundtrip`
- `test_normalized_pattern1_exec_result_matches_structured`
## E. ガードと完了条件
- ガード:
- 新ブリッジはテスト専用(ランナー/CLI からは呼ばない)。
- JoinModule.phase が Structured のままでも既存経路は従来どおり動作。
- Normalized 経路は dev/テスト専用 helper からのみ呼ぶ。
- 完了条件:
- NormalizedModule から MIR を生成する経路Option 2が 1 本通る。
- Pattern1 最小ケースで Structured→MIR と Structured→Normalized→MIR が同じ結果になるテストが緑。
- 既存 `cargo test --release` が 0 FAIL のまま。