04fdac42f2
feat(mir): Phase 93 P0 - ConditionOnly Derived Slot実装
...
## 概要
body-local変数を参照するbreak条件が毎イテレーション正しく再計算される
ConditionOnlyパターンを実装。
## 問題
- `is_ch_match`がConditionBindingで運ばれると初回計算値が固定
- loop header PHIで更新されず、毎周回同じ値がコピーされる
- 結果: `if ch == "b" { break }` が正しく動作しない
## 解決策 (B: ConditionOnly)
1. ConditionOnlyRecipe作成 - Derived slot再計算レシピ
2. setup_condition_env_bindings()でConditionBinding登録停止
3. Pattern2スケジュールでbody-init → break順序保証
4. break条件: ConditionOnlyでは非反転版を使用
## 変更ファイル
- condition_only_emitter.rs (NEW): Derived slot再計算ロジック
- step_schedule.rs: from_env()にhas_condition_only_recipe追加
- loop_with_break_minimal.rs: スケジュール決定でrecipe考慮
- trim_loop_lowering.rs: ConditionOnly用break条件生成追加
## テスト
- step_schedule: 6 tests PASS (新規1: condition_only_recipe_triggers_body_first)
- condition_only_emitter: 3 tests PASS
- Phase 92 baseline: 2 cases PASS
- E2E: /tmp/test_body_local_simple.hako → 出力 "1" ✓
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-16 23:24:11 +09:00
d2972c1437
feat(joinir): Phase 92完了 - ConditionalStep + body-local変数サポート
...
## Phase 92全体の成果
**Phase 92 P0-P2**: ConditionalStep JoinIR生成とbody-local変数サポート
- ConditionalStep(条件付きキャリア更新)のJoinIR生成実装
- Body-local変数(ch等)の条件式での参照サポート
- 変数解決優先度: ConditionEnv → LoopBodyLocalEnv
**Phase 92 P3**: BodyLocalPolicyBox + 安全ガード
- BodyLocalPolicyDecision実装(Accept/Reject判定)
- BodyLocalSlot + DualValueRewriter(JoinIR/MIR二重書き込み)
- Fail-Fast契約(Cannot promote LoopBodyLocal検出)
**Phase 92 P4**: E2E固定+回帰最小化 (本コミット)
- Unit test 3本追加(body-local変数解決検証)
- Integration smoke追加(phase92_pattern2_baseline.sh、2ケースPASS)
- P4-E2E-PLAN.md、P4-COMPLETION.md作成
## 主要な実装
### ConditionalStep(条件付きキャリア更新)
- `conditional_step_emitter.rs`: JoinIR Select命令生成
- `loop_with_break_minimal.rs`: ConditionalStep検出と統合
- `loop_with_continue_minimal.rs`: Pattern4対応
### Body-local変数サポート
- `condition_lowerer.rs`: body-local変数解決機能
- `lower_condition_to_joinir`: body_local_env パラメータ追加
- 変数解決優先度実装(ConditionEnv優先)
- Unit test 3本追加: 変数解決/優先度/エラー
- `header_break_lowering.rs`: break条件でbody-local変数参照
- 7ファイルで後方互換ラッパー(lower_condition_to_joinir_no_body_locals)
### Body-local Policy & Safety
- `body_local_policy.rs`: BodyLocalPolicyDecision(Accept/Reject)
- `body_local_slot.rs`: JoinIR/MIR二重書き込み
- `dual_value_rewriter.rs`: ValueId書き換えヘルパー
## テスト体制
### Unit Tests (+3)
- `test_body_local_variable_resolution`: body-local変数解決
- `test_variable_resolution_priority`: 変数解決優先度(ConditionEnv優先)
- `test_undefined_variable_error`: 未定義変数エラー
- 全7テストPASS(cargo test --release condition_lowerer::tests)
### Integration Smoke (+1)
- `phase92_pattern2_baseline.sh`:
- Case A: loop_min_while.hako (Pattern2 baseline)
- Case B: phase92_conditional_step_minimal.hako (条件付きインクリメント)
- 両ケースPASS、integration profileで発見可能
### 退行確認
- ✅ 既存Pattern2Breakテスト正常(退行なし)
- ✅ Phase 135 smoke正常(MIR検証PASS)
## アーキテクチャ設計
### 変数解決メカニズム
```rust
// Priority 1: ConditionEnv (loop params, captured)
if let Some(value_id) = env.get(name) { return Ok(value_id); }
// Priority 2: LoopBodyLocalEnv (body-local like `ch`)
if let Some(body_env) = body_local_env {
if let Some(value_id) = body_env.get(name) { return Ok(value_id); }
}
```
### Fail-Fast契約
- Delta equality check (conditional_step_emitter.rs)
- Variable resolution error messages (ConditionEnv)
- Body-local promotion rejection (BodyLocalPolicyDecision::Reject)
## ドキュメント
- `P4-E2E-PLAN.md`: 3レベルテスト戦略(Level 1-2完了、Level 3延期)
- `P4-COMPLETION.md`: Phase 92完了報告
- `README.md`: Phase 92全体のまとめ
## 将来の拡張(Phase 92スコープ外)
- Body-local promotionシステム拡張
- P5bパターン認識の汎化(flagベース条件サポート)
- 完全なP5b E2Eテスト(body-local promotion実装後)
🎯 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-16 21:37:07 +09:00
3093ac2ca4
refactor(joinir): Phase 92 P1 - 箱化モジュール化・レガシー削除
...
P1-1: ConditionalStep lowering を1箱に隔離
- 新規作成: src/mir/join_ir/lowering/common/conditional_step_emitter.rs
- emit_conditional_step_update() を carrier_update_emitter.rs から移動
- Fail-Fast 不変条件チェック追加(then_delta != else_delta)
- 副作用を減らしたクリーンなインターフェース
- 包括的なテストスイート(3テスト)
P1-0: 境界SSOTの固定
- routing.rs: skeleton 設定をrouting層から削除
- pattern2_with_break.rs: skeleton 取得をlower()内部に閉じ込め
- parity_checker から skeleton を直接取得
- skeleton の使用を Pattern2 のみに限定
P1-2: escape recognizer をSSOTに戻す
- escape_pattern_recognizer.rs: 未使用フィールド削除
- quote_char, escape_char 削除(使われていない)
- 責務を cond/delta 抽出のみに限定
- pattern_recognizer.rs: デフォルト値を使用
P1-3: E2Eテスト作成(実行は後回し)
- apps/tests/test_pattern5b_escape_minimal.hako 作成
- body-local 変数対応後に検証予定
テスト結果:
- conditional_step_emitter tests: 3 passed
- Pattern2 tests: 18 passed
- Regression: 0 failures
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-16 15:53:40 +09:00
c2f524bb26
refactor(joinir): Phase 185 code cleanup - extract shared function, remove dead code
...
- Extract infer_type_from_mir_pattern() to common.rs (was duplicated in if_select.rs & if_merge.rs)
- Remove unused JOINIR_HEADER_BYPASS_TARGETS and is_joinir_header_bypass_target() from loopform_builder.rs
- Warnings reduced: 13 → 11
Lines removed: ~45 (duplicate function + dead code)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-12-04 22:33:56 +09:00
7d0581c9a4
refactor(joinir): Extract construct_simple_while_loopform helper, delete legacy code
...
Phase 32 cleanup:
1. Delete legacy is_supported_case_a_loop function from loop_to_join.rs
- Replaced by is_supported_case_a_loop_view() in Phase 32 Step 3
2. Extract construct_simple_while_loopform helper to common.rs
- Unified LoopForm construction for simple while loops
- Parameters: entry_is_preheader (trim=true, stage1=false)
has_break (trim=true, stage1=false)
- Sets latch=body to satisfy is_simple_case_a_loop check
3. Update lowering modules to use the common helper:
- funcscanner_trim.rs: entry_is_preheader=true, has_break=true
- stage1_using_resolver.rs: entry_is_preheader=false, has_break=false
Test results: JSON snapshot 6/6 PASS, VM bridge trim 2/2 PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-26 10:15:31 +09:00
466e636af6
Span trace utilities and runner source hint
2025-11-24 14:17:02 +09:00
b7c7e48526
feat(joinir): Phase 27.14 - FuncScannerBox._append_defs JoinIR lowering完了 + コード品質改善
...
## Phase 27.14: FuncScannerBox._append_defs/2 JoinIR lowering
- **新規実装**: `funcscanner_append_defs.rs` (322行)
- Shared Builder Pattern採用
- MIR-based lowering with CFG sanity checks
- ValueId range 9000-10999 割り当て
- **テスト**: `mir_joinir_funcscanner_append_defs.rs` (3テスト)
- type_sanity, empty_module_returns_none, auto_lowering (ignored)
- **最小.hako**: `funcscanner_append_defs_minimal.hako`
## コード品質改善 (5項目完了)
1. **CFG Sanity Checks強化** (`common.rs`)
- `has_array_method()`: ArrayBox操作検出
- `has_loop_increment()`: i+1パターン検出
2. **ValueIdテスト自動化** (`value_id_ranges.rs`)
- マクロ化 + 自動overlap検証で30→15行に削減
3. **モジュール名統一確認** (作業不要、既に統一済み)
4. **Shared Builder命名統一** (`funcscanner_trim.rs`)
- `build_trim_joinir` → `build_funcscanner_trim_joinir`
5. **全テストPASS確認**
- value_id_ranges, funcscanner_trim, funcscanner_append_defs全てPASS ✅
## 効果
- CFG検証関数: 1個 → 3個 (200%↑)
- テストコード: 50%削減 (保守性向上)
- 命名一貫性: 75% → 100%
- ビルド成功率: 100%維持
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-24 05:23:26 +09:00
ff9ea58e59
refactor(joinir): Phase 27.10 - CFG sanity checks + dispatcher pattern 共通化
...
- common.rs 新規作成(162行):
- CFG sanity check helpers: ensure_entry_has_succs, has_const_int, has_const_string, has_string_method, has_binop
- Logging helper: log_fallback
- Dispatcher: dispatch_lowering
- skip_ws.rs: CFG checks (-25行) + dispatcher (-2行) = -27行削減
- funcscanner_trim.rs: CFG checks (-25行) + dispatcher (-4行) = -29行削減
- mod.rs: pub mod common 追加
設計原則:
- 軽量パターンマッチング(命令の存在確認のみ)
- Graceful degradation(予期しない構造で即座にfallback)
- DRY原則(重複コード1箇所に集約)
🎉 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-23 22:51:30 +09:00