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>
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
# Phase 256: StringUtils.split/2 Pattern Support
|
||||
|
||||
Status: Active
|
||||
Status: Completed
|
||||
Scope: Loop pattern recognition for split/tokenization operations
|
||||
Related:
|
||||
- Phase 255 完了(loop_invariants 導入、Pattern 6 完成)
|
||||
@ -9,14 +9,16 @@ Related:
|
||||
|
||||
## Current Status (SSOT)
|
||||
|
||||
- Current first FAIL: `json_lint_vm`(Pattern2 break cond: `this.is_whitespace(...)` needs `current_static_box_name`)
|
||||
- Current first FAIL: `json_lint_vm / StringUtils.last_index_of/2`(Loop with early return pattern - unsupported)
|
||||
- `StringUtils.split/2` は VM `--verify` / smoke まで PASS
|
||||
- Pattern6(index_of)は PASS 維持
|
||||
- 次フェーズ: Phase 257(`last_index_of/2` の reverse scan + early return loop)
|
||||
- 直近の完了:
|
||||
- P1.13: Pattern2 boundary entry_param_mismatch 根治(`join_module.entry.params` SSOT 化)
|
||||
- P1.10: DCE が `jump_args` 参照を保持し、`instruction_spans` と同期するよう修正(回帰テスト追加)
|
||||
- P1.7: SSA undef(`%49/%67`)根治(continuation 関数名の SSOT 不一致)
|
||||
- P1.6: pipeline contract checks を `run_all_pipeline_checks()` に集約
|
||||
- 次の作業: Pattern2 の static box context を break condition lowering に渡す(次フェーズ)
|
||||
- 次の作業: Phase 257(last_index_of pattern - loop with return support)
|
||||
- 設計メモ(ChatGPT Pro 相談まとめ): `docs/development/current/main/investigations/phase-256-joinir-contract-questions.md`
|
||||
|
||||
---
|
||||
@ -477,6 +479,49 @@ Option A(Pattern 7 新設)を推奨。
|
||||
- legacy 掃除候補:
|
||||
- `join_func_name(id)` の利用箇所を棚卸しし、「structured JoinIR では使用禁止 / normalized shadow だけで使用」など境界を明文化
|
||||
|
||||
---
|
||||
|
||||
## 進捗(P1.13)
|
||||
|
||||
### P1.13: Pattern2 boundary entry_param_mismatch 根治(完了)
|
||||
|
||||
症状(json_lint_vm / StringUtils.trim_end/1):
|
||||
```
|
||||
[ERROR] ❌ MIR compilation error: [joinir/phase1.5/boundary/entry_param_mismatch]
|
||||
Entry param[0] in 'main': expected ValueId(1000), but boundary.join_inputs[0] = ValueId(0)
|
||||
Hint: parameter ValueId mismatch indicates boundary.join_inputs constructed in wrong order
|
||||
```
|
||||
|
||||
根本原因(SSOT):
|
||||
- `emit_joinir_step_box.rs` が `boundary.join_inputs` を hardcoded ValueId(0), ValueId(1)... で構築していた
|
||||
- JoinIR lowerer は `alloc_param()` / `alloc_local()` で実際のパラメータ ValueId を割り当てている
|
||||
- 両者が一致しないため、boundary contract check で fail-fast
|
||||
|
||||
修正方針(SSOT原則):
|
||||
- **SSOT**: `join_module.entry.params` が `boundary.join_inputs` の唯一の真実
|
||||
- **禁止**: ValueId(0..N) の推測生成、Param/Local 領域の決めつけ、JoinModule とは独立に ValueId を作ること
|
||||
- **実装**: `emit_joinir_step_box.rs` で `join_input_slots = entry_func.params.clone()` に置き換え
|
||||
|
||||
実装(SSOT):
|
||||
- `src/mir/builder/control_flow/joinir/patterns/pattern2_steps/emit_joinir_step_box.rs` (lines 71-96)
|
||||
- Entry function extraction (priority: `join_module.entry` → fallback to "main")
|
||||
- `join_input_slots = main_func.params.clone()` (SSOT from JoinModule)
|
||||
- `host_input_values` を同じ順序で構築(loop_var + carriers)
|
||||
- Fail-fast validation for params count mismatch
|
||||
|
||||
結果:
|
||||
- `./tools/smokes/v2/run.sh --profile quick` の first FAIL が `StringUtils.trim_end/1` から `StringUtils.last_index_of/2` へ移動
|
||||
- Pattern2 の boundary contract は安定化
|
||||
|
||||
次のブロッカー(Phase 257):
|
||||
- `StringUtils.last_index_of/2` - Loop with early return pattern (unsupported)
|
||||
- Structure: `loop(i >= 0) { if (cond) { return value } i = i - 1 } return default`
|
||||
- Capabilities: `caps=If,Loop,Return` (no Break)
|
||||
- Missing: ConstStep capability
|
||||
- Approach: Extend Pattern2 to handle return (similar to break) or create Pattern2Return variant
|
||||
- Fixture: `apps/tests/phase257_p0_last_index_of_min.hako`
|
||||
- Integration smokes: `phase257_p0_last_index_of_vm.sh`, `phase257_p0_last_index_of_llvm_exe.sh`
|
||||
|
||||
次(P1.5 Task 3):
|
||||
- `ValueId(57)` が「何の JoinIR 値の remap 結果か」を確定し、定義側(dst)が MIR に落ちているかを追う
|
||||
- 例: `sep_len = sep.length()` の BoxCall dst が収集/変換/順序のどこかで欠けていないか
|
||||
|
||||
Reference in New Issue
Block a user