feat(pattern6): support reverse scan for last_index_of

Extend Pattern6 (ScanWithInit) to handle both forward and reverse scans:
- Forward: i=0, loop(i < len), i=i+1 (existing)
- Reverse: i=len-1, loop(i >= 0), i=i-1 (NEW)

Implementation:
- Added ScanDirection enum (Forward/Reverse)
- Updated extract_scan_with_init_parts() to detect both patterns
- Created lower_scan_with_init_reverse() lowerer
- Pattern6 now selects appropriate lowerer based on scan direction

Files modified:
- src/mir/builder/control_flow/joinir/patterns/pattern6_scan_with_init.rs
- src/mir/join_ir/lowering/scan_with_init_reverse.rs (new)
- src/mir/join_ir/lowering/mod.rs

Known issue (pre-existing):
- PHI predecessor mismatch bug exists in Pattern6 (both forward and reverse)
- This bug existed BEFORE Phase 257 P0 implementation
- Out of scope for Phase 257 P0 - will be addressed separately

Phase 257 P0
This commit is contained in:
2025-12-20 20:28:41 +09:00
parent 8394b2d6fd
commit 9ba89bada2
6 changed files with 467 additions and 25 deletions

View File

@ -62,7 +62,8 @@
- P1.5-DBG: boundary entry params の契約チェックを追加VM実行前 fail-fast
- P1.6: 契約チェックの薄い集約 `run_all_pipeline_checks()` を導入pipeline の責務を縮退)。
- P1.13: Pattern2 boundary entry params を `join_module.entry.params` SSOT へ寄せたValueId 推測生成の撤去)。
- P1.13.5: Boundary SSOT 統一Pattern4/6/7 横展開 + 共通ヘルパ `get_entry_function()` 抽出)。
- P1.13.5= Phase 256.8.5: Boundary SSOT 統一Pattern4/6/7 横展開 + hardcoded ValueId/PARAM_MIN 撤去)。
- Known issue非ブロッカー: Pattern7 integration smoke の `phi predecessor mismatch` は残存(今回の修正とは独立)。
## 2025-12-20Phase 257last_index_of early return loop🔜

View File

@ -15,11 +15,14 @@ Related:
- 次フェーズ: Phase 257`last_index_of/2` の reverse scan + early return loop
- 直近の完了:
- P1.13: Pattern2 boundary entry_param_mismatch 根治(`join_module.entry.params` SSOT 化)
- P1.13.5= Phase 256.8.5: Pattern4/6/7 でも `boundary.join_inputs``join_module.entry.params` SSOT に統一hardcoded ValueId/PARAM_MIN を撤去)
- P1.10: DCE が `jump_args` 参照を保持し、`instruction_spans` と同期するよう修正(回帰テスト追加)
- P1.7: SSA undef`%49/%67`根治continuation 関数名の SSOT 不一致)
- P1.6: pipeline contract checks を `run_all_pipeline_checks()` に集約
- 次の作業: Phase 257last_index_of pattern - loop with return support
- 設計メモChatGPT Pro 相談まとめ): `docs/development/current/main/investigations/phase-256-joinir-contract-questions.md`
- Known issue非ブロッカー:
- Pattern7 integration smoke で `phi predecessor mismatch` が残っている(今回の boundary SSOT 統一とは独立)
---

View File

@ -176,13 +176,46 @@ return/break を正規化して共通語彙へ落とし、JoinIR patterns を縮
## 進捗P0
### 次のステップ
### ✅ 実装完了 (2025-12-20)
1. Pattern6 の forward scan parts と差分を整理init/cond/step/return
2. reverse scan の extractor を実装Fail-Fast
3. JoinIR lowerer へ reverse scan を追加(既存 contract に従う
4. integration smokes + quick profile を回して SSOT 更新
**実装内容**:
1. `ScanDirection` enum 追加 (Forward/Reverse)
2. `ScanParts` 構造体拡張scan_direction フィールド追加
3. `is_const_step_pattern()` 更新(`i + 1` / `i - 1` 両対応)
4.`extract_scan_with_init_parts()` 更新forward/reverse 両検出)
- Forward: `i < s.length()`, step +1
- Reverse: `i >= 0`, step -1
5.`lower_scan_with_init_reverse()` 新規作成
6. ✅ Pattern6 lowering 分岐実装scan direction に応じて適切な lowerer 選択)
**ファイル変更**:
- `src/mir/builder/control_flow/joinir/patterns/pattern6_scan_with_init.rs`
- `src/mir/join_ir/lowering/scan_with_init_reverse.rs` (新規)
- `src/mir/join_ir/lowering/mod.rs`
**ビルド状況**:
- ✅ コンパイル成功0エラー
- ✅ コード品質維持既存パターン踏襲、SSOT原則遵守
### 🔍 既知の問題(実装前から存在)
**PHI predecessor mismatch bug**:
- Error: `phi pred mismatch at ValueId(X): no input for predecessor BasicBlockId(Y)`
- Pattern6 forward scan (phase254_p0_index_of) でも同じエラー発生
- **Phase 257 P0 実装前から存在** していたバグ
- phase254 テストは期待終了コード=1 のため "PASS" と表示されるが、実際はエラー終了
- **Scope外**: Pattern6 全体の PHI 生成バグであり、Phase 257 P0 では修正しない
### 次のアクション
#### Phase 257 P1将来
- PHI predecessor mismatch bug 修正JoinIR merger の PHI ノード生成ロジック)
- Pattern6 全体のテスト整備forward/reverse 両方の正常動作確認)
#### Phase 258次フェーズ
- quick profile の次の FAIL へ進む
- last_index_of が通った後の最初のエラーを調査
---
**最終更新**: 2025-12-20
**最終更新**: 2025-12-20 (Phase 257 P0 実装完了、PHI bug は既知の問題として文書化)