docs(phase29ao): add p3 direct coreloop skeleton instructions

This commit is contained in:
2025-12-30 04:29:34 +09:00
parent 5318cec972
commit 2dd6c2cac5
3 changed files with 121 additions and 3 deletions

View File

@ -18,8 +18,8 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu
**CorePlan migration 道筋 SSOT**
`docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。
**Next implementation (CorePlan composition, P3 planned)**
`docs/development/current/main/phases/phase-29ao/README.md`
**Next implementation (Phase 29ao P3)**
`docs/development/current/main/phases/phase-29ao/P3-CORELOOP-SKELETON-COMPOSE-INSTRUCTIONS.md`
**2025-12-29: Phase 29am P0 COMPLETE (CorePlan If/Exit lowerer/verifier)**
CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan 移行の土台を作った。

View File

@ -0,0 +1,117 @@
---
Status: Ready
Scope: code未接続・仕様不変
Related:
- docs/development/current/main/phases/phase-29ao/README.md
- docs/development/current/main/design/coreplan-migration-roadmap-ssot.md
- docs/development/current/main/design/coreplan-skeleton-feature-model.md
- docs/development/current/main/phases/phase-29ae/README.md
---
# Phase 29ao P3: CoreLoop skeleton を CorePlan で直接生成DomainPlan 非依存・未接続)
Date: 2025-12-30
Status: Ready for execution
Scope: 仕様不変未接続のまま、CorePlan 合成を “DomainPlan 経由” から 1段剥がす
## 目的
- composer が `CanonicalLoopFacts` から `CorePlan::Loop`CoreLoop skeletonを直接生成できる導線を作る。
- P2 までの `CanonicalLoopFacts → DomainPlan → PlanNormalizer → CorePlan` から、DomainPlan 依存を 1つ減らす。
- まだ Skeleton+Feature 合成の完成形へ飛ばず、まずは **Pattern1 subset のみ**で “direct CorePlan” を SSOT として固定する。
## 非目的
- 既存ルーティングの切替P3 は未接続)
- Pattern2/3/4/5/6/7/8/9 の direct 化P4+
- 新 env var / 恒常ログ追加
- by-name 分岐の追加Facts の Option を使うだけ)
## 重要な設計判断P3の境界
- `BasicBlockId/ValueId/Frag` の allocation は **Tier 1Normalizer側**に置いたままにする。
- composer が builder を直接触って “独自の allocation 規約” を作らないSSOTが割れるのを防ぐ
- “direct” の意味は **DomainPlan enum に依存しない**ことPattern固有 knowledge は最小化し、将来は Skeleton+Feature 合成へ寄せる)。
## 実装手順
### Step 1: Normalizer に skeleton builder を追加Pattern1 subsetのみ
追加(推奨):
- `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.rs`
配線:
- `src/mir/builder/control_flow/plan/normalizer/mod.rs``mod skeleton_loop;` を追加
実装:
- `impl PlanNormalizer { pub(in crate::mir::builder) fn normalize_loop_skeleton_from_facts(builder: &mut MirBuilder, facts: &CanonicalLoopFacts, ctx: &LoopPatternContext) -> Result<Option<CorePlan>, String> }`
条件subset、誤マッチ防止最優先:
- `facts.skeleton_kind == SkeletonKind::Loop` のみ対象、それ以外は `Ok(None)`
- `facts.facts.pattern1_simplewhile.is_some()` のときだけ `Ok(Some(CorePlan::Loop(..)))`
- それ以外は `Ok(None)`
生成する CoreLoop skeleton最小で正しい:
- ブロック: Standard 5preheader/header/body/step/after
- PHI: loop_var の 1本header
- frag:
- `frag.entry == header_bb`
- header の Branchthen=body, else=after
- wires: body→step, step→header
- exits: 空
- body: 空effect-only 制約と整合)
- cond_loop/cond_match: ValueId を割り当て、Pattern1 では `cond_match = cond_loop` でOK
利用してよい既存 SSOT:
- `LoopBlocksStandard5::allocate(builder)`
- `create_phi_bindings(..)`
- `PlanNormalizer::lower_compare_ast(..)` / `lower_binop_ast(..)`normalizer 内で完結させる)
### Step 2: composer から direct skeleton を呼ぶ API を追加
対象:
- `src/mir/builder/control_flow/plan/composer/mod.rs`
追加(案):
- `pub(in crate::mir::builder) fn try_compose_core_plan_direct(builder: &mut MirBuilder, facts: &CanonicalLoopFacts, ctx: &LoopPatternContext) -> Result<Option<CorePlan>, String>`
処理:
- `PlanNormalizer::normalize_loop_skeleton_from_facts(builder, facts, ctx)` を呼ぶだけ
注意:
- 既存の `try_compose_core_plan_via_normalizer`DomainPlan 経由は残す比較用・P4以降の移行用
### Step 3: unit testdirect path の Some/None 境界 + verify 固定)
対象:
- `src/mir/builder/control_flow/plan/composer/mod.rs`tests 追記)
追加テスト:
1) Pattern1 facts あり → `try_compose_core_plan_direct(..)``Some(CorePlan::Loop(_))`
2) Pattern1 facts なし → `None`
3) `PlanVerifier::verify(&core)` が通る(局所不変条件が満たされることを固定)
builder の事前条件:
- loop_var 初期値が `builder.variable_ctx.variable_map` に入っていることPattern1 normalizer と同条件)
### Step 4: docs 更新
更新:
- `docs/development/current/main/phases/phase-29ao/README.md`P3 指示書リンク追加)
- `CURRENT_TASK.md`(次の指示書を P3 に更新)
## 検証(必須)
- `cargo build --release`
- `./tools/smokes/v2/run.sh --profile quick`
- `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
## コミット
- `git add -A`
- `git commit -m "phase29ao(p3): direct coreloop skeleton from facts (pattern1 subset)"`
## 次P4の入口
P4 では ExitMap presencebreak/continue/returnを CorePlan/Frag の語彙へ寄せる。
Pattern2/4/5 を “別pattern” にせず feature 合成へ落とし始めるSSOT: skeleton/feature model

View File

@ -35,7 +35,8 @@ GateSSOT:
## Nextplanned
- P3: CoreLoop skeletonpreheader/header/body/exit`CorePlan` 語彙で直接生成effects/phis/frag は “最小で正しい”
- P3: CoreLoop skeleton`CorePlan` 語彙で直接生成DomainPlan 非依存・未接続
- 指示書: `docs/development/current/main/phases/phase-29ao/P3-CORELOOP-SKELETON-COMPOSE-INSTRUCTIONS.md`
- P4: ExitMap presence を `Frag/ExitMap` と結ぶbreak/continue/return を feature 合成へ寄せる)
- P5: Cleanup presence を ExitKind 単位で wireeffect/cleanup SSOT に従う、観測差分なし)
- P6: ValueJoin presence を post-phi SSOT に沿って wire局所 verify から)