docs(plan): Phase 273 P4 - Plan Line SSOT Documentation Finalization

Phase 273 P4 では、Plan ライン(Extractor → Normalizer → Verifier → Lowerer)を
"current operational SSOT" として文書化し、アーキテクチャの収束を明文化した。

## Changes

### router.rs docstring 更新
- "Phase 273 P3: Plan Line is Current SSOT for Pattern6/7" セクション追加
- ルーティング戦略を明示(Plan entry points → legacy table)
- SSOT Entry Points を列挙(Pattern6/7 Normalizer, Pattern1-5 各 Lowerer)

### phase-273/README.md 更新
- P3 completion section 追加(generalized CoreLoopPlan 移行完了)
- P3+ Legacy Removal section 追加(~174 lines 削除記録)
- P4 Proposal section 追加(Documentation Finalization チェックリスト)
- SSOT Documentation Entry Points リスト追加(5 つの SSOT 入口)

### joinir-architecture-overview.md 更新
- Section 2.1.2 "Plan-Based Patterns (Pattern6-7, Phase 273 P3)" 追加
- Plan Extractor, Normalizer, Verifier, Lowerer の Box 構造を文書化
- Plan line vs JoinIR line 比較表追加(収束性・SSOT 特性の対比)
- SSOT characteristics リスト追加(Normalizer SSOT, emit_frag SSOT 等)

## SSOT Entry Points(Phase 273 P3 完了時点)

1. **ルーティング**: `router.rs::route_loop_pattern()` - Pattern6/7 Plan entry points
2. **型定義**: `plan/mod.rs` - DomainPlan/CorePlan 固定語彙
3. **正規化**: `plan/normalizer.rs` - Pattern 固有知識一元管理
4. **検証**: `plan/verifier.rs` - fail-fast 不変条件(V2-V9)
5. **降格**: `plan/lowerer.rs` - Pattern-agnostic MIR emission

## Test

-  VM regression: phase254_p0_index_of_vm.sh (PASS)
-  LLVM regression: phase258_p0_index_of_string_llvm_exe.sh (PASS)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-23 00:34:38 +09:00
parent 1b7fd7a0ff
commit 6f1d0df187
3 changed files with 168 additions and 12 deletions

View File

@ -440,6 +440,90 @@ Local Region (1000..=LOCAL_MAX):
- JoinIR → MIR 変換フロー統一化JoinModule → MirModule → merge_joinir_mir_blocks
- JoinIR/MIR の関数数・ブロック数をログ出力し、全パターンが同じ入口でマージする。
### 2.1.2 Plan-Based Patterns (Pattern6-7, Phase 273 P3)
**Phase 273 P3 Status**: SSOT for Pattern6/7 lowering
Pattern6/7 は **Plan lineExtractor → Normalizer → Verifier → Lowerer** を使用する。これは Pattern1-5 の JoinIR 経路とは独立した、新しい SSOT アーキテクチャである。
- **Plan Extractor Box** (pure)
- ファイル:
- `src/mir/builder/control_flow/joinir/patterns/pattern6_scan_with_init.rs::extract_scan_with_init_plan()`
- `src/mir/builder/control_flow/joinir/patterns/pattern7_split_scan.rs::extract_split_scan_plan()`
- 責務:
- Pattern 固有構造を抽出builder アクセスなし)。
- DomainPlanpattern-specificまたは None を返す。
- Pure functionbuilder を触らない)。
- 入力: ASTcondition, body, post_loop_code
- 出力: `Result<Option<DomainPlan>, String>`
- `Ok(Some(domain_plan))`: Pattern マッチ成功
- `Ok(None)`: 不一致(次の pattern へフォールスルー)
- `Err(...)`: close-but-unsupportedfail-fast
- **PlanNormalizer Box** (SSOT for pattern knowledge)
- ファイル: `src/mir/builder/control_flow/plan/normalizer.rs`
- 責務:
- DomainPlanpattern-specific→ CorePlanfixed vocabulary変換。
- Pattern 固有知識の展開SSOT:
- ScanWithInit (Pattern6): スキャン方向、init block、body effects、step
- SplitScan (Pattern7): Split セマンティクス、accumulator updates
- 中間 ValueId 生成Const/BinOp/Compare/MethodCall
- CoreLoopPlan 構築block_effects/phis/frag/final_values
- 入力: `DomainPlan`, `MirBuilder`, `LoopPatternContext`
- 出力: `CorePlan`
- **PlanVerifier Box** (fail-fast validation)
- ファイル: `src/mir/builder/control_flow/plan/verifier.rs`
- 責務:
- CorePlan 不変条件検証(曖昧さなし)。
- Phase gatingP0/P1/P2/P3 specific checks
- 不正な Plan の早期検出。
- 検証項目V2-V9:
- V2: Condition validity (valid ValueId)
- V3: Exit validity (Return in function, Break/Continue in loop)
- V4: Seq non-empty
- V5: If completeness (then_plans non-empty)
- V6: ValueId validity (all ValueIds pre-generated)
- V7: PHI non-empty (loops require at least one carrier)
- V8: Frag entry matches header_bb
- V9: block_effects contains header_bb
- **PlanLowerer Box** (pattern-agnostic)
- ファイル: `src/mir/builder/control_flow/plan/lowerer.rs`
- 責務:
- CorePlan のみを処理DomainPlan 知識なし)。
- Block 割り当てpreheader/header/body/step/after/found
- PHI node 挿入LoopHeaderPhiBuilder
- Block emissionbody_bb, step_bb
- EdgeCFG Frag 構築emit_frag() で terminator SSOT
- variable_map 更新final_values
- 入力: `CorePlan`, `MirBuilder`, `LoopPatternContext`
- 出力: `Result<Option<ValueId>, String>`
- **Routing in route_loop_pattern()**
- 場所: `src/mir/builder/control_flow/joinir/patterns/router.rs::route_loop_pattern()` (lines 294-354)
- Entry pointsLOOP_PATTERNS table より前にチェック):
1. Try Plan-based Pattern6 (extract_scan_with_init_plan)
2. Try Plan-based Pattern7 (extract_split_scan_plan)
3. Fall through to LOOP_PATTERNS table (Pattern1-5, 8-9)
**Plan line vs JoinIR line**:
| 項目 | Plan line (Pattern6/7) | JoinIR line (Pattern1-5) |
|------|------------------------|-------------------------|
| 入口 | Extractor (pure) | Pattern Lowerer (builder access) |
| 中間表現 | DomainPlan → CorePlan | JoinModule (JoinIR) |
| Pattern 知識 | Normalizer SSOT | Pattern Lowerer 各自 |
| Terminator | emit_frag() SSOT | 各 Pattern 固有 emission |
| Block/Value 生成 | Normalizer (pre-allocated) | Pattern Lowerer |
| 収束性 | ✅ 完全収束P3 | 🔄 段階的収束中 |
**SSOT 特性**:
- Normalizer が Pattern 知識を一元管理scan/split セマンティクス)
- Lowerer は CorePlan のみを処理pattern-agnostic
- emit_frag() が terminator 生成の唯一の入口SSOT
- Pattern6/7 は JoinIR を経由せず直接 MIR へ
### 2.2 条件式ライン(式の箱)
- **BoolExprLowerer / condition_to_joinir**