3c76d8eabf
docs(phase29am): mark p0 done; add p1 seq flatten instructions
2025-12-29 16:49:05 +09:00
fd7e3fee35
docs(phase29am): coreplan step-a if/exit implementation instructions
2025-12-29 16:31:29 +09:00
9b8673207e
docs(phase29al): coreplan migration roadmap ssot
2025-12-29 16:25:34 +09:00
c53f1edf31
docs(phase29al): exitkind cleanup effect contract ssot
2025-12-29 16:21:13 +09:00
786d2f5720
docs(phase29al): effect classification ssot
2025-12-29 16:16:53 +09:00
e598712298
docs(phase29al): post-phi final form ssot
2025-12-29 16:06:14 +09:00
bf9a63c53f
docs(phase29al): ssot skeleton/feature model; planfrag freeze tag
2025-12-29 16:01:26 +09:00
14013cbe1f
phase29ak(p5): ctx-aware planner candidates; fix phase1883 routing
2025-12-29 15:50:57 +09:00
afe12ffa35
phase29ak(p4): remove pattern1 guard from single_planner
2025-12-29 15:10:08 +09:00
655b968fb4
phase29ak(p3): remove pattern8 static box filter from single_planner
2025-12-29 15:00:51 +09:00
9a686cd510
phase29ak(p2): gate pattern8 facts by static box ctx
2025-12-29 14:49:48 +09:00
fc90c74bd3
phase29ak(p1): guard pattern1 facts via planner context
2025-12-29 14:41:56 +09:00
2626deeb72
phase29ak(p0): ssot rule order + planner context plumbing
2025-12-29 14:34:34 +09:00
a91e457302
phase29aj(p10): unify single_planner planner-first shape
2025-12-29 14:26:25 +09:00
d673bd4fbd
docs(phase29aj): isolate phase286 pattern9 legacy smoke
2025-12-29 14:18:31 +09:00
57e0fdb0a0
phase29aj(p8): planner-first pattern9 accum const loop subset
2025-12-29 14:08:53 +09:00
5ba77cb62a
phase29aj(p7): planner-first pattern8 bool predicate scan subset
2025-12-29 13:57:26 +09:00
d819fe0dae
docs(phase29aj): define joinir regression gate; isolate phase143 legacy
2025-12-29 13:44:53 +09:00
d4a9969fa3
phase29aj(p5): planner-first pattern5 infinite early-exit subset
2025-12-29 13:39:30 +09:00
3a7378a747
phase29aj(p4): planner-first pattern4 continue subset
2025-12-29 13:22:55 +09:00
31e4ac8c99
phase29aj(p3): planner-first pattern3 if-phi facts subset
2025-12-29 13:06:17 +09:00
97d5d3ef77
phase29aj(p2): planner-first pattern1 simplewhile subset
2025-12-29 12:54:32 +09:00
ff3af90b4c
phase29aj(p1): remove legacy_rules via plan extractors
2025-12-29 12:39:15 +09:00
5988374ecf
phase29aj(p0): expose planner outcome facts for strict observability
2025-12-29 12:17:57 +09:00
2e1bb938b4
phase29ai(p15): observe pattern2 promotion hint under strict
2025-12-29 11:37:31 +09:00
19f2c6b7f6
phase29af(p0): pattern2 boundary hygiene ssot
2025-12-29 05:12:15 +09:00
a04b48416e
fix(joinir): Phase 287 P2 - Pattern6 nested loop latch overwrite fix
...
Fix infinite loop in Pattern6 (nested loop minimal) caused by main→loop_step
overwriting k_inner_exit→loop_step latch values.
Root cause: JoinIR main entry block was incorrectly treated as BackEdge,
causing it to overwrite the correct latch incoming values set by the true
back edge (k_inner_exit → loop_step).
Solution:
- Restrict latch recording to TailCallKind::BackEdge only
- Treat only MAIN's entry block as entry-like (not loop_step's entry block)
- Add debug_assert! to detect double latch set in future
Refactoring:
- Extract latch recording to latch_incoming_recorder module (SSOT)
- Add boundary.loop_header_func_name for explicit header identification
- Strengthen tail_call_classifier with is_source_entry_like parameter
Tests: apps/tests/phase1883_nested_minimal.hako → RC:9 (was infinite loop)
Smoke: 154/154 PASS, no regressions
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-27 09:39:29 +09:00
1d24e9a106
feat(joinir): Phase 286 P2.3 + Phase 287 - Pattern9 Plan化 + Router table-driven
...
## Phase 286 P2.3: Pattern9 AccumConstLoop Plan化 PoC
- DomainPlan::Pattern9AccumConstLoop 追加
- PlanNormalizer::normalize_pattern9_accum_const_loop() 実装
- PHI 2本(loop_var, acc_var)
- const/var 両方 OK(sum = sum + 1 または sum = sum + i)
- Pattern9 は Pattern1 より優先(より具体的なパターン)
- Integration test: phase286_pattern9_frag_poc PASS (return: 3)
- Regression: quick 154 PASS
## Phase 287: Router table-driven Plan extraction
- PLAN_EXTRACTORS static table で Pattern6/7/4/9/1 を統一管理
- PlanExtractorEntry/PlanExtractorVariant 構造体追加
- try_plan_extractors() で ~100行 → 3行に集約
- メンテナンス性向上(新 Pattern 追加はテーブル1行追加のみ)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-26 02:38:09 +09:00
6656098c95
docs(phase-286): P2.2 完了 + P2.3 準備中の進捗記載
...
更新内容:
- Phase 286 README に P2.2 ✅ COMPLETE セクション追加
- extractor helper化(extract_loop_increment_plan 統一)の内容
- router helper化(lower_via_plan() 追加)の内容
- 削減行数(~65行)と検証結果(quick 154 PASS, PoC 両方 PASS)
- 10-Now.md の Current Focus を Phase 286 P2.3 に更新
- P2/P2.1/P2.2 の完了を時系列記載
- Pattern9 (AccumConstLoop) を次の PoC 対象に決定
- CURRENT_TASK.md の Handoff(現状)を更新
- P2.2 COMPLETE の記載(hygiene 内容 + 成果)
- P2.3 準備中(Pattern9 PoC 準備)の1段落を追加
- pattern2-deferred.md 新規作成
- Pattern2 の複雑性(break値再接続)を説明
- 再開条件(after_bb PHI + compose::loop_ + Break wiring)を明文化
- Phase 286 P2.2 として後続タスク化
関連 issues: Phase 286 JoinIR Line Absorption
🤖 Generated with Claude Code
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com >
2025-12-26 02:03:34 +09:00
55d30c9845
docs(repl): record Phase 288.1 contract and results
...
更新内容:
- docs/reference/language/repl.md
- Phase 288.1 完了ステータスに更新
- Implementation Architecture セクション追加(AST rewrite 方式説明)
- AST Rewriter の動作フロー追加(Variable/Assignment 変換ロジック)
- ExternCall Bridge の仕組み追加(__repl.get/set → VMValue)
- Expression Detection ロジック追加(wrapper AST 判定)
- 動作例を完全に更新(全機能が動作済み)
- docs/development/current/main/phases/phase-288/README.md
- Phase 288.1 完了セクション追加
- 変更ファイル一覧(8ファイル, +592行)記録
- 確認コマンド 4種 記録(変数永続化/式表示/_変数/リセット)
- 回帰テスト結果記録(154/154 PASS)
- docs/development/current/main/10-Now.md
- "Phase 288.1 完了" に更新
- 次の候補(REPL UX 改善 / JoinIR 設計作業)を追記
- CURRENT_TASK.md
- 1段落サマリー更新(288.1 完了、次の方向性)
Phase 288.1 成果(SSOT記録):
✅ 変数永続化(session → eval bridge)
✅ 式自動表示(pure expression auto-output)
✅ _ 変数(last displayed value)
✅ Fail-Fast 未定義エラー + ヒント
✅ セッションリセット(.reset)
✅ 154/154 smoke tests PASS(file mode 不変)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-25 23:05:20 +09:00
edc7355937
refactor(joinir): unify boundary join_inputs SSOT (pattern4/6/7)
...
Apply Phase 256.8 SSOT fix to Pattern4/6/7:
- Use join_module.entry.params.clone() instead of hardcoded ValueIds
- Add fail-fast validation for params count mismatch
- Remove ValueId(0), ValueId(PARAM_MIN + k) patterns
- Clean up unused PARAM_MIN imports
This prevents entry_param_mismatch errors structurally and maintains
consistency with Pattern2/3.
Changes:
- pattern4_with_continue.rs: Lines 442-476 (SSOT extraction + validation)
- pattern6_scan_with_init.rs: Lines 447-471 (SSOT extraction + validation)
- pattern7_split_scan.rs: Lines 495-526 (SSOT extraction + validation)
All patterns now use the same SSOT principle:
1. Extract entry function (priority: join_module.entry → fallback "main")
2. Use params as SSOT: join_inputs = entry_func.params.clone()
3. Build host_inputs in expected order (pattern-specific)
4. Fail-fast validation: join_inputs.len() == host_inputs.len()
Verification:
- cargo build --release: ✅ PASS (no PARAM_MIN warnings)
- Quick profile: ✅ First FAIL still json_lint_vm (baseline maintained)
- Pattern6 smoke: ✅ PASS (index_of test)
- Pattern7 smoke: Pre-existing phi pred mismatch (not introduced by SSOT)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-20 20:05:11 +09:00
9336785680
feat(anf): Phase 146/147 - Loop/If Condition ANF with Compare support
...
## Phase 146 P0: ANF Routing SSOT Unified
**Goal**: Unify ANF routing in `lower_expr_with_scope()` L54-84, remove legacy lowering
**Changes**:
- expr_lowerer_box.rs: Added scope check (PureOnly → skip ANF, WithImpure → try ANF)
- post_if_post_k.rs: Removed legacy inline lowering (L271-285), added `lower_condition_legacy()` helper
- contract.rs: Already had `CondLoweringFailed` out-of-scope reason
**Test Results**: ✅ Phase 146 P0 smoke (exit 7), 0 regressions
## Phase 146 P1: Compare Operator Support
**Goal**: Enable ANF for condition expressions with Compare operators
**Changes**:
- joinir_dev.rs: Added `anf_allow_pure_enabled()` (HAKO_ANF_ALLOW_PURE=1)
- expr_lowerer_box.rs: PureOnly scope ANF support (L56-66)
- execute_box.rs: Compare operator support (+122 lines)
- `execute_compare_hoist()`, `execute_compare_recursive()`, `ast_compare_to_joinir()`
- Extended `normalize_and_lower()` for Compare
**Test Results**: ✅ Phase 146 P1 smoke (exit 7 with flags), 0 regressions
## Phase 147 P0: Recursive Comparison ANF
**Goal**: Extend recursive ANF to Compare operators
**Changes**:
- contract.rs: Added `AnfParentKind::Compare` variant
- plan_box.rs: Compare case in BinaryOp routing (L68-79, L134-139)
- Distinguishes Compare vs arithmetic BinaryOp
**Benefits**: Enables recursive ANF for comparisons
- `s.length() == 3` → `t = s.length(); if (t == 3)` ✅
- `s1.length() < s2.length()` → `t1 = s1.length(); t2 = s2.length(); if (t1 < t2)` ✅
## Implementation Summary
**Files Modified** (9 files, +253 lines, -25 lines = +228 net):
1. src/config/env/joinir_dev.rs (+28 lines)
2. src/mir/control_tree/normalized_shadow/anf/contract.rs (+2 lines)
3. src/mir/control_tree/normalized_shadow/anf/execute_box.rs (+122 lines)
4. src/mir/control_tree/normalized_shadow/anf/plan_box.rs (+18 lines)
5. src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs (+18 lines, -0 lines)
6. src/mir/control_tree/normalized_shadow/post_if_post_k.rs (+44 lines, -25 lines)
7. CURRENT_TASK.md
8. docs/development/current/main/10-Now.md
9. docs/development/current/main/30-Backlog.md
**Files Created** (7 files):
- apps/tests/phase146_p0_if_cond_unified_min.hako
- apps/tests/phase146_p1_if_cond_intrinsic_min.hako
- tools/smokes/.../phase146_p0_if_cond_unified_vm.sh
- tools/smokes/.../phase146_p0_if_cond_unified_llvm_exe.sh
- tools/smokes/.../phase146_p1_if_cond_intrinsic_vm.sh
- tools/smokes/.../phase146_p1_if_cond_intrinsic_llvm_exe.sh
- docs/development/current/main/phases/phase-146/README.md
**Acceptance Criteria**: ✅ All met
- cargo build --release: PASS (0 errors, 0 warnings)
- Phase 145 regressions: PASS (exit 12, 18, 5)
- Phase 146 P0: PASS (exit 7)
- Phase 146 P1: PASS (exit 7 with HAKO_ANF_ALLOW_PURE=1)
**Architecture**:
- SSOT: ANF routing only in `lower_expr_with_scope()` L54-84
- Box-First: Phase 145 `anf/` module extended
- Legacy removed: post_if_post_k.rs unified with SSOT
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-19 17:03:56 +09:00
6a3b6deb20
feat(anf): Phase 145 P0/P1/P2 - ANF (A-Normal Form) transformation
...
Implement ANF transformation for impure expressions to fix evaluation order:
Phase 145 P0 (Skeleton):
- Add anf/ module with contract/plan/execute 3-layer separation
- AnfDiagnosticTag, AnfOutOfScopeReason, AnfPlan enums
- Stub execute_box (always returns Ok(None))
- 11 unit tests pass
Phase 145 P1 (Minimal success):
- String.length() whitelist implementation
- BinaryOp + MethodCall pattern: x + s.length() → t = s.length(); result = x + t
- Exit code 12 verification (VM + LLVM EXE)
- 17 unit tests pass
Phase 145 P2 (Generalization):
- Recursive ANF for compound expressions
- Left-to-right, depth-first evaluation order
- Patterns: x + s.length() + z, s1.length() + s2.length()
- ANF strict mode (HAKO_ANF_STRICT=1)
- Diagnostic tags (joinir/anf/*)
- 21 unit tests pass, 0 regression
Also includes Phase 143 P2 (else symmetry) completion.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-19 16:19:49 +09:00
845ae70cb7
chore: Remove unused imports in normalized_shadow modules
...
Cleaned up unused imports after Phase 143 execution fix (5e662eaaf ).
**Priority files (Phase 143)**:
- if_as_last_join_k.rs: removed ValueId, BTreeMap
- loop_true_break_once.rs: added #[cfg(test)] for test-only imports
- post_if_post_k.rs: removed ValueId, BTreeMap
- normalized_helpers.rs: added #[cfg(test)] for Span
**Additional cleanup**:
- contract_checks.rs: removed BasicBlockId
- joinir/mod.rs: removed Info struct re-exports (functions kept)
- patterns/mod.rs: removed Info struct re-exports (functions kept)
- ast_feature_extractor.rs: removed EscapeSkipPatternInfo
- plan_box.rs: added #[cfg(test)] for PlanKind
**Verification**:
- 0 unused import warnings (was 20+)
- All 69 normalized_shadow tests pass
- Clean build with --release
Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-19 08:36:45 +09:00
4082abb30c
feat(normalization): Phase 142 P0 - Loop statement-level normalization
...
Phase 142-loopstmt P0: Statement-level normalization
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com >
2025-12-19 05:28:49 +09:00
f775c0fe01
docs: Phase 131 P2 DirectValue exit reconnection complete
...
Update completion status for Phase 131 P2:
- CURRENT_TASK.md: Note WSL restart resolved EXDEV issue
- 10-Now.md: Add Phase 131 P2 completion entry
- phase-131/README.md: Document P1.5 and P2 deliverables
Phase 131 Status: DONE ✅
- loop(true) break-once executes correctly
- Exit values propagate through DirectValue mode
- VM + LLVM EXE parity verified
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-18 17:48:18 +09:00
93e62b1433
docs(phase93): Phase 93 P0完了記録 & ドキュメント整理
...
## 追加
- docs/development/current/main/phases/phase-93/README.md
- Phase 93 P0 (ConditionOnly Derived Slot) 完了記録
- 実装内容・テスト結果の詳細
## 更新
- CURRENT_TASK.md: Phase 93 P0完了に伴う更新
- 10-Now.md: 現在の進捗状況更新
- 30-Backlog.md: Phase 92/93関連タスク整理
- phase-91/92関連ドキュメント: historical化・要約化
## 削減
- 735行削減(historical化により詳細をREADMEに集約)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-16 23:30:39 +09:00
568619df89
feat(mir): Phase 92 P2-2 - Body-local variable support for ConditionalStep
...
Phase 92 P2-2完了:ConditionalStepのcondition(ch == '\\'など)でbody-local変数をサポート
## 主要変更
### 1. condition_lowerer.rs拡張
- `lower_condition_to_joinir`に`body_local_env`パラメータ追加
- 変数解決優先度:ConditionEnv → LoopBodyLocalEnv
- すべての再帰ヘルパー(comparison, logical_and, logical_or, not, value_expression)対応
### 2. conditional_step_emitter.rs修正
- `emit_conditional_step_update`に`body_local_env`パラメータ追加
- condition loweringにbody-local環境を渡す
### 3. loop_with_break_minimal.rs修正
- break condition loweringをbody-local init の**後**に移動(line 411)
- header_break_lowering::lower_break_conditionにbody_local_env渡す
- emit_conditional_step_updateにbody_local_env渡す(line 620)
### 4. header_break_lowering.rs修正
- `lower_break_condition`に`body_local_env`パラメータ追加
- scope_managerにbody-local環境を渡す
### 5. 全呼び出し箇所修正
- expr_lowerer.rs (2箇所)
- method_call_lowerer.rs (2箇所)
- loop_with_if_phi_if_sum.rs (3箇所)
- loop_with_continue_minimal.rs (1箇所)
- carrier_update_emitter.rs (1箇所・legacy)
## アーキテクチャ改善
### Break Condition Lowering順序修正
旧: Header → **Break Cond** → Body-local Init
新: Header → **Body-local Init** → Break Cond
理由:break conditionが`ch == '\"'`のようにbody-local変数を参照する場合、body-local initが先に必要
### 変数解決優先度(Phase 92 P2-2)
1. ConditionEnv(ループパラメータ、captured変数)
2. LoopBodyLocalEnv(body-local変数like `ch`)
## テスト
### ビルド
✅ cargo build --release成功(30 warnings、0 errors)
### E2E
⚠️ body-local promotion問題でブロック(Phase 92範囲外)
- Pattern2はbody-local変数をcarrier promotionする必要あり
- 既存パターン(A-3 Trim, A-4 DigitPos)に`ch = get_char(i)`が該当しない
- **Phase 92 P2-2目標(condition loweringでbody-local変数サポート)は達成**
## 次タスク(Phase 92 P3以降)
- body-local variable promotion拡張(Pattern2で`ch`のような変数を扱う)
- P5b E2Eテスト完全動作確認
## Phase 92 P2-2完了
✅ Body-local変数のcondition lowering対応完了
✅ ConditionalStepでbody-local変数参照可能
✅ Break condition lowering順序修正
2025-12-16 17:08:15 +09:00
42f8f4d088
docs: Update CURRENT_TASK.md - Phase 91 planning complete
...
## P1 Status Update
- Phase 91 Step 1: ✅ COMPLETE
- Loop inventory: 34 loops across 6 files
- Pattern P5b design: Complete
- Test fixture: Created
- Capability taxonomy: Extended
- Phase 91 Step 2: NEXT (Implementation)
- detect_escape_pattern() in Canonicalizer
- Unit tests + parity verification
- No lowering in Step 2 (deferred to Step 3)
## Key Findings
- Current JoinIR readiness: 47% (16/30 loops)
- Pattern P5b unlocks: All escape sequence parsers
- Effort estimate: 2-3 days for recognition phase
## Next Priority
Phase 91 Step 2: Implement Canonicalizer recognition for P5b pattern
🤖 Generated with Claude Code
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com >
2025-12-16 14:22:55 +09:00
521e58d061
docs: mark loop canonicalizer Phase 137-141 complete
2025-12-16 07:54:33 +09:00
5edd81e373
refactor(mir): Phase 138-P1-A - loop_canonicalizer を4モジュール分割
...
## 概要
- 931行の mod.rs を 4モジュール + 161行 mod.rs に分割
- 全14テスト PASS、退行なし
## モジュール構成
- skeleton_types.rs (213行) - LoopSkeleton/SkeletonStep/UpdateKind/CarrierSlot/ExitContract
- capability_guard.rs (104行) - RoutingDecision/capability_tags
- pattern_recognizer.rs (249行) - try_extract_skip_whitespace_pattern
- canonicalizer.rs (414行) - canonicalize_loop_expr + 統合テスト
- mod.rs (161行) - 型定義と re-export
## ファイルサイズ達成
- 最大ファイル: canonicalizer.rs 414行(目標250行を一部超過するが許容範囲)
- mod.rs: 931行 → 161行 (83%削減)
- 合計: 1141行(元の931行 + tests分離で増加)
## テスト結果
- 14 tests passed
- loop_canonicalizer::* 全テスト green
2025-12-16 06:41:46 +09:00
a0009d474d
feat(mir): Loop Canonicalizer Phase 3 - skip_whitespace pattern recognition
...
## Summary
skip_whitespace パターンを Skeleton→Decision で認識可能に。
dev-only 観測で chosen=Pattern3IfPhi / missing_caps=[] を固定。
## Changes
- src/mir/loop_canonicalizer/mod.rs:
- try_extract_skip_whitespace_pattern() 追加
- loop(cond) { ... if check { p = p + 1 } else { break } } パターン認識
- carrier name, delta, body statements を抽出
- canonicalize_loop_expr() 拡張(skip_whitespace 対応)
- Pattern3IfPhi 成功時は RoutingDecision::success 返却
- Skeleton に HeaderCond, Body, Update ステップ追加
- CarrierSlot に Counter role 設定
- ExitContract に has_break=true 設定
- Phase 3 unit tests 追加
- test_skip_whitespace_pattern_recognition: 基本パターン
- test_skip_whitespace_with_body_statements: body 付きパターン
- test_skip_whitespace_fails_without_else: else なし失敗
- test_skip_whitespace_fails_with_wrong_delta: 減算パターン失敗
- Phase 2 obsolete tests 削除
- src/mir/builder/control_flow/joinir/routing.rs:
- Debug 出力拡張(chosen pattern 表示)
## Tests
- cargo test --release --lib loop_canonicalizer::tests: PASS(11 tests)
- cargo test --release --lib: PASS(1044 tests, 退行なし)
- HAKO_JOINIR_DEBUG=1 test_pattern3_skip_whitespace.hako:
- chosen=Pattern3IfPhi ✅
- missing_caps=[] ✅
## Validation
- ✅ dev-only 観測(HAKO_JOINIR_DEBUG=1)のときだけログ出力
- ✅ フラグ OFF 時は完全不変
- ✅ skip_whitespace パターンで SUCCESS 固定
- ✅ unit tests で全パターン固定
Phase 137-3 complete
2025-12-16 05:38:18 +09:00
ec1ff5b766
docs: update Phase 137-1 completion status and Phase 2 roadmap
...
## Summary
Loop Canonicalizer Phase 1(型定義)の完了と、Phase 2(dev-only 観測)への
ロードマップを記録。
## Changes
### loop-canonicalizer.md
- Status: Design (P0) → Phase 1 done(型定義まで)
- 実装の入口を明記(src/mir/loop_canonicalizer/mod.rs)
- NYASH_LOOP_ROUTING_TRACE → joinir_dev_enabled() に変更
(新 ENV を増やさず、既存のスイッチに寄せる)
### CURRENT_TASK.md
- Phase 137-1 完了を追記
- P0 を「設計」→「Phase 2(dev-only 観測)」へ更新
### phases/README.md
- Phase 137 を追加
### phases/phase-137/README.md (NEW)
- Phase 1 完了サマリ
- Phase 2 予定を最小で記録
### joinir-design-map.md / 01-JoinIR-Selfhost-INDEX.md
- loop-canonicalizer への導線を追加
## Next Steps
Phase 2: dev-only 観測の導入
- canonicalize_loop_expr() の薄い入口を追加
- joinir_dev_enabled() 配下でログ出し
- 既定挙動は完全不変
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-16 05:10:29 +09:00
84ded8ca6c
docs: add loop canonicalizer SSOT + MirBuilder entrypoint
2025-12-16 04:37:47 +09:00
455d511187
feat(mir): Phase 136 P0 - ValueId allocator SSOT 徹底(関数内経路から value_gen.next() 掃討)
...
## Summary
Eliminates remaining `value_gen.next()` calls from function-context code paths,
unifying all ValueId allocation through `MirBuilder::next_value_id()` SSOT allocator.
## Changes
### 1. Fixed `new_typed_value()` (src/mir/builder.rs:1068)
**Before**: `let id = self.value_gen.next();` (bypasses function context)
**After**: `let id = self.next_value_id();` (respects function context)
This is a public API used in function context, so must use SSOT allocator
to avoid collisions with reserved PHI dsts and function params.
### 2. Fixed test code (src/mir/builder.rs)
**test_shadowing_binding_restore** (lines 1161, 1171):
- Simulates function scope with `push_lexical_scope()`
- Changed to `builder.next_value_id()` for function scope simulation
**test_valueid_binding_parallel_allocation** (lines 1196-1216):
- Tests ValueId/BindingId independence
- Changed to `builder.next_value_id()` with note that Module context fallback preserves test intent
### 3. Verified Module context fallbacks (OK, no change needed)
These already check `current_function.is_some()` and use `value_gen.next()` only as Module context fallback:
- `src/mir/builder/utils.rs:43` - next_value_id() SSOT implementation
- `src/mir/builder/utils.rs:436` - pin_to_slot()
- `src/mir/builder/utils.rs:467` - materialize_local()
- `src/mir/utils/phi_helpers.rs:69` - insert_phi_unified()
## Verification
```bash
rg -n "value_gen\.next\(" src/mir --type rust | grep -v "Module context" | grep -v "//"
# Result: Only comments/docs remain
```
## Acceptance
✅ cargo test --release --lib - 997 passed
✅ phase135_trim_mir_verify.sh - PASS
✅ phase132_exit_phi_parity.sh - 3/3 PASS
✅ All function-context `value_gen.next()` eliminated
## Effect
- **Collision prevention**: No more ValueId collisions between function-level allocations and reserved PHI dsts
- **SSOT compliance**: All ValueId allocation flows through single allocator
- **Contract enforcement**: Phase 135 P1 contract_checks will catch violations immediately
🤖 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-15 19:37:30 +09:00
d82c332a40
feat(joinir): Phase 135 P0 - ConditionLoweringBox allocator SSOT (ValueId collision fix)
...
## Summary
Root cause: ConditionLoweringBox was bypassing ConditionContext.alloc_value (SSOT allocator),
causing ValueId collisions between JoinIR condition params and lowered instructions.
## Changes
1. **ConditionLoweringBox (expr_lowerer.rs)**: Must use ConditionContext.alloc_value
- Pass &mut ConditionContext to lower_condition (SSOT allocator)
- Eliminates internal counter usage
2. **Allocator unification (condition_lowerer.rs, method_call_lowerer.rs)**:
- Accept &mut dyn FnMut() -> ValueId as allocator parameter
- Ensures all lowering paths use same SSOT allocator
3. **Boundary Copy deduplication (joinir_inline_boundary_injector.rs)**:
- Deduplicate condition_bindings by dst
- Fail-Fast if different sources target same dst (MIR SSA violation)
4. **Trim pattern fixes (trim_loop_lowering.rs, trim_pattern_validator.rs, stmts.rs)**:
- Use builder.next_value_id() instead of value_gen.next() in function context
- Ensures function-level ValueId allocation respects reserved PHI dsts
## Acceptance
✅ ./target/release/hakorune --verify apps/tests/phase133_json_skip_whitespace_min.hako
✅ Smoke: phase135_trim_mir_verify.sh - MIR SSA validation PASS
✅ Regression: phase132_exit_phi_parity.sh - 3/3 PASS
✅ Regression: phase133_json_skip_whitespace_llvm_exe.sh - compile-only PASS
🤖 Generated with Claude Code
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com >
2025-12-15 18:49:08 +09:00
c8970bd4d4
docs: Phase 132-P3 verifier note
2025-12-15 06:08:19 +09:00
771bf6b0d1
feat(joinir): Phase 132-P3 - Exit PHI collision early detection
...
Added verify_exit_phi_no_collision() to contract_checks.rs for early detection
of ValueId collisions between exit PHIs and other instructions.
Problem detected:
- If exit_phi_builder uses builder.value_gen.next() (module-level) instead of
func.next_value_id() (function-level), ValueIds can collide:
Example:
- bb0: %1 = const 0 (counter init)
- bb3: %1 = phi ... (exit PHI - collision!)
Previous behavior:
- Error only detected at LLVM backend runtime
- Cryptic error: "Cannot overwrite PHI dst=1"
New behavior:
- Panic at Rust compile time (debug build)
- Clear error message with fix suggestion:
"Exit PHI dst %1 collides with instruction in block 0
Fix: Use func.next_value_id() in exit_phi_builder.rs"
Benefits:
- 🔥 Fail-Fast: Catch errors during Rust compilation, not LLVM execution
- 📋 Clear messages: Exact collision point + fix suggestion
- 🧪 Testable: verify_exit_phi_no_collision() can be unit tested
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-15 06:00:48 +09:00
447d4ea246
feat(llvm): Phase 132 - Pattern 1 exit value parity fix + Box-First refactoring
...
## Phase 132: Exit PHI Value Parity Fix
### Problem
Pattern 1 (Simple While) returned 0 instead of final loop variable value (3)
- VM: RC: 3 ✅ (correct)
- LLVM: Result: 0 ❌ (wrong)
### Root Cause (Two Layers)
1. **JoinIR/Boundary**: Missing exit_bindings → ExitLineReconnector not firing
2. **LLVM Python**: block_end_values snapshot dropping PHI values
### Fix
**JoinIR** (simple_while_minimal.rs):
- Jump(k_exit, [i_param]) passes exit value
**Boundary** (pattern1_minimal.rs):
- Added LoopExitBinding with carrier_name="i", role=LoopState
- Enables ExitLineReconnector to update variable_map
**LLVM** (block_lower.py):
- Use predeclared_ret_phis for reliable PHI filtering
- Protect builder.vmap PHIs from overwrites (SSOT principle)
### Result
- ✅ VM: RC: 3
- ✅ LLVM: Result: 3
- ✅ VM/LLVM parity achieved
## Phase 132-Post: Box-First Refactoring
### Rust Side
**JoinModule::require_function()** (mod.rs):
- Encapsulate function search logic
- 10 lines → 1 line (90% reduction)
- Reusable for Pattern 2-5
### Python Side
**PhiManager Box** (phi_manager.py - new):
- Centralized PHI lifecycle management
- 47 lines → 8 lines (83% reduction)
- SSOT: builder.vmap owns PHIs
- Fail-Fast: No silent overwrites
**Integration**:
- LLVMBuilder: Added phi_manager
- block_lower.py: Delegated to PhiManager
- tagging.py: Register PHIs with manager
### Documentation
**New Files**:
- docs/development/architecture/exit-phi-design.md
- docs/development/current/main/investigations/phase132-llvm-exit-phi-wrong-result.md
- docs/development/current/main/phases/phase-132/
**Updated**:
- docs/development/current/main/10-Now.md
- docs/development/current/main/phase131-3-llvm-lowering-inventory.md
### Design Principles
- Box-First: Logic encapsulated in classes/methods
- SSOT: Single Source of Truth (builder.vmap for PHIs)
- Fail-Fast: Early explicit failures, no fallbacks
- Separation of Concerns: 3-layer architecture
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-15 03:17:31 +09:00
18bf35e6d4
fix(llvm): Phase 131-10 - Smart console.log routing(Segfault修正)
...
## 問題
- Integer値をi8*ポインタに変換 → Segfault(Exit 139)
## 解決策
- String literal → nyash.console.log(i8*)
- Integer/Handle → nyash.console.log_handle(i64)
## 結果
- Case B (loop_min_while): LLVM outputs `0,1,2` ✅
- VM/LLVM完全パリティ達成
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-14 09:19:00 +09:00