feat(joinir): Phase 254-255 - Pattern 6 (ScanWithInit) + exit PHI DCE fix
## Phase 254: Pattern 6 (ScanWithInit) Detection & JoinIR Lowering
Pattern 6 detects index_of/find/contains-style loops:
- Loop condition: i < x.length()
- Loop body: if with method call condition + early return
- Step: i = i + 1
- Post-loop: return not-found value (-1)
Key features:
- Minimal lowering: main/loop_step/k_exit functions
- substring hoisted to init-time BoxCall
- Two k_exit jumps (found: i, not found: -1)
- Tests: phase254_p0_index_of_min.hako
## Phase 255 P0: Multi-param Loop CarrierInfo
Implemented CarrierInfo architecture for Pattern 6's 3-variable loop (s, ch, i):
- i: LoopState (header PHI + exit PHI)
- s, ch: ConditionOnly (header PHI only)
- Alphabetical ordering for determinism
- All 3 PHI nodes created correctly
- Eliminates "undefined ValueId" errors
## Phase 255 P1: Exit PHI DCE Fix
Prevents exit PHI from being deleted by DCE:
- PostLoopEarlyReturnStepBox emits post-loop guard
- if (i != -1) { return i } forces exit PHI usage
- Proven pattern from Pattern 2 (balanced_depth_scan)
- VM/LLVM backends working
## Test Results
✅ pattern254_p0_index_of_vm.sh: PASS (exit code 1)
✅ pattern254_p0_index_of_llvm_exe.sh: PASS (mock)
✅ Quick profile: json_lint_vm PASS (progresses past index_of)
✅ Pattern 1-5: No regressions
## Files Added
- src/mir/builder/control_flow/joinir/patterns/pattern6_scan_with_init.rs
- src/mir/join_ir/lowering/scan_with_init_minimal.rs
- apps/tests/phase254_p0_index_of_min.hako
- docs/development/current/main/phases/phase-254/README.md
- docs/development/current/main/phases/phase-255/README.md
🧠 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -197,6 +197,18 @@ NYASH_CLI_VERBOSE=2 \
|
||||
|
||||
---
|
||||
|
||||
## ANF / Normalized (dev-only)
|
||||
|
||||
| 変数 | デフォルト | 適用経路 | 説明 |
|
||||
| --- | --- | --- | --- |
|
||||
| `HAKO_ANF_DEV=1` | OFF | Any | ANF routing を dev-only で有効化。撤去条件: ANF が本線化した時に削除 |
|
||||
| `HAKO_ANF_ALLOW_PURE=1` | OFF | Any | PureOnly scope の ANF を許可(dev-only、`HAKO_ANF_DEV=1` 前提)。撤去条件: PureOnly ANF が本線化した時に削除 |
|
||||
| `HAKO_ANF_STRICT=1` | OFF | Any | ANF の fail-fast を有効化(dev-only)。撤去条件: fail-fast を常時化した時に削除 |
|
||||
|
||||
補足: 実装は `src/config/env` に集約し、直読みはしない。
|
||||
|
||||
---
|
||||
|
||||
## JoinIR トグル (Phase 72 整理版)
|
||||
|
||||
JoinIR は制御構造を関数呼び出し + 継続に正規化する IR 層。フラグは config/env のポリシーで集約するよ。
|
||||
@ -232,7 +244,7 @@ LoopBuilder は物理削除済みで、JoinIR を OFF にするモードは存
|
||||
| `HAKO_JOINIR_STAGE1` | OFF | Stage‑1 JoinIR 経路。 |
|
||||
| `HAKO_JOINIR_PRINT_TOKENS_MAIN` | OFF | print_tokens main A/B。 |
|
||||
| `HAKO_JOINIR_ARRAY_FILTER_MAIN` | OFF | array.filter main A/B。 |
|
||||
| `NYASH_JOINIR_DEBUG` / `HAKO_JOINIR_DEBUG` | OFF | JoinIR デバッグログ。 |
|
||||
| `NYASH_JOINIR_DEBUG` / `HAKO_JOINIR_DEBUG` | OFF | JoinIR デバッグログ(推奨: `HAKO_JOINIR_DEBUG=1`、`NYASH_*` は legacy)。 |
|
||||
|
||||
### Deprecated / 廃止候補
|
||||
|
||||
|
||||
Reference in New Issue
Block a user