From 314231d6ea1d9f70fc8833255ea3a671d38d38bc Mon Sep 17 00:00:00 2001 From: tomoaki Date: Tue, 30 Dec 2025 10:15:23 +0900 Subject: [PATCH] phase29ao(p23): strict/dev adopt pattern3 from facts --- CURRENT_TASK.md | 9 ++++-- docs/development/current/main/10-Now.md | 9 ++++-- docs/development/current/main/30-Backlog.md | 4 +-- .../current/main/phases/phase-29ao/README.md | 8 ++++-- .../control_flow/joinir/patterns/router.rs | 22 +++++++++++++++ .../plan/normalizer/pattern3_if_phi.rs | 28 +++++++++++++++++++ 6 files changed, 71 insertions(+), 9 deletions(-) diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 8a6ec3ed..24bcec89 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -18,9 +18,12 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu **CorePlan migration 道筋 SSOT** `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。 -**Next implementation (Phase 29ao P23)** -- 目的: strict/dev の Pattern3(If‑Phi)でも Facts→CorePlan を採用し、DomainPlan経路との差分/ズレを Fail-Fast で検知する -- 指示書: `docs/development/current/main/phases/phase-29ao/P23-STRICT-ADOPT-PATTERN3-IFPHI-FROM-FACTS-INSTRUCTIONS.md` +**Next implementation (Phase 29ao P24)** +- 目的: TBD +- 指示書: TBD + +**2025-12-30: Phase 29ao P23 COMPLETE (Pattern3 strict/dev adopt from facts)** +Pattern3(If‑Phi)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。 **2025-12-30: Phase 29ao P22 COMPLETE (Pattern1 CoreLoop dedup)** Pattern1 の CoreLoop 構築を SSOT で 1 箇所に統一し、DomainPlan/Facts の二重化を解消した。 diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md index 577fb5b5..79d41e80 100644 --- a/docs/development/current/main/10-Now.md +++ b/docs/development/current/main/10-Now.md @@ -2,12 +2,17 @@ ## Current Focus: Phase 29ao(CorePlan composition) -Next: Phase 29ao P23(strict/dev adopt: Pattern3 If‑Phi from facts) -指示書: `docs/development/current/main/phases/phase-29ao/P23-STRICT-ADOPT-PATTERN3-IFPHI-FROM-FACTS-INSTRUCTIONS.md` +Next: Phase 29ao P24(TBD) +指示書: TBD 運用ルール: integration filter で phase143_* は回さない(JoinIR 回帰は phase29ae pack のみ) 運用ルール: phase286_pattern9_* は legacy pack (SKIP) を使う 移行道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` +**2025-12-30: Phase 29ao P23 完了** ✅ +- 目的: Pattern3 を strict/dev で Facts→CorePlan に寄せ、DomainPlan とのズレを早期検知 +- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `docs/development/current/main/phases/phase-29ao/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` + **2025-12-30: Phase 29ao P22 完了** ✅ - 目的: Pattern1 の CoreLoop 構築を SSOT 化し、DomainPlan/Facts 経路の二重実装を排除 - 変更: `src/mir/builder/control_flow/plan/normalizer/pattern1_coreloop_builder.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern1_simple_while.rs` / `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.rs` / `docs/development/current/main/phases/phase-29ao/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md` diff --git a/docs/development/current/main/30-Backlog.md b/docs/development/current/main/30-Backlog.md index 0d3f3769..a2dd6536 100644 --- a/docs/development/current/main/30-Backlog.md +++ b/docs/development/current/main/30-Backlog.md @@ -15,8 +15,8 @@ Related: - **Phase 29ao(active): CorePlan composition from Skeleton/Feature** - 入口: `docs/development/current/main/phases/phase-29ao/README.md` - - 状況: P0–P22 ✅ 完了 / Next: P23(Pattern3 strict adopt) - - Next 指示書: `docs/development/current/main/phases/phase-29ao/P23-STRICT-ADOPT-PATTERN3-IFPHI-FROM-FACTS-INSTRUCTIONS.md` + - 状況: P0–P23 ✅ 完了 / Next: P24(TBD) + - Next 指示書: TBD - **Phase 29af(✅ COMPLETE): Boundary hygiene / regression entrypoint / carrier layout SSOT** - 入口: `docs/development/current/main/phases/phase-29af/README.md` diff --git a/docs/development/current/main/phases/phase-29ao/README.md b/docs/development/current/main/phases/phase-29ao/README.md index e19b1230..7080b2d4 100644 --- a/docs/development/current/main/phases/phase-29ao/README.md +++ b/docs/development/current/main/phases/phase-29ao/README.md @@ -137,7 +137,11 @@ Gate(SSOT): - 指示書: `docs/development/current/main/phases/phase-29ao/P22-DEDUP-PATTERN1-CORELOOP-CONSTRUCTION-INSTRUCTIONS.md` - ねらい: DomainPlan/Facts 経路の CoreLoop 構築を 1 箇所へ統一し divergence を防ぐ +## P23: strict/dev Pattern3 adopt from facts(If‑Phi)✅ + +- 指示書: `docs/development/current/main/phases/phase-29ao/P23-STRICT-ADOPT-PATTERN3-IFPHI-FROM-FACTS-INSTRUCTIONS.md` +- ねらい: Pattern3 を strict/dev で Facts→CorePlan に寄せ、DomainPlan とのズレを早期検知 + ## Next(planned) -- P23: strict/dev Pattern3 (If‑Phi) を Facts→CorePlan で shadow adopt - - 指示書: `docs/development/current/main/phases/phase-29ao/P23-STRICT-ADOPT-PATTERN3-IFPHI-FROM-FACTS-INSTRUCTIONS.md` +- P24: TBD diff --git a/src/mir/builder/control_flow/joinir/patterns/router.rs b/src/mir/builder/control_flow/joinir/patterns/router.rs index b4a139b9..c6066ea2 100644 --- a/src/mir/builder/control_flow/joinir/patterns/router.rs +++ b/src/mir/builder/control_flow/joinir/patterns/router.rs @@ -357,6 +357,28 @@ pub(crate) fn route_loop_pattern( return PlanLowerer::lower(builder, core_plan, ctx); } + if strict_or_dev + && matches!( + domain_plan, + crate::mir::builder::control_flow::plan::DomainPlan::Pattern3IfPhi(_) + ) + { + let facts = outcome + .facts + .as_ref() + .ok_or_else(|| "pattern3 strict/dev adopt failed: facts missing".to_string())?; + if facts.facts.pattern3_ifphi.is_none() { + return Err("pattern3 strict/dev adopt failed: facts mismatch".to_string()); + } + let core_plan = + PlanNormalizer::normalize_pattern3_if_phi_from_facts(builder, facts, ctx)? + .ok_or_else(|| { + "pattern3 strict/dev adopt failed: compose rejected".to_string() + })?; + PlanVerifier::verify(&core_plan)?; + return PlanLowerer::lower(builder, core_plan, ctx); + } + return lower_via_plan(builder, domain_plan, ctx); } diff --git a/src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs b/src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs index c68d0608..dc41828c 100644 --- a/src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs +++ b/src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs @@ -3,12 +3,28 @@ use super::{CoreEffectPlan, CoreLoopPlan, CorePhiInfo, CorePlan, Pattern3IfPhiPl use crate::mir::basic_block::EdgeArgs; use crate::mir::builder::control_flow::edgecfg::api::{BlockParams, BranchStub, EdgeStub, ExitKind, Frag}; use crate::mir::builder::control_flow::joinir::patterns::router::LoopPatternContext; +use crate::mir::builder::control_flow::plan::facts::pattern3_ifphi_facts::Pattern3IfPhiFacts; +use crate::mir::builder::control_flow::plan::normalize::CanonicalLoopFacts; use crate::mir::builder::MirBuilder; use crate::mir::join_ir::lowering::inline_boundary::JumpArgsLayout; use crate::mir::MirType; use std::collections::BTreeMap; impl super::PlanNormalizer { + pub(in crate::mir::builder) fn normalize_pattern3_if_phi_from_facts( + builder: &mut MirBuilder, + facts: &CanonicalLoopFacts, + ctx: &LoopPatternContext, + ) -> Result, String> { + let Some(pattern3) = facts.facts.pattern3_ifphi.as_ref() else { + return Ok(None); + }; + + let parts = plan_from_facts(pattern3); + let core_plan = Self::normalize_pattern3_if_phi(builder, parts, ctx)?; + Ok(Some(core_plan)) + } + /// Phase 286 P2.6.1: Pattern3IfPhi → CorePlan 変換 /// /// Expands Pattern3 (Loop with If-Phi) semantics into generic CorePlan: @@ -299,3 +315,15 @@ impl super::PlanNormalizer { Ok(CorePlan::Loop(loop_plan)) } } + +fn plan_from_facts(facts: &Pattern3IfPhiFacts) -> Pattern3IfPhiPlan { + Pattern3IfPhiPlan { + loop_var: facts.loop_var.clone(), + carrier_var: facts.carrier_var.clone(), + condition: facts.condition.clone(), + if_condition: facts.if_condition.clone(), + then_update: facts.then_update.clone(), + else_update: facts.else_update.clone(), + loop_increment: facts.loop_increment.clone(), + } +}