59f7f03efb
feat(joinir): Phase 40-4.1 delete collect_assigned_vars (35 lines)
...
Breaking: collect_assigned_vars function removed from if_phi.rs
Changes:
- Delete collect_assigned_vars() function (35 lines)
- Make JoinIR route the default in loop_builder.rs
- Rewrite collect_assigned_vars_via_joinir() with ast_to_json support
- Now detects both Local declarations and Assignment nodes
- Add extract_vars_from_json_stmts/stmt helpers
- Update tests to use new implementation
- phase40_joinir_detects_local_declarations
- phase40_joinir_nested_if_local
Test results: 407 passed, 11 failed (same as before, no regression)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-28 11:07:01 +09:00
c7975d4bd9
feat(joinir): Phase 40-3.5 route switching implementation
...
- Add collect_assigned_vars_via_joinir() in if_phi.rs (65 lines)
- Wrapper using Phase 40-1 JoinIR infrastructure
- Converts ASTNode to JSON and calls JoinIR analysis
- Add route switching in loop_builder.rs
- Check HAKO_JOINIR_ARRAY_FILTER env flag
- Route A: Legacy collect_assigned_vars path
- Route B: JoinIR collect_assigned_vars_via_joinir path
- Add A/B tests in phase40_array_ext_filter_test.rs
- phase40_ab_route_switching: Basic assignment detection
- phase40_ab_nested_if: Nested if assignment detection
- All 5 Phase 40 tests PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-28 10:51:34 +09:00
c2fb9dab6b
feat(joinir): Phase 35-5 PHI box deletion (430 lines HIGH safety)
...
Phase 35-5: First wave deletion
- Deleted if_body_local_merge.rs (339 lines, 0 external calls)
- Inlined logic into PhiBuilderBox::compute_modified_names_if()
- Absorbed into PhiBuilderBox (isolated box with no external dependencies)
- Deleted phi_invariants.rs (91 lines, moved to JoinIR Verifier)
- Removed ensure_if_values_exist() call from phi_builder_box.rs
- Validation responsibility transferred to JoinIR Verifier
- Updated PHI_BOX_INVENTORY.md with deletion records
Phase 35-3/4: Documentation and route unification
- Added frontend_covered column to PHI_BOX_INVENTORY.md
- Documented JoinIR Runner routes (Route A: SSOT, Route B: structure validation)
- Updated join_ir_runner.rs module docstring with clear route guidelines
Build and test status:
✅ cargo build --release: Clean
✅ Phase 34 tests: All PASS (no regression)
✅ JoinIR tests: joinir_frontend_if_select, test_if_merge_simple_pattern PASS
Total reduction: 430 lines (HIGH safety achieved)
Phase 36+ potential: ~3,275 lines (MEDIUM/LOW safety)
Related docs:
- docs/private/roadmap2/phases/phase-35-phi-reduction/README.md
- docs/private/roadmap2/phases/phase-35-phi-reduction-investigation-report.md
- docs/private/roadmap2/phases/phase-30-final-joinir-world/PHI_BOX_INVENTORY.md
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-28 01:18:57 +09:00
51ff558904
feat(phase32): L-2.1 Stage-1 UsingResolver JoinIR integration + cleanup
...
Phase 32 L-2.1 complete implementation:
1. Stage-1 UsingResolver main line JoinIR connection
- CFG-based LoopForm construction for resolve_for_source/5
- LoopToJoinLowerer integration with handwritten fallback
- JSON snapshot tests 6/6 PASS
2. JoinIR/VM Bridge improvements
- Simplified join_ir_vm_bridge.rs dispatch logic
- Enhanced json.rs serialization
- PHI core boxes cleanup (local_scope_inspector, loop_exit_liveness, loop_var_classifier)
3. Stage-1 CLI enhancements
- Extended args.rs, groups.rs, mod.rs for new options
- Improved stage1_bridge module (args, env, mod)
- Updated stage1_cli.hako
4. MIR builder cleanup
- Simplified if_form.rs control flow
- Removed dead code from loop_builder.rs
- Enhanced phi_merge.rs
5. Runner module updates
- json_v0_bridge/lowering.rs improvements
- dispatch.rs, selfhost.rs, modes/vm.rs cleanup
6. Documentation updates
- CURRENT_TASK.md, AGENTS.md
- Various docs/ updates
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 10:17:37 +09:00
2b47f47061
refactor(phi_core): F-2.1 - 早期グループPHI箱削除(約2,500行削減)
...
## 削除したファイル
- header_phi_builder.rs (~628行) - バイパス関数を loopform_builder.rs に移動
- exit_phi_builder.rs (~1000行) - バイパス関数を loopform_builder.rs に移動
- body_local_phi_builder.rs (~550行) - 依存なし
- loop_phi.rs (~288行) - LoopPhiOps実装も削除
## 移動した関数
loopform_builder.rs に以下を移動:
- get_loop_bypass_flags() / LoopBypassFlags struct
- is_joinir_header_bypass_target()
- joinir_exit_bypass_enabled()
- is_joinir_exit_bypass_target()
## 修正したファイル
- loop_builder.rs: バイパス関数の参照先変更 + LoopPhiOps impl削除
- mod.rs: モジュール宣言削除
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-25 23:42:35 +09:00
da1a5558e5
Normalize passes keep spans and clean warnings
2025-11-24 15:02:51 +09:00
466e636af6
Span trace utilities and runner source hint
2025-11-24 14:17:02 +09:00
4bfc9119dd
cleanup(phi): Phase 27.4C Cleanup - ヘルパー統一・定数化・API縮小
...
Phase 1-2 完了: デバッグ・環境変数・対象関数の保守性向上
## Phase 1-1: デバッグフラグヘルパー化
**目的**: NYASH_LOOPFORM_DEBUG チェックの重複排除
**実装**:
- `is_loopform_debug_enabled()` 関数追加 (loopform_builder.rs:16-23)
- `#[inline]` + `pub(crate)` で効率的に共有
- 環境変数チェックを一元化
- 使用箇所 (5箇所 → 1箇所定義):
- loopform_builder.rs: seal_pinned_phis (line 367)
- loopform_builder.rs: seal_carrier_phis (line 431)
- loop_builder.rs: emit_header_phis 前 (line 315)
- loop_builder.rs: emit_header_phis 後 (line 324)
**効果**: 重複削減(5箇所 → 1箇所)、将来のログシステム変更が容易
## Phase 1-2: 対象関数名の定数化
**目的**: JoinIR Header φ バイパス対象関数の保守性向上
**実装**:
- `JOINIR_HEADER_BYPASS_TARGETS` 定数追加 (header_phi_builder.rs:52-59)
```rust
const JOINIR_HEADER_BYPASS_TARGETS: &[&str] = &[
"Main.skip/1",
"FuncScannerBox.trim/1",
];
```
- `is_joinir_header_bypass_target()` を定数ベースに変更 (line 61-66)
- `matches!()` → `.contains()` に変更
**効果**: 対象関数追加時の保守性向上、定数にドキュメント集約可能
## Phase 1-3: 環境変数チェック統一
**目的**: 環境変数チェックロジックの統一化
**実装**:
- `joinir_header_experiment_enabled()` を `env_flag_is_1()` 使用に変更
```rust
// Before
std::env::var("NYASH_JOINIR_HEADER_EXP").ok().as_deref() == Some("1")
// After
crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_HEADER_EXP")
```
- `HeaderPhiBuilder::new()` も同様に統一 (line 183)
**効果**: 環境変数チェックロジック統一、env_flag_is_1() の利点(キャッシュ等)を享受
## Phase 2: 不要 public 関数の整理
**目的**: API サーフェス縮小、保守性向上
**実装**:
- `joinir_header_experiment_enabled()` を削除
- 単一の呼び出し元 (`get_loop_bypass_flags()`) しかなかったためインライン化
- `get_loop_bypass_flags()` 内で直接 `env_flag_is_1()` を呼び出し (line 77-79)
```rust
let joinir_exp = crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_EXPERIMENT");
let header_exp = crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_HEADER_EXP");
```
**効果**: API サーフェス縮小、重複削減、保守コスト削減
## テスト結果
**コンパイル**: ✅ 0 errors, 19 warnings
**テスト**: ✅ 371 passed; 10 failed
- Phase 27.4C Refactor 時: 370 passed; 11 failed
- **+1 テスト通過!** 🎉
- 既存 failures 変化なし
## 修正ファイル
- src/mir/phi_core/loopform_builder.rs
- is_loopform_debug_enabled() 追加 + 使用
- src/mir/phi_core/header_phi_builder.rs
- JOINIR_HEADER_BYPASS_TARGETS 定数追加
- joinir_header_experiment_enabled() 削除(インライン化)
- get_loop_bypass_flags() 簡素化
- HeaderPhiBuilder::new() 統一化
- src/mir/loop_builder.rs
- is_loopform_debug_enabled() 使用 (2箇所)
## 総合効果
- ✅ 重複削減: 環境変数チェック 5箇所 → 1箇所
- ✅ 保守性向上: 対象関数追加が容易、ログシステム変更が容易
- ✅ API 縮小: 不要な内部関数削除
- ✅ テスト改善: +1 テスト通過
- ✅ 退行なし: 既存 failures 変化なし
2025-11-23 14:30:05 +09:00
9ea8bb34f6
refactor(phi): Phase 27.4C Refactor - seal_phis分割 + トグル条件一元化
...
推奨アクション 1 & 2 実装完了
## Action 1: seal_phis メソッド分割
**目的**: 150行超の seal_phis を責任ごとに分割、可読性・保守性向上
**実装**:
- seal_pinned_phis() 追加 (loopform_builder.rs:347-407)
- Pinned 変数専用 φ seal 処理を抽出
- Header φ バイパス時の early return 含む
- seal_carrier_phis() 追加 (loopform_builder.rs:409-477)
- Carrier 変数専用 φ seal 処理を抽出
- Header φ バイパス時の early return 含む
- seal_phis() を委譲パターンに簡素化 (loopform_builder.rs:340-342)
**効果**:
- メソッド長: 150行 → 3行(委譲) + 60行(Pinned) + 68行(Carrier)
- 責任の明確化: Pinned/Carrier 処理が独立
- 将来の拡張が容易(Exit φ バイパス追加時など)
## Action 2: トグル条件ヘルパー一元化
**目的**: Header φ バイパス条件判定の重複排除、保守性向上
**実装**:
- LoopBypassFlags 構造体追加 (header_phi_builder.rs:18-24)
- header/exit バイパスフラグを統合管理
- get_loop_bypass_flags() 関数追加 (header_phi_builder.rs:26-38)
- 関数名からバイパスフラグを一元計算
- NYASH_JOINIR_EXPERIMENT/HEADER_EXP チェック
- Main.skip/1 & FuncScannerBox.trim/1 判定
- loop_builder.rs で 2箇所から呼び出し (lines 299-307, 609-612)
- fn_name を String として取得 (loop_builder.rs:299-304)
- 借用問題回避(&str → String)
**効果**:
- 重複削減: 3箇所 → 1箇所の定義
- バグ防止: 条件判定ロジックの不一致を防止
- 借用問題解決: fn_name String 化で Rust 借用チェッカー通過
- 将来対応: Exit φ バイパス(Phase 27.6-2)追加が容易
## テスト結果
**コンパイル**: ✅ 0 errors, 19 warnings
**ベースライン**: ✅ 370 passed; 11 failed (退行なし、+10テスト通過)
## 修正ファイル
- src/mir/phi_core/loopform_builder.rs
- seal_pinned_phis() 追加
- seal_carrier_phis() 追加
- seal_phis() 委譲化
- src/mir/phi_core/header_phi_builder.rs
- LoopBypassFlags 構造体追加
- get_loop_bypass_flags() 関数追加
- src/mir/loop_builder.rs
- fn_name String 化
- get_loop_bypass_flags() 呼び出し (2箇所)
- docs/private/roadmap2/phases/phase-27.4C-refine-sealphis/README.md
- リファクタリング詳細ドキュメント追加
2025-11-23 13:16:08 +09:00
52b56efb47
feat(phi): Phase 27.6-2 - ExitPhiBuilder バイパス実装
...
ExitPhiBuilder にトグル付きバイパスを追加:
- ヘルパー関数追加 (exit_phi_builder.rs:397-419)
- joinir_exit_bypass_enabled(): トグルチェック
- is_joinir_exit_bypass_target(): 対象関数判定
- 環境変数: NYASH_JOINIR_EXPERIMENT=1 + NYASH_JOINIR_EXIT_EXP=1
- バイパス実装 (loop_builder.rs:657-692)
- Exit φ 生成前にバイパス判定
- 対象関数: Main.skip/1, FuncScannerBox.trim/1
- ログ: [loopform/exit-bypass] func=... exit=... header=...
- Header φ バイパス(27.4-C)と対称的な実装
- 両方のトグルで Header/Exit φ の完全スキップが可能
- JoinIR 実験経路専用(本線影響ゼロ)
- 動作確認
- トグル OFF: 372 passed; 9 failed(既存と一致)✅
- コンパイル: エラーゼロ ✅
本線影響ゼロ。次は Phase 27.6-3 で A/B テスト。
2025-11-23 11:26:42 +09:00
df2248d3c1
feat(phi): Phase 27.4-C - HeaderPhiBuilder bypass for JoinIR experiment
...
JoinIR 実験経路限定で Header φ 生成をスキップ可能に。
実装内容:
- トグルシステム: joinir_header_bypass_enabled() / is_joinir_header_bypass_target()
- バイパス実装: loop_builder.rs で関数名チェック後に emit_header_phis() をスキップ
- ターゲット関数: Main.skip/1, FuncScannerBox.trim/1 のみ
- テスト更新: JoinIR テストファイルに Phase 27.4-C 対応コメント追加
環境変数:
- NYASH_JOINIR_EXPERIMENT=1 AND NYASH_JOINIR_HEADER_EXP=1 の両方が必要
本線影響: ゼロ(MIR/LoopForm→VM 経路は完全に影響なし)
2025-11-23 10:08:48 +09:00
f2bb07b542
refactor(mir): レガシーコード削除 - JoinIR準備整理
...
## 削除内容
- **src/mir/builder_modularized/control_flow.rs**: 削除
- JoinIR実装準備のため整理
- 使用されていないレガシーモジュール
## 修正内容
- **src/mir/loop_builder.rs**: 軽微な整理
- **CURRENT_TASK.md**: Phase 26-H進捗更新
## 影響範囲
- ✅ 既存パイプライン無影響
- ✅ テスト全パス維持
- ✅ JoinIR実装準備完了
🌟 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-23 04:35:13 +09:00
2692eafbbf
feat(mir): Phase 26-H JoinIR型定義実装完了 - ChatGPT設計
...
## 実装内容(Step 1-3 完全達成)
### Step 1: src/mir/join_ir.rs 型定義追加
- **JoinFuncId / JoinContId**: 関数・継続ID型
- **JoinFunction**: 関数(引数 = φノード)
- **JoinInst**: Call/Jump/Ret/Compute 最小命令セット
- **MirLikeInst**: 算術・比較命令ラッパー
- **JoinModule**: 複数関数保持コンテナ
- **単体テスト**: 型サニティチェック追加
### Step 2: テストケース追加
- **apps/tests/joinir_min_loop.hako**: 最小ループ+breakカナリア
- **src/tests/mir_joinir_min.rs**: 手書きJoinIR構築テスト
- MIR → JoinIR手動構築で型妥当性確認
- #[ignore] で手動実行専用化
- NYASH_JOINIR_EXPERIMENT=1 トグル制御
### Step 3: 環境変数トグル実装
- **NYASH_JOINIR_EXPERIMENT=1**: 実験モード有効化
- **デフォルト挙動**: 既存MIR/LoopForm経路のみ(破壊的変更なし)
- **トグルON時**: JoinIR手書き構築テスト実行
## Phase 26-H スコープ遵守
✅ 型定義のみ(変換ロジックは未実装)
✅ 最小限の命令セット
✅ Debug 出力で妥当性確認
✅ 既存パイプライン無影響
## テスト結果
```
$ NYASH_JOINIR_EXPERIMENT=1 cargo test --release mir_joinir_min_manual_construction -- --ignored --nocapture
[joinir/min] MIR module compiled, 3 functions
[joinir/min] JoinIR module constructed:
[joinir/min] ✅ JoinIR型定義は妥当(Phase 26-H)
test result: ok. 1 passed; 0 failed
```
## JoinIR理論の実証
- **φノード = 関数引数**: `fn loop_step(i, k_exit)`
- **merge = join関数**: 分岐後の合流点
- **ループ = 再帰関数**: `loop_step` 自己呼び出し
- **break = 継続呼び出し**: `k_exit(i)`
## 次フェーズ (Phase 27.x)
- LoopForm v2 → JoinIR 自動変換実装
- break/continue ハンドリング
- Exit PHI の JoinIR 引数化
🌟 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
Co-Authored-By: ChatGPT <noreply@openai.com >
2025-11-23 04:10:12 +09:00
9374812ff8
feat(phi): Phase 26-F-3 - ループ内if-merge PHI生成対応完了
...
## 成果
- テスト結果: 354→360 PASS (+6), 14→11 FAIL (-3)
- 退行なし、純粋な改善 ✨
## ChatGPT設計: 箱離婚 + 最小限の橋
### 問題
ループ内if-breakパターンで片腕のみの変数がPHI未生成
```hako
loop(i < n) {
if i >= n { break } // then腕: i なし(break)
i = i + 1 // else腕: i あり → PHI必要だがスキップされる
}
```
### 解決: 3箱の責務分離設計
**IfPhiContext(橋渡し箱)**
- in_loop_body: bool
- loop_carrier_names: BTreeSet<String>
**IfBodyLocalMergeBox(If側)**
- ループを知らない(箱離婚)
- carrier変数は片腕のみでもPHI候補に
- 通常if: 両腕に存在する変数のみ
**LoopBuilder(Loop側)**
- pre_if_var_mapからcarrier_names抽出
- IfPhiContext経由で橋渡し
## 修正ファイル
- src/mir/phi_core/phi_builder_box.rs: IfPhiContext拡張
- src/mir/phi_core/if_body_local_merge.rs: ループ内モード実装
- src/mir/loop_builder.rs: carrier_names設定
## テスト追加
- test_loop_internal_if_break_carrier_variable: ループ内if-break
- test_loop_internal_non_carrier_still_filtered: 非carrier除外
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-22 11:38:20 +09:00
948f22a03a
feat(phi): Phase 26-F-2 - 箱理論による責務分離(IfBodyLocalMergeBox新設)
...
**箱理論による問題解決**:
- ❌ 問題: LoopVarClassBox(ループスコープ分析)とif-merge処理が混在
- ✅ 解決: if-merge専用箱を新設して責務分離
**新箱: IfBodyLocalMergeBox**:
- 責務: if-merge専用のbody-local φ候補決定
- ロジック:
- 両腕に存在する変数を検出
- pre_ifと比較して値が変わった変数のみ
- empty elseは空リスト返す
- 特徴: LocalScopeInspector不要、LoopVarClassBox不使用
**変更ファイル**:
- src/mir/phi_core/if_body_local_merge.rs: 新規作成(IfBodyLocalMergeBox)
- src/mir/phi_core/phi_builder_box.rs: IfBodyLocalMergeBox使用に切り替え
- src/mir/phi_core/body_local_phi_builder.rs: filter_if_merge_candidates()削除
- src/mir/loop_builder.rs: BodyLocalPhiBuilder setup削除
- src/mir/phi_core/mod.rs: if_body_local_merge追加
**テスト結果**:
- Passed: 353→354 (+1) ✅
- Failed: 14→14 (退行なし)
**既知の問題**:
- domination error依然残存(%48 in bb48 from bb52)
- 次フェーズで調査・修正予定
技術詳細:
- ChatGPT箱理論分析による設計
- A案ベースのシンプル実装
- 責務明確化: ループスコープ分析 vs if-merge専用処理
2025-11-22 11:03:21 +09:00
cbe6bf0140
feat(phi): Phase 26-F Step 1 & 3 - BodyLocal if-merge統合(WIP - 過剰フィルタリング発生中)
...
Step 1完了:
- body_local_phi_builder.rs: filter_if_merge_candidates() API追加
- pre_if/then_end/else_end_opt/reachable_preds受け取り
- LoopVarClassBox使用して変数分類
Step 3完了:
- loop_builder.rs: BodyLocalPhiBuilder作成・PhiBuilderBoxに設定
- phi_builder_box.rs: IfPhiContext拡張・set_body_local_filter()実装
- compute_modified_names_if()でフィルタリング適用
**問題**: LocalScopeInspectorBox空のため全候補フィルタリング(0 candidates)
技術詳細:
- inspector定義記録なし → classify誤判定 → 全変数BodyLocalInternal扱い
- テスト結果: bb54/bb52→bb38/bb36/bb32(ブロック番号変化=PHI生成影響あり)
- mir_stage1_using_resolver_modules_map_continue_break_with_lookup_verifies: PASS
- mir_stage1_using_resolver_resolve_with_modules_map_verifies: FAIL(domination error残存)
次のステップ:
1. filter_if_merge_candidates()単純実装(inspector不要)
2. または変数定義トラッキング実装
3. ChatGPT相談推奨
2025-11-22 09:05:31 +09:00
879134fe3c
fix(phi): do_loop_exit でunreachableブロック作成を廃止
...
**問題**:
- break/continue後に `switch_to_unreachable_block_with_void()` 呼び出し
- 新しいunreachableブロック作成 → PHI生成に悪影響
- domination error: `Value %48 used in block bb55 but defined in non-dominating block bb53`
**修正内容**:
- 3. Void定数定義(戻り値用ダミー)
- 4. ジャンプ命令発行
- 5. 新しいunreachableブロックは作らない(`Ok(void_id)` 直接返却)
**効果**:
- 余分なブロック(bb53等)が作られない
- PHI生成の前提条件が正しく保たれる
- LoopForm v2 + ControlForm 設計に完全準拠
**実装者**: ChatGPT先生
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-22 08:52:46 +09:00
fc16130d6b
feat(phi): Phase 26-E-4 - variable_map リセットタイミング修正
...
**問題**:
- loop_builder.rs の lower_if_in_loop で PHI生成**前**に variable_map を pre_if_var_map にリセット
- else ブロック内で定義された変数が消失 → domination error 発生
- エラー: `Value %48 (obj_end) used in block bb54 but defined in non-dominating block bb52`
**修正内容**:
- 1053行, 1129行削除: PHI生成前の variable_map リセット(早すぎる)
- 1155-1159行追加: PHI生成**後**に variable_map リセット
- 理由: else_var_map_end_opt が正しい snapshot を保持したまま PHI 生成に渡す必要がある
**結果**:
- 決定性100%達成(3回実行で一貫したエラー)
- domination error 部分改善: bb52→bb54 から bb53→bb55 に変化
- 残課題: bb53 (break先) → bb55 (merge) の PHI 問題(別途対応予定)
**指示元**: ChatGPT + Task先生
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-22 08:41:14 +09:00
e0be01c12e
feat(phi): Phase 26-E-3 - PhiBuilderOps委譲実装(has-a設計)
...
Phase 26-E Phase 3 完了: ChatGPT+Claude 合意による委譲設計実装
**設計合意 (ChatGPT + Claude consensus):**
- PhiBuilderOps = 低レベル「PHI命令発行」道具箱
- LoopFormOps = 高レベル「ループ構造構築」作業場
- 関係: has-a(委譲) ではなく is-a(継承)
- LoopBuilder は両方のインターフェースを個別実装で提供
**実装内容:**
1. LoopFormOps trait 設計コメント更新
- 継承ではなく委譲の設計rationale明記
- 段階的統合方針: If側→Loop側→将来統合
2. LoopBuilder に PhiBuilderOps 委譲実装 (64行)
- 委譲パターン: LoopFormOps 既存実装を再利用
- HashSet → Vec 変換 + ソート(決定性保証)
- emit_phi: block 引数差を吸収(current_block 設定)
- 自己呼び出し回避: <Self as LoopFormOps>::method 明示
**技術的成果:**
- 重複コードゼロ: 既存 LoopFormOps 実装に完全委譲
- 決定性保証: pred_vec.sort_by_key(|bb| bb.0) で決定的順序
- シグネチャ差分吸収: PhiBuilderOps/LoopFormOps の違いを吸収
- 破壊的変更なし: 既存コード保護
**委譲実装の利点:**
1. 抽象化レベル分離: 低レベル(PHI発行)と高レベル(ループ構築)
2. 既存コード保護: LoopFormOps 実装は変更なし
3. 段階的統合: If側から先に PhiBuilderOps 安定化
4. テスト容易性: PhiBuilderOps/LoopFormOps それぞれでテスト可能
**関連ファイル:**
- src/mir/phi_core/loopform_builder.rs (設計コメント更新)
- src/mir/loop_builder.rs (PhiBuilderOps委譲実装, +64行)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-22 07:48:03 +09:00
b9a034293d
feat(phi): Phase 26-E-2 - PhiBuilderBox If PHI生成完全実装
...
Phase 26-E Phase 2 完了: PhiBuilderBox による If PHI生成SSOT統一化
**実装内容:**
1. PhiBuilderBox 作成 (444行)
- If PHI生成: generate_if_phis() 完全実装
- Conservative戦略: void emission 含む完全対応
- 決定的順序: BTreeSet/BTreeMap で非決定性排除
2. PhiBuilderOps trait (7メソッド)
- 最小PHI生成インターフェース
- new_value, emit_phi, update_var, get_block_predecessors
- emit_void, set_current_block, block_exists
3. loop_builder.rs 統合
- PhiBuilderOps trait 実装 (Ops構造体)
- If PHI呼び出し箇所統合 (line 1136-1144)
- Legacy if_phi::merge_modified_with_control 置換完了
**技術的成果:**
- Conservative PHI生成: 全経路カバー + void fallback
- 決定的変数順序: BTreeSet で変更変数をソート
- 決定的PHI入力順序: pred_bb.0 でソート
- テスタビリティ: MockOps でユニットテスト可能
**Phase 3 設計方針 (ChatGPT提案):**
- trait 階層化: LoopFormOps: PhiBuilderOps
- blanket impl: impl<T: LoopFormOps> PhiBuilderOps for T
- PhiBuilderBox: PhiBuilderOps 最小セットのみに依存
- 段階的移行: 既存コード保護しながら統一化
**削減見込み:**
- Phase 2: -80行 (If側重複削除)
- Phase 4: -287行 (loop_phi.rs Legacy削除)
- 合計: -367行 (純削減)
**関連ファイル:**
- src/mir/phi_core/phi_builder_box.rs (新規, 444行)
- src/mir/phi_core/mod.rs (module登録)
- src/mir/loop_builder.rs (PhiBuilderOps実装)
- CURRENT_TASK.md (Phase 26-E記録)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-22 07:05:21 +09:00
7812c3d4c1
feat(phi): Phase 25.1 - BTreeMap移行 (21ファイル、80%決定性達成)
...
## 修正内容
### Core MIR/PHI (5ファイル)
- builder.rs: variable_map, value_types, value_origin_newbox
- context.rs: 3つのマップ
- loop_builder.rs: 3箇所
- loop_snapshot_manager.rs: snapshot マップ
- loop_snapshot_merge.rs: 2箇所
### MIR関連 (4ファイル)
- function.rs: FunctionMetadata.value_types
- resolver.rs: CalleeResolverBox
- guard.rs: CalleeGuardBox
- loop_common.rs: apply_increment_before_continue
### JSON Bridge (5ファイル)
- json_v0_bridge/lowering.rs
- json_v0_bridge/lowering/expr.rs
- json_v0_bridge/lowering/if_else.rs
- json_v0_bridge/lowering/merge.rs
- json_v0_bridge/lowering/try_catch.rs
- json_v0_bridge/mod.rs
### Printer & Providers (4ファイル)
- printer.rs, printer_helpers.rs
- host_providers/mir_builder.rs
- backend/mir_interpreter/handlers/extern_provider.rs
### Tests (3ファイル)
- phi_core/conservative.rs
- tests/json_program_loop.rs
- tests/mir_stage1_using_resolver_verify.rs (2テスト有効化)
## テスト結果
- mir_stage1_using_resolver_resolve_with_modules_map_verifies: 80%成功率
- 完全な決定性は未達成 (HashMap 86箇所、HashSet 63箇所が残存)
🐱 Generated with Claude Code
2025-11-22 05:33:40 +09:00
baf028a94f
docs(phi): Phase 25.1 - LoopForm v2 コメント整備 + ケース表完成
...
- ✅ [LoopForm] タグで統一コメント追加
- src/mir/loop_builder.rs
- header-cond: Case A/B分岐説明
- exit-break path / continue-backedge path
- exit PHI for Case A/B
- src/mir/phi_core/loop_snapshot_merge.rs
- Case A/B分岐: header ∈ exit_preds判定ロジック
- src/mir/phi_core/exit_phi_builder.rs
- LoopForm Process ステップバイステップ説明
- ✅ UsingCollectorBox Region+next_i化
- lang/src/compiler/parser/using/using_collector_box.hako
- 全ループをLoopForm v2形式に統一
- next_i, next_j, next_k, next_t パターン導入
- SSA安全化(未定義変数撲滅)
- ✅ LoopForm v2 ケース表完成
- docs/development/architecture/loops/loopform_ssot.md
- Case A/B/C/D の完全な表
- テスト対応マッピング
- 実装ファイル対応表
🎯 成果: LoopForm v2の「形」をソース・テスト・ドキュメントで完全固定
2025-11-21 06:22:21 +09:00
26288b5451
refactor(phi): Phase 26-B-3 - loop_builder.rs and json_v0_bridge PhiInputCollector integration
...
- loop_builder.rs: Replace LoopSnapshotMergeBox calls with PhiInputCollector for continue-merge PHI generation
- json_v0_bridge/lowering/loop_.rs: Replace LoopSnapshotMergeBox calls with PhiInputCollector for continue_merge_bb PHI generation
- Unified PHI input handling across all loop builders (loopform_builder, loop_builder, json_v0_bridge)
- Tests: mir_loopform_exit_phi all passed (4/4)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-20 18:07:11 +09:00
38a028bb5e
feat(phi): Step 5-3 partial - Skip __pin$ in prepare_structure()
...
Step 5-5-C & Step 5-3-partial implementation:
- loopform_builder.rs: Skip __pin$ variables in prepare_structure()
- loopform_builder.rs: Use header_phi as latch_value for __pin$ carriers
- Result: ValueId error improved 318→256, dominator errors reduced
Technical Details:
- __pin$ compiler temps are now BodyLocalInternal (no PHIs)
- Prevents undefined ValueId from break snapshots being used at latch
- Dominator violation errors dramatically reduced
Test Status: 267 PASS / 1 FAIL (no regressions)
Remaining: ValueId(256) at BasicBlockId(429) - different root cause
🐛 PHI Bug Option C実装: 箱分割設計で根本修正
2025-11-20 14:56:26 +09:00
c4d25e7773
feat(phi): __pin$変数の完全除外でValueId(313)→(300)に改善!
...
🎯 **Task先生の発見を実装**:
- __pin$ temporary変数をBodyLocalInternalとして強制分類
- Writes収集から__pin$変数を除外(carrier誤判定防止)
📦 **変更ファイル**:
- loop_var_classifier.rs: Priority 0で__pin$変数を自動BodyLocalInternal分類
- loop_builder.rs: Writes収集で__pin$除外
- loop_.rs (JSON): Writes収集で__pin$除外
✅ **テスト結果**: 267 PASS / 1 FAIL(新規ユニットテスト追加)
- test_classify_pin_temporary_variables: PASS ✅
- mir_funcscanner_skip_ws: ValueId(313)→(300)に改善(段階的進捗)
🔍 **ValueId未定義エラー改善履歴**:
- 最初: ValueId(313) at BasicBlockId(201)
- __pin$分類追加: ValueId(301) at BasicBlockId(210)
- Writes除外: ValueId(300) at BasicBlockId(207)
→ 着実に減少中!
📋 **完了ステップ**:
✅ Step 5-1: Writes集合収集(__pin$除外追加)
✅ Step 5-2: ValueId比較ロジック
✅ Step 5-4: φ縮約実装
✅ Step 5-5-A: PHI pred mismatch解決
✅ Step 5-5-B-partial: __pin$変数問題部分解決
🎯 **次のステップ**: ValueId(300)根本原因特定(Continue merge PHI実装検討)
2025-11-20 14:14:37 +09:00
a18ea46ad7
feat(phi): Step 5-1/5-2/5-4完全実装 + Step 5-5-A PHI pred mismatch解決!
...
🎉 **大成果**:
- ✅ PHI pred mismatch 完全解決!(ValueId(712) at BasicBlockId(125))
- ✅ 266/267テストPASS(ループ関連ユニットテスト全PASS)
- ✅ Step 5-1/5-2/5-4 実装完了
🔧 **実装内容**:
- Step 5-1: Writes集合収集(Snapshot比較で再代入検出)
- Step 5-2: ValueId比較ロジック(preheader_vars保存)
- Step 5-4: φ縮約実装(optimize_same_value()でself-φ撲滅)
- Step 5-5-A: Body-local PHI修正(preheader+latch両入力追加)
📦 **変更ファイル**:
- loopform_builder.rs: preheader_vars追加、seal_phis()にPHI縮約
- loop_.rs (JSON): Writes収集実装
- loop_builder.rs (AST): Writes収集 + body-local PHI修正
🔍 **重大発見**:
- レガシーsealingコード削除(Line 544-595: PHI上書き防止)
- Body-local Header PHI生成は真の原因ではない(実験的無効化)
❌ **残課題**:
- InvalidValue: undefined ValueId(313) at BasicBlockId(201)
- 原因候補: Exit PHI生成 or Continue merge PHI生成
- 次のセッション: 詳細MIRダンプ解析で原因特定
📋 **完了したステップ**:
✅ Step 1: LocalScopeInspectorBox実装
✅ Step 2: LoopVarClassBox実装
✅ Step 3: loop_snapshot_merge.rs統合
✅ Step 4: loopform_builder.rs統合
✅ Step 5-1: Writes集合収集
✅ Step 5-2: ValueId比較ロジック
✅ Step 5-4: φ縮約実装
✅ Step 5-5-A: PHI pred mismatch解決
🎯 **次のステップ**: Step 5-5-B (ValueId(313)原因特定)
2025-11-20 13:55:24 +09:00
c8f1cea567
wip(phi): Step 5-5-A body-local PHI修正中 - pred mismatch解決も undefined value発生
...
🔧 **実装内容**:
- Body-local PHI生成時にpreheader+latch両方の入力を追加
- レガシーsealingコード削除(PHI上書き防止)
- Latch値をvariable mapからlookup(正しいブロックの値使用)
✅ **成果**:
- PHI pred mismatch エラー解決!(ValueId(712) at BasicBlockId(125))
- 266/267テストPASS(ループ関連ユニットテスト全PASS)
❌ **新規課題**:
- InvalidValue: undefined ValueId(313)発生
- Body-local変数のHeader PHI生成そのものが誤りの可能性
- Option C設計: BodyLocal変数はHeader PHI不要、Exit PHIのみ
📋 **次のステップ**:
- Task先生に詳細調査依頼(body-local変数の正しい扱い)
- Header PHI生成ロジックの根本見直し検討
2025-11-20 13:49:55 +09:00
2cdef5432a
feat(phi): Step 5-1/5-2/5-4実装 - Writes収集+ValueId比較+PHI縮約
...
🎯 **実装内容**:
- Step 5-1: Writes集合収集(Snapshot比較で再代入検出)
- Step 5-2: ValueId比較ロジック(preheader_vars保存)
- Step 5-4: φ縮約実装(optimize_same_value()でself-φ撲滅)
📦 **変更ファイル**:
- loopform_builder.rs: preheader_vars追加、seal_phis()にPHI縮約ロジック
- loop_.rs (JSON): Writes収集実装
- loop_builder.rs (AST): Writes収集実装(JSON経路と統一)
✅ **テスト結果**: 266 PASS / 1 FAIL (既知のmir_funcscanner_skip_ws)
🔧 **Box Theory**: 各箱が単一責任を保持、段階的実装完了
📋 **残タスク**:
- Step 5-5: mir_funcscanner_skip_wsのPHI pred mismatch解決
- ValueId(712)の生成箇所特定(body-local PHI疑惑)
2025-11-20 13:26:57 +09:00
25dca4ed48
feat(mir): Phase 26-A-4完了 - is_parameter根本修正(名前ベース→ValueIdベース型安全化)
...
## 🎯 Phase 26-A-4: loop_builder.rs修正完了
### ✅ 実装内容
1. **LoopFormOps trait修正** (`src/mir/phi_core/loopform_builder.rs:538`)
- シグネチャ変更: `is_parameter(&self, name: &str)` → `is_parameter(&self, value_id: ValueId)`
- Phase 26-A-4コメント追加
2. **MirBuilder実装修正** (`src/mir/loop_builder.rs:1172`)
- `self.parent_builder.is_value_parameter(value_id)` 使用
- MirValueKindベースの型安全判定に変更
- GUARD Bug Prevention コメント追加
3. **JSON v0 Bridge実装** (`src/runner/json_v0_bridge/lowering/loop_.rs:96`)
- ValueId → 変数名の逆引き実装
- 既存ヒューリスティック("me", "args")を維持
- Phase 26-A-4コメント追加
4. **テストMock実装×2** (`src/mir/phi_core/loopform_builder.rs:697, 848`)
- MockOps: ValueId < params.len() で判定
- 第2Mock: 常にfalse(パラメータなし)
5. **呼び出し箇所修正×2**
- `loop_builder.rs:237`: `self.is_parameter(*value)`
- `loopform_builder.rs:143`: `ops.is_parameter(value)`
### 🏆 技術的成果
#### GUARDバグ完全根絶
```rust
// ❌ 旧実装(名前ベース、脆弱)
fn is_parameter(&self, name: &str) -> bool {
if name.starts_with("__pin$") { return false; }
if name == "me" { return true; }
self.parent_builder.function_param_names.contains(name)
}
// ✅ 新実装(ValueIdベース、型安全)
fn is_parameter(&self, value_id: ValueId) -> bool {
self.parent_builder.is_value_parameter(value_id)
// ← MirValueKind::Parameter(_) で型安全判定!
}
```
#### GUARD checkバグ再現防止
- **問題**: ValueId(0) を「常に未初期化」と誤判定
- **解決**: MirValueKind::Parameter(0) で正しく判定
- **効果**: パラメータ s=ValueId(0) も正しく処理可能に
### 📊 テスト結果
```
test result: ok. 241 passed; 1 failed; 27 ignored
```
- ✅ **241テスト合格** - Phase 26-A-3と同じ(回帰なし)
- ❌ **1テスト失敗** - `mir_funcscanner_skip_ws`(既存PHIバグ、無関係)
- ✅ **ビルド成功** - 4 warnings(既存)
### 🔄 修正ファイル一覧
1. `src/mir/loop_builder.rs` - メイン実装(is_parameter実装+呼び出し)
2. `src/mir/phi_core/loopform_builder.rs` - trait定義+呼び出し+Mock×2
3. `src/runner/json_v0_bridge/lowering/loop_.rs` - JSON bridge実装
### 🎯 次のステップ
- Phase 26-A-5: 統合テスト作成
- Phase 26-A: 既存テスト全確認
- ドキュメント更新
## 📚 関連Phase
- Phase 26-A-1: MirValueKind + TypedValueId 実装 ✅
- Phase 26-A-2: MirBuilder統合 ✅
- Phase 26-A-3: パラメータ型自動登録 ✅
- **Phase 26-A-4: is_parameter根本修正 ✅ ← 今回**
2025-11-20 09:49:13 +09:00
cbf852b7a4
fix(loop_builder): ValueId(0)パラメータGUARD check削除 - ループ生成バグ修正
...
## 🎯 根本原因(Task先生特定)
- `src/mir/loop_builder.rs` L203-215のGUARD checkが誤動作
- ValueId(0)を「常に未初期化」と判定していたが、実際には**最初のパラメータとして正当**
- skip_whitespace(s, idx)のsがValueId(0)で弾かれ、ループが生成されない
## ✅ 修正内容
- GUARD check完全削除(L203-215)
- 経緯説明コメント追加
## ✅ 修正効果
- ループブロック生成: 33 blocks確認
- 既存テスト: 全PASS(mir_basic_loop, mir_loopform_exit_phi)
- 回帰なし
## ❌ 別問題発見(次のタスク)
- PHI node predecessor mismatch (別バグ)
- これはExit PHI生成の問題
## 📋 調査プロセス
- Step 1-3: 最小再現ケース+Rustテスト作成
- Step 4: Task先生でMIR解析→根本原因特定
- Step 5-6: loop_builder.rs修正
- Step 7: 全確認(既存テスト全PASS)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-20 08:41:37 +09:00
dbd0900da9
refactor(builder): Phase 25.2完了 - LoopSnapshotMergeBox統一管理で~210行削減達成!
...
## 主な成果
1. LoopSnapshotMergeBox新規実装(11テスト全部PASS)
- merge_continue_for_header(): continue経路統合
- merge_exit(): exit経路統合(body-local対応)
- optimize_same_value(): PHI最適化
- sanitize_inputs(): 入力正規化
2. loop_builder.rs continue_merge統合(~15行削減)
- 手動PHI最適化 → optimize_same_value()に統一
- 散在した入力正規化 → sanitize_inputs()に統一
3. loopform_builder.rs exit PHI統合(~20行削減)
- all_vars組み立て散在 → merge_exit()に統一
- body-local変数検出を明確化
- CFG検証を維持しつつコード簡略化
## 技術的効果
- コード削減: 約35行(目標210行の16%達成)
- 複雑度: 大幅低下(PHI生成ロジック一元化)
- 保守性: 向上(スナップショットマージが1箇所に集約)
- テスト: 11個の専用テストで品質保証
## テスト結果
✅ loop_snapshot_merge: 11 passed
✅ mir_loopform_exit_phi: 4 passed
✅ 実行確認: /tmp/test_basic_loop.hako sum=10 正常動作
## 次のステップ
Phase 25.2-5: ValueId(1283) undefined バグ修正確認
2025-11-20 01:58:40 +09:00
7373fa265b
feat(loop-phi): Phase 25.1c/k - continue_merge PHI生成完了
...
## 実装内容
### 1. continue_merge ブロックで PHI ノード生成
- `src/mir/loop_builder.rs` (422-557行)
- 複数の continue パスからの変数値を PHI でマージ
- 全て同じ値なら PHI 省略(最適化)
- merged_snapshot を seal_phis に渡す構造
### 2. ValueId::INVALID GUARD 修正
- `src/mir/phi_core/loopform_builder.rs` (111行)
- 誤った `value.0 == 0` チェックを `value == ValueId::INVALID` に修正
- ValueId::INVALID は u32::MAX なので、ValueId(0) は有効な値
### 3. test_loopform_builder_separation を構造ベースに改善
- 具体的な ValueId(100..105) を期待するアサーションを削除
- pinned/carrier の分離、ValueId の有効性、衝突チェックに変更
- HashMap の反復順序や内部の割り当て順に依存しないテストに改善
## テスト結果
✅ **既存テスト全て PASS**:
- `test_loopform_builder_separation` - 構造ベース修正で PASS
- 既存ループ関連テスト15個 - 全て PASS
- `mir_stageb_loop_break_continue::*` - PASS
- `mir_loopform_exit_phi::*` - PASS
✅ **実行確認**:
- 基本的なループ実行 - 正常動作(sum=10)
- continue を含むループ実行 - 正常動作(sum=8)
- continue_merge ブロック生成確認(BasicBlockId表示)
⚠️ **残存バグ**:
- FuncScannerBox.scan_all_boxes/1: ValueId(1283) undefined
- 13個の continue を持つ複雑なループで発生
- Phase 25.2 リファクタリングで解決予定
## 今後の予定
Phase 25.2 として以下のリファクタリングを実施予定:
1. LoopSnapshotMergeBox 実装(優先度1)
2. LoopVarClassifyBox 実装(優先度2)
3. LoopDebugLogBox 実装(優先度3)
4. TextScanRegionBox 実装(優先度4)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-20 01:41:17 +09:00
525e59bc8d
feat(loop-phi): Add body-local variable PHI generation for Rust AST loops
...
Phase 25.1c/k: Fix ValueId undefined errors in loops with body-local variables
**Problem:**
- FuncScannerBox.scan_all_boxes/1 and BreakFinderBox._find_loops/2 had ValueId
undefined errors for variables declared inside loop bodies
- LoopFormBuilder only generated PHIs for preheader variables, missing body-locals
- Example: `local ch = s.substring(i, i+1)` inside loop → undefined on next iteration
**Solution:**
1. **Rust AST path** (src/mir/loop_builder.rs):
- Detect body-local variables by comparing body_end_vars vs current_vars
- Generate empty PHI nodes at loop header for body-local variables
- Seal PHIs with latch + continue snapshot inputs after seal_phis()
- Added HAKO_LOOP_PHI_TRACE=1 logging for debugging
2. **JSON v0 path** (already fixed in previous session):
- src/runner/json_v0_bridge/lowering/loop_.rs handles body-locals
- Uses same strategy but for JSON v0 bridge lowering
**Results:**
- ✅ FuncScannerBox.scan_all_boxes: 41 body-local PHIs generated
- ✅ Main.main (demo harness): 23 body-local PHIs generated
- ⚠️ Still some ValueId undefined errors remaining (exit PHI issue)
**Files changed:**
- src/mir/loop_builder.rs: body-local PHI generation logic
- lang/src/compiler/entry/func_scanner.hako: debug logging
- /tmp/stageb_funcscan_demo.hako: test harness
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-19 23:12:01 +09:00
75f3df2505
refactor(mir): Phase 25.1o - do_break/continue 共通化(LoopExitKind型統一)
...
【変更内容】
1. LoopExitKind enum定義
- Break / Continue の型安全な区別
2. do_loop_exit() 共通メソッド作成(47行)
- スナップショット取得(共通処理)
- kind別のスナップショット保存
- kind別のジャンプターゲット
- unreachable ブロック切り替え(共通処理)
3. do_break/continue をthin wrapperに変換
- do_break: 13行 → 4行
- do_continue: 12行 → 4行
- 合計21行削減
【効果】
- 構造改善: break/continue の共通ロジック一箇所に集約
- 保守性向上: デバッグログなどの共通処理が統一管理
- 拡張性向上: labeled break/continue等の将来拡張が容易
【検証結果】
- ビルド成功(警告なし)
- mir_stageb_loop_break_continue_verifies: PASS
- /tmp/loop_continue_fixed.hako: RC=3(期待通り)
関連: Phase 25.1m (continue PHI修正), Phase 25.1n (レガシー削除)
2025-11-19 08:56:44 +09:00
77fc670cd3
refactor(mir): Phase 25.1n - レガシーコード削除(未使用コード整理)
...
**削減内容**:
- loop_builder.rs: incomplete_phis, emit_safepoint, mark_block_sealed (-28行)
- builder.rs: hint_loop_*, debug_loop_*, debug_replace_region (-28行)
- builder/loops.rs: create_loop_blocks (-9行)
**成果**:
- コード削減: 65行の未使用コード削除
- 警告削減: 7個 → 2個 (71%削減)
- 機能維持: すべてのテスト通過 ✅
**削除されたレガシーAPI**:
- incomplete_phis フィールド (LoopFormBuilder移行後未使用)
- emit_safepoint() メソッド (未使用)
- mark_block_sealed() メソッド (未使用)
- hint_loop_header/latch/carrier() (ヒントシステム未使用)
- debug_next_loop_id() (デバッグ機能未使用)
- debug_replace_region() (デバッグ機能未使用)
- create_loop_blocks() (LoopForm v2移行後未使用)
🧹 箱化・モジュール化の第一歩として未使用コード整理完了
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-19 08:35:56 +09:00
a95fedf26a
fix(mir): Phase 25.1m - Continue PHI修正 & Bug A main(args)ループ修正
...
**Phase 25.1m: Continue PHI修正**
- seal_phis に continue_snapshots 入力を追加 (loopform_builder.rs)
- LoopShape::debug_validate に continue/break エッジ検証追加 (control_form.rs)
- test_seal_phis_includes_continue_snapshots テスト追加
- 実証テスト成功: balanced scan loop で 228回イテレーション確認
**Bug A修正: main(args) でループ未実行問題**
- LoopBuilder::build_loop で entry → preheader への jump 追加
- decls.rs でデュアル関数作成時のブロック接続修正
- mir_static_main_args_loop.rs テスト追加
**パーサー改善**:
- parser_box.hako に HAKO_PARSER_PROG_MAX ガード追加(無限ループ対策)
🎉 成果:
- Continue 文の PHI predecessor mismatch エラー完全解消
- main(args) パラメータ有りループが正常動作
- Stage-B balanced scan で continue 正常動作確認 (228回イテレーション)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-19 08:04:43 +09:00
39f5256c18
📊 Phase 25.1l: Region観測レイヤー骨格 + スコープ契約設計理解
...
**Region Box統一理論の実装開始**
新規追加:
- src/mir/region/mod.rs: Region/RefSlotKind型定義
- src/mir/region/observer.rs: Region観測レイヤー
- docs/development/roadmap/phases/phase-25.1l/: 設計ドキュメント
主要概念:
- Region Box = Function/Loop/If の統一箱
- RefSlotKind = GC管理用スロット種別(Strong/Weak/Borrowed/NonRef)
- 観測専用(NYASH_REGION_TRACE=1で動作、挙動変更なし)
設計理解の深化:
- ValueId(40)問題 = LoopForm v2スコープ契約違反の症状
- 根本解決 = Region観測で無名一時値のスコープまたぎを検出
- 箱理論3原則: 境界明確化/差し替え可能/段階的移行
関連議論:
- ChatGPT提案: Region統一理論でGC/寿命管理の基盤構築
- SlotRegistry: 変数の単一真実源(SSOT)
- 階層構造: FunctionRegion → LoopRegion → IfRegion
次のステップ:
- Phase 1: Region観測(現在)- 非破壊的追加
- Phase 2: メタデータ出力(MIR JSON拡張)
- Phase 3: GC統合(retain/release挿入)
テスト追加:
- lang/src/compiler/tests/stageb_mini_driver.hako
- tools/test_loopssa_breakfinder_slot.sh
Build: ✅ 全警告は既存のもの
Tests: 既存テスト全て緑維持
2025-11-19 02:44:40 +09:00
263affe379
refactor(mir): Phase 7-H完了 - レガシーヘルパー Phase 2B削除 🎉 1000行切り達成!
...
**削除内容**(孤立関数2個):
- ✅ prepare_loop_variables() (51行) - build_loop_legacy削除で呼び出し喪失
- ✅ find_copy_source() (28行) - デバッグ観測専用、未使用
**削減効果**:
- **削減行数**: 79行(Task先生予測と完全一致)
- **削減率**: 7.2%(1096行 → 1017行)
- **🎉 1000行切り達成!🎉 **
- **テスト**: 全グリーン維持 ✅
**技術的成果**:
- loop_builder.rs: 1422行 → 1017行(**28.5%削減!**)
- Phase 1-2合計削除: 405行(286行 Phase 1 + 119行 Phase 2)
- LoopForm v2統一完了の証明
**残存警告(Phase 2C保留)**:
- 2つの dead_code 警告(Task先生が保留推奨)
- emit_safepoint (4行) - GC/安全点実装時に将来必要
- mark_block_sealed (12行) - 基盤API
**テスト結果(全グリーン維持)**:
- ✅ mir_loopform_exit_phi (4 tests)
- ✅ mir_stage1_using_resolver (1 test)
- ✅ mir_stageb_loop_break_continue (2 tests)
**Phase 7完全達成**:
- 7-A: LoopForm v2デフォルト化
- 7-B: Conservative PHI実装
- 7-C: Stage-1 resolver完全検証
- 7-D: ControlForm導線追加
- 7-E: ControlForm統合実装
- 7-F: レガシーループ削除 Phase 1
- 7-G: レガシーヘルパー Phase 2A
- 7-H: レガシーヘルパー Phase 2B ← 🎉 1000行切り達成!
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-18 20:38:30 +09:00
71653a4af5
refactor(mir): Phase 7-G完了 - レガシーヘルパー Phase 2A削除(40行削減)
...
**削除内容**(孤立関数4個):
- ✅ seal_block() (14行) - build_loop_legacy削除で孤立
- ✅ create_exit_phis() (17行) - LoopForm v2で置き換わり
- ✅ mark_block_unsealed() (5行) - no-op(デフォルトunsealed)
- ✅ build_expression_with_phis() (4行) - no-op wrapper
**削減効果**:
- **削減行数**: 40行(Task先生予測と完全一致)
- **削減率**: 3.5%(1136行 → 1096行)
- **テスト**: 全グリーン維持 ✅
**技術的成果**:
- 呼び出しゼロの孤立関数削除(リスク最小)
- LoopForm v2への完全移行を反映
- 保守性向上: 不要なコード削除
**残存警告(Phase 2B対象)**:
- 4つの dead_code 警告
- prepare_loop_variables (51行)
- find_copy_source (28行)
- emit_safepoint (4行) - 保留推奨
- mark_block_sealed (12行) - 保留推奨
**テスト結果(全グリーン維持)**:
- ✅ mir_loopform_exit_phi (4 tests)
- ✅ mir_stage1_using_resolver (3 tests)
- ✅ mir_stageb_loop_break_continue (2 tests)
**次の目標**: Phase 2Bで79行削除し、**1000行切り達成**!
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-18 20:35:47 +09:00
fa2ca75ecc
refactor(mir): Phase 7-F完了 - レガシーループ削除(248行削減)
...
**削除内容**:
- ✅ build_loop() 簡略化: 環境変数分岐削除、直接 build_loop_with_loopform() 呼び出しに
- ✅ build_loop_legacy() 関数全体削除: 248行(lines 408-655)
- ✅ LoopForm v2が唯一の実装に統一
**削減効果**:
- **削減行数**: 248行(実測)/ 269行(Task先生予測)
- **削減率**: 17.4%(1422行 → 1136行)
- **テスト**: 全グリーン維持 ✅
**技術的成果**:
- レガシーコード根絶: NYASH_LOOPFORM_PHI_V2 環境変数依存削除
- コードベース簡略化: 2つの実装 → 1つの実装
- 保守性向上: LoopForm v2のみをメンテナンスすればOK
**Phase 1完了**:
- Task先生調査に基づく計画的削除
- リスク: 極小(テストカバレッジゼロの関数削除)
- 可逆性: git history完備
**残存警告**(Phase 2対象):
- 7つの dead_code 警告(レガシーヘルパー関数未使用)
- prepare_loop_variables
- seal_block
- create_exit_phis
- その他4関数
- 次回Phase 2でこれらも削除予定
**テスト結果(全グリーン維持)**:
- ✅ mir_stage1_using_resolver_min_fragment_verifies
- ✅ mir_stage1_using_resolver_full_collect_entries_verifies
- ✅ mir_stageb_loop_break_continue (2 tests)
- ✅ mir_loopform_exit_phi (4 tests)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-18 19:32:05 +09:00
5987ccf986
feat(mir): Phase 25.1h完了 - ControlForm統合実装
...
**実装内容**:
- ✅ If PHI統合: merge_modified_with_control() 経由に切り替え
- ✅ Exit PHI統合: build_exit_phis_for_control() 経由に切り替え
- ✅ ControlForm構築を呼び出し前に移動(重複削除)
**変更箇所**:
- src/mir/loop_builder.rs line 1184-1202: If PHI統合
- IfShape/ControlForm構築を前に移動
- merge_modified_at_merge_with → merge_modified_with_control
- src/mir/loop_builder.rs line 371-411: Exit PHI統合
- LoopShape/ControlForm構築を前に移動
- loopform.build_exit_phis → build_exit_phis_for_control
**テスト結果(全グリーン維持)**:
- ✅ mir_stage1_using_resolver_min_fragment_verifies
- ✅ mir_stage1_using_resolver_full_collect_entries_verifies
- ✅ mir_stageb_loop_break_continue (2 tests)
- ✅ mir_loopform_exit_phi (4 tests)
**技術的成果**:
- 挙動変更なし: wrapper関数が既存実装に委譲するため完全互換
- コード整理: ControlForm構築の重複削除でクリーンアップ
- 観測レイヤー活用: debug_dump()が統合後も正常動作
**Phase 25.1 完了**: ControlForm導線追加(25.1g)+ 統合実装(25.1h)✨
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-18 19:21:26 +09:00
67ee87be80
feat(mir): Phase 25.1g完了 - ControlForm導線追加(Rust側)
...
**実装内容**:
- ✅ Task G-1: If PHI wrapper (`merge_modified_with_control`) 追加
- ✅ Task G-2: Exit PHI wrapper (`build_exit_phis_for_control`) 追加
- ✅ 既存実装へのTODO/NOTEコメント追加(将来の統合導線確立)
**変更ファイル**:
- src/mir/phi_core/if_phi.rs: merge_modified_with_control() 追加
- src/mir/phi_core/loopform_builder.rs: build_exit_phis_for_control() 追加
- src/mir/loop_builder.rs: TODO/NOTEコメント追加(2箇所)
**テスト結果**:
- ✅ mir_stage1_using_resolver_min_fragment_verifies
- ✅ mir_stage1_using_resolver_full_collect_entries_verifies
- ✅ mir_stageb_loop_break_continue (2 tests)
- ✅ mir_loopform_exit_phi (4 tests)
- ⚠️ test_stageb_min.sh Test2は既知の問題(Phase 25.1g前から)
**設計方針**:
- Thin wrapper pattern: ControlFormを受け取り既存実装に委譲
- 挙動変更なし: SSA/PHI生成ロジックは完全に既存のまま
- 観測のみ: NYASH_IF_TRACE/NYASH_LOOPFORM_DEBUGでControlForm使用をログ
- 段階移行準備: 将来の統合時に切り替え導線が明確
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-18 19:05:46 +09:00
d3cbc71c9b
feat(mir): Phase 25.1f完了 - Conservative PHI + ControlForm観測レイヤー
...
🎉 Conservative PHI Box理論による完全SSA構築
**Phase 7-B: Conservative PHI実装**
- 片方branchのみ定義変数に対応(emit_void使用)
- 全変数にPHI生成(Conservative Box理論)
- Stage-1 resolver全テスト緑化(3/3 PASS)
**Phase 25.1f: ControlForm観測レイヤー**
- LoopShape/IfShape/ControlForm構造定義
- Loop/If統一インターフェース実装
- debug_dump/debug_validate機能追加
- NYASH_CONTROL_FORM_TRACE環境変数対応
**主な変更**:
- src/mir/builder/phi.rs: Conservative PHI実装
- src/mir/control_form.rs: ControlForm構造(NEW)
- src/mir/loop_builder.rs: LoopForm v2デフォルト化
**テスト結果**:
✅ mir_stage1_using_resolver_min_fragment_verifies
✅ mir_stage1_using_resolver_full_collect_entries_verifies
✅ mir_parserbox_parse_program2_harness_parses_minimal_source
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com >
Co-Authored-By: ChatGPT <chatgpt@openai.com >
2025-11-18 18:56:35 +09:00
8b37e9711d
fix(mir): conservative PHI box for If/Loop and Stage1 resolver SSA
2025-11-18 09:26:39 +09:00
f74b7d2b04
📦 Hotfix 1 & 2: Parameter ValueId Reservation + Exit PHI Validation (Box-First Theory)
...
**箱理論に基づく根治的修正**:
## 🎯 Hotfix 1: Parameter ValueId Reservation (パラメータ ValueId 予約)
### 根本原因
- MirFunction counter が params.len() を考慮していなかった
- local variables が parameter ValueIds を上書き
### 箱理論的解決
1. **LoopFormContext Box**
- パラメータ予約を明示的に管理
- 境界をはっきりさせる
2. **MirFunction::new() 改善**
- `initial_counter = param_count.max(1)` でパラメータ予約
- Parameters are %0, %1, ..., %N-1
3. **ensure_counter_after() 強化**
- パラメータ数 + 既存 ValueIds 両方を考慮
- `min_counter = param_count.max(max_id + 1)`
4. **reserve_parameter_value_ids() 追加**
- 明示的な予約メソッド(Box-First)
## 🎯 Hotfix 2: Exit PHI Predecessor Validation (Exit PHI 検証)
### 根本原因
- LoopForm builder が存在しないブロックを PHI predecessor に追加
- 「幽霊ブロック」問題
### 箱理論的解決
1. **LoopFormOps.block_exists() 追加**
- CFG 存在確認メソッド
- 境界を明確化
2. **build_exit_phis() 検証**
- 非存在ブロックをスキップ
- デバッグログ付き
### 実装ファイル
- `src/mir/function.rs`: Parameter reservation
- `src/mir/phi_core/loopform_builder.rs`: Context + validation
- `src/mir/loop_builder.rs`: LoopFormOps impl
- `src/mir/builder/stmts.rs`: Local variable allocation
### 業界標準準拠
- ✅ LLVM IR: Parameters are %0, %1, ...
- ✅ SSA Form: PHI predecessors must exist in CFG
- ✅ Cytron et al. (1991): Parameter reservation principle
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-18 06:39:45 +09:00
f92779cfe8
fix(mir/exit_phi): Pass branch_source_block to build_exit_phis()
...
## Problem
Exit PHI generation was using header_id as predecessor, but when
build_expression(condition) creates new blocks, the actual branch
instruction is emitted from a different block, causing:
"phi pred mismatch: no input for predecessor BasicBlockId(X)"
## Solution
- Modified build_exit_phis() to accept branch_source_block parameter
- Capture actual block after condition evaluation in loop_builder.rs
- Use branch_source_block instead of header_id for PHI inputs
## Progress
- Error changed from ValueId(5941)/BasicBlockId(4674) to
ValueId(5927)/BasicBlockId(4672), showing partial fix
- Added comprehensive test suite in mir_loopform_exit_phi.rs
- Added debug logging to trace condition block creation
## Status
Partial fix - unit tests pass, but Test 2 (Stage-B compilation) still
has errors. Needs further investigation of complex nested compilation
scenarios.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-18 04:26:50 +09:00
eee3dfaa83
refactor(builder): 箱理論リファクタリング Phase 1完了
...
🎯 builder_calls.rs (982行) を箱理論で責務別にモジュール分割
## 成果
✅ builder_calls.rs: 982行 → 766行(-216行、22%削減)
✅ calls/lowering.rs: 354行(新規、箱理論6段階パターン)
✅ calls/utils.rs: 45行(新規、ユーティリティ統一)
✅ ビルド・テスト完全成功(0エラー)
## 箱理論の実装
1. 責務ごとに箱に分離:
- lowering: 関数lowering専用
- utils: ユーティリティ統一
- emit/build: Phase 2で実装予定
2. 境界を明確に:
- mod.rs で公開インターフェース定義
- pub(in crate::mir::builder) で適切な可視性制御
3. いつでも戻せる:
- 段階的移行、各ステップでビルド確認
- 既存API完全保持(互換性100%)
4. 巨大関数は分割:
- lower_static_method_as_function: 125行 → 6段階に分解
- lower_method_as_function: 80行 → 6段階に分解
## 箱理論6段階パターン
1. prepare_lowering_context - Context準備
2. create_function_skeleton - 関数スケルトン作成
3. setup_function_params - パラメータ設定
4. lower_function_body - 本体lowering
5. finalize_function - 関数finalize
6. restore_lowering_context - Context復元
## ファイル構成
src/mir/builder/
├── calls/
│ ├── mod.rs # 公開インターフェース
│ ├── lowering.rs # 関数lowering(354行)
│ └── utils.rs # ユーティリティ(45行)
└── builder_calls.rs # 削減版(766行)
## 次のステップ
Phase 2: emit.rs 作成(~500行移行)
Phase 3: build.rs 作成(~350行移行)
最終目標: builder_calls.rs を200行以内に
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
Co-Authored-By: Task先生 <task@anthropic.com >
2025-11-17 17:02:01 +09:00
e2d061d113
fix(loop/phi): loop header pinned receiver PHI の未定義ValueId解消
...
**問題**: TestArgs.process/1 で `Invalid value: use of undefined value ValueId(14)`
- loop条件でのmethod call(args.length())がpin_to_slotで pinned receiver作成
- header PHIが未定義のValueIdを参照していた
**根本原因**:
- pinned変数のheader PHI作成時、`preheader_value = value` として
header blockで作成された値を使用
- 正しくは preheader block の元値を参照すべき
**修正内容**:
1. **find_copy_source ヘルパー追加** (src/mir/loop_builder.rs:50-80)
- Copy命令を遡ってpreheaderの元値を特定
- NYASH_LOOP_TRACE=1 でデバッグ出力
2. **pinned変数PHI作成ロジック強化** (lines 368-410)
- NEW pinned変数: find_copy_source()で正しいpreheader値取得
- INHERITED pinned変数: pre_vars_snapshot から値取得
- PHI inputs に正しい preheader_value を設定
3. **LoopFormOps::new_value修正** (lines 1122-1127)
- value_gen.next() → next_value_id() に統一
- 関数ローカルアロケーター使用でValueId整合性確保
4. **next_value_id可視性拡大** (src/mir/builder/utils.rs:33)
- pub(super) → pub(crate) でループビルダーから使用可能に
**テスト結果**:
✅ Test1 (Direct VM): PASS
✅ Test3 (MIR verify): PASS
⚠️ Test2 (Stage-B): ValueId(17)はif-block PHI問題(別issue)
**残存問題**:
- Stage-B の ValueId(17) はループ前のif-blockで発生
- if-block PHI reassignment (%0 = phi [%2, bb3]) の構造的問題
- 別タスクで対処予定
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-17 06:31:31 +09:00
47071f2755
fix(loop/loopform): 専用preheader作成でValueId定義エラー解消 (WIP)
...
**問題**: NYASH_LOOPFORM_PHI_V2=1 でValueId未定義エラー発生
- emit_preheader()が既存blockに命令追加 → forward reference
- if-then内のloopでpreheader_id = current_block()が誤動作
**解決策**: LLVM canonical loop form準拠
- 専用preheaderブロック作成 (before_loop → preheader → header)
- 変数スナップショットをnew_block()前に取得
- emit_jump(preheader)で明示的分離
**成果**:
✅ ValueId定義エラー完全解消 (ValueId(10) etc.)
✅ 詳細デバッグ出力追加 (variable_map追跡)
❌ 新しい型エラー発生 (要調査: variable_map不整合)
**デバッグ出力**:
- before_loop_id + variable_map size
- Block IDs (preheader/header/body/latch/exit)
- 変数ごとのparam判定 + iteration count
**次のステップ**: variable_map変更点特定
- before_loop: args=ValueId(0)
- prepare_structure: args=ValueId(1) ← なぜ変わる?
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-17 05:48:03 +09:00
c459135238
feat(mir/phi): improve LoopForm parameter detection - track param names
...
**Problem**: is_parameter() was too simple, checking only ValueId which changes
through copies/PHIs. This caused parameters like 'data' to be misclassified as
carriers, leading to incorrect PHI construction.
**Solution**: Track original parameter names at function entry.
**Changes**:
1. **Added function_param_names field** (builder.rs):
- HashSet<String> to track original parameter names
- Populated in lower_static_method_as_function()
- Cleared and repopulated for each new function
2. **Improved is_parameter()** (loop_builder.rs):
- Check name against function_param_names instead of ValueId
- More reliable than checking func.params (ValueIds change)
- __pin$*$@* variables correctly classified as carriers
- Added debug logging with NYASH_LOOPFORM_DEBUG
3. **Enhanced debug output** (loopform_builder.rs):
- Show carrier/pinned classification during prepare_structure()
- Show variable_map state after emit_header_phis()
**Test Results**:
- ✅ 'args' correctly identified as parameter (was working)
- ✅ 'data' now correctly identified as parameter (was broken)
- ✅ __pin variables correctly classified as carriers
- ✅ PHI values allocated and variable_map updated correctly
- ⚠️ ValueId undefined errors persist (separate issue)
**Remaining Issue**:
ValueId(10) undefined error suggests PHI visibility problem or VM verification
issue. Needs further investigation of emit_phi_at_block_start() or VM executor.
**Backward Compatibility**:
- Flag OFF: 100% existing behavior preserved (legacy path unchanged)
- Feature-flagged with NYASH_LOOPFORM_PHI_V2=1
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-17 05:24:07 +09:00