96 lines
3.8 KiB
Markdown
96 lines
3.8 KiB
Markdown
|
|
# Phase 273 P3 — “Plan Lowering SSOT Finalize” (Claude Code Instructions)
|
|||
|
|
|
|||
|
|
目的:
|
|||
|
|
- Phase 273 P2 で導入した generalized CoreLoopPlan を SSOT として固定し、legacy fallback を撤去して収束を完成させる。
|
|||
|
|
|
|||
|
|
前提:
|
|||
|
|
- Extractor は pure(builder 触り禁止)
|
|||
|
|
- Pattern知識は Normalizer に閉じる
|
|||
|
|
- Lowerer は CorePlan のみを処理(pattern-agnostic)
|
|||
|
|
- terminator SSOT は `Frag → emit_frag()` のみ
|
|||
|
|
|
|||
|
|
## Scope
|
|||
|
|
|
|||
|
|
P3 でやる:
|
|||
|
|
1. Pattern6 を generalized CoreLoopPlan(`frag/block_effects/phis/final_values`)へ移行
|
|||
|
|
2. `lower_loop_legacy()` を撤去し、generalized 経路を SSOT 化(Fail-Fast)
|
|||
|
|
3. CoreLoopPlan の `Option<...>` を必須化して “揺れ” を構造で消す(可能なら)
|
|||
|
|
|
|||
|
|
P3 でやらない:
|
|||
|
|
- Pattern8/その他 pattern の Plan 化(別フェーズ)
|
|||
|
|
- CorePlan の vocabulary 増殖(variant追加禁止)
|
|||
|
|
|
|||
|
|
## Tasks
|
|||
|
|
|
|||
|
|
### Task 1: Pattern6 を generalized CoreLoopPlan へ移行
|
|||
|
|
|
|||
|
|
対象:
|
|||
|
|
- `src/mir/builder/control_flow/plan/normalizer.rs`
|
|||
|
|
|
|||
|
|
やること:
|
|||
|
|
- ScanWithInit の normalize で以下を構築する:
|
|||
|
|
- `block_effects`: header/body/step の効果(ValueId は normalizer で生成・型登録)
|
|||
|
|
- `phis`: header の loop-carrier PHI
|
|||
|
|
- `frag`: header/body の BranchStub + wires(step→header, found→Return(i), after→Return(-1) など現行仕様に合わせる)
|
|||
|
|
- `final_values`: `i` の最終値(after で使うならその ValueId)
|
|||
|
|
- legacy field(`header_effects/body/step_effects/carriers/cond_*` など)を空/未使用にするか、最終的に削除する。
|
|||
|
|
|
|||
|
|
注意:
|
|||
|
|
- ScanWithInit は “return” を含むので、Frag wires に Return を含める(emit_frag SSOT)。
|
|||
|
|
- `ensure_block_exists` が必要なブロック(after/found 等)は Lowerer で担保する。
|
|||
|
|
|
|||
|
|
### Task 2: Lowerer の legacy fallback を撤去
|
|||
|
|
|
|||
|
|
対象:
|
|||
|
|
- `src/mir/builder/control_flow/plan/lowerer.rs`
|
|||
|
|
|
|||
|
|
やること:
|
|||
|
|
- `lower_loop_legacy()` を削除
|
|||
|
|
- `lower_loop()` は generalized フィールドを必須として扱い、欠落時は Err(Fail-Fast)
|
|||
|
|
- 例: `block_effects/phis/frag/final_values` が None なら `[lowerer] missing generalized loop fields` で Err
|
|||
|
|
|
|||
|
|
狙い:
|
|||
|
|
- Lowerer から `emit_scan_with_init_edgecfg()` 等の pattern 参照を完全に消す。
|
|||
|
|
|
|||
|
|
### Task 3: CoreLoopPlan の “必須化”(可能な範囲で)
|
|||
|
|
|
|||
|
|
対象:
|
|||
|
|
- `src/mir/builder/control_flow/plan/mod.rs`
|
|||
|
|
|
|||
|
|
やること:
|
|||
|
|
- `block_effects/phis/frag/final_values` を `Option` から非Optionへ変更(できるなら)
|
|||
|
|
- legacy fields を削除(この時点で Pattern6/7 が generalized を使っていることが前提)
|
|||
|
|
|
|||
|
|
### Task 4: Verifier の拡張(generalized 専用の不変条件)
|
|||
|
|
|
|||
|
|
対象:
|
|||
|
|
- `src/mir/builder/control_flow/plan/verifier.rs`
|
|||
|
|
|
|||
|
|
例:
|
|||
|
|
- `phis` が空でないこと(carrierがある場合)
|
|||
|
|
- `frag.entry` が header_bb に一致すること(loopのentry SSOT)
|
|||
|
|
- `block_effects` に header/body/step が含まれること(最低限)
|
|||
|
|
|
|||
|
|
### Task 5: 回帰テスト
|
|||
|
|
|
|||
|
|
VM:
|
|||
|
|
- `bash tools/smokes/v2/profiles/integration/apps/phase254_p0_index_of_vm.sh`
|
|||
|
|
- `bash tools/smokes/v2/profiles/integration/apps/phase256_p0_split_vm.sh`
|
|||
|
|
- `bash tools/smokes/v2/profiles/integration/apps/phase258_p0_index_of_string_vm.sh`
|
|||
|
|
|
|||
|
|
LLVM(必ず harness で、mock禁止):
|
|||
|
|
- `cargo build --release --features llvm`
|
|||
|
|
- `bash tools/smokes/v2/profiles/integration/apps/phase256_p0_split_llvm_exe.sh`
|
|||
|
|
- `bash tools/smokes/v2/profiles/integration/apps/phase258_p0_index_of_string_llvm_exe.sh`
|
|||
|
|
|
|||
|
|
注意:
|
|||
|
|
- `NYASH_LLVM_USE_HARNESS=1` で `--features llvm` が無い場合は fail-fast する(mock禁止)。
|
|||
|
|
|
|||
|
|
## Acceptance Criteria
|
|||
|
|
|
|||
|
|
- Lowerer から `emit_scan_with_init_edgecfg()` 等の pattern 固有参照が消えている
|
|||
|
|
- Pattern6/7 が generalized CoreLoopPlan を使用している
|
|||
|
|
- legacy fallback が撤去され、欠落時は Err(Fail-Fast)
|
|||
|
|
- 上記 smokes がすべて PASS(VM/LLVM)
|
|||
|
|
|