diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 438a4e29..0c329dbd 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -18,13 +18,16 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu **CorePlan migration 道筋 SSOT** `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。 -**Next implementation (Phase 29ao P27)** -- 目的: Pattern6(ScanWithInit) のうち planner subset(Facts由来)だけを strict/dev で Facts→CorePlan に寄せ、variant(reverse/matchscan 等)は fallback 維持(既定挙動は不変) -- 指示書: `docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md` +**Next implementation (Phase 29ao P28)** +- 目的: TBD +- 指示書: TBD **2025-12-30: Phase 29ao P25 COMPLETE (Pattern5 strict/dev adopt from facts)** Pattern5(Infinite Early-Exit)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。 +**2025-12-30: Phase 29ao P27 COMPLETE (Pattern6 subset strict/dev adopt from facts)** +Pattern6(ScanWithInit) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを Fail-Fast で検知できるようにした。 + **2025-12-30: Phase 29ao P26 COMPLETE (Pattern2 subset strict/dev adopt from facts)** Pattern2(Break) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを Fail-Fast で検知できるようにした。 diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md index f699dd2b..58ccb161 100644 --- a/docs/development/current/main/10-Now.md +++ b/docs/development/current/main/10-Now.md @@ -2,17 +2,21 @@ ## Current Focus: Phase 29ao(CorePlan composition) -Next: Phase 29ao P27(Pattern6 subset strict/dev adopt from facts) -指示書: `docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md` +Next: Phase 29ao P28(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 P27 完了** ✅ +- 目的: Pattern6(ScanWithInit) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを早期検知 +- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern_scan_with_init.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` / `docs/development/current/main/design/coreplan-migration-roadmap-ssot.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 P26 完了** ✅ - 目的: Pattern2(Break) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを早期検知 - 変更: `src/mir/builder/control_flow/plan/normalizer/pattern2_break.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `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` / `docs/development/current/main/design/coreplan-migration-roadmap-ssot.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 P25 完了** ✅ - 目的: Pattern5 を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を早期検知 - 変更: `src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern5_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `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` / `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` diff --git a/docs/development/current/main/30-Backlog.md b/docs/development/current/main/30-Backlog.md index 196487c8..051c1228 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–P26 ✅ 完了 / Next: P27(Pattern6 subset strict/dev adopt from facts) - - Next 指示書: `docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md` + - 状況: P0–P27 ✅ 完了 / Next: P28(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/design/coreplan-migration-roadmap-ssot.md b/docs/development/current/main/design/coreplan-migration-roadmap-ssot.md index 9ae11864..276059eb 100644 --- a/docs/development/current/main/design/coreplan-migration-roadmap-ssot.md +++ b/docs/development/current/main/design/coreplan-migration-roadmap-ssot.md @@ -34,7 +34,7 @@ Related: ## 1.1 Current (active) - Active phase: `docs/development/current/main/phases/phase-29ao/README.md` -- Next step: `docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md` +- Next step: TBD (Phase 29ao P28) ## 2. すでに固めた SSOT(再発防止の土台) diff --git a/docs/development/current/main/phases/phase-29ao/README.md b/docs/development/current/main/phases/phase-29ao/README.md index e30bf50e..4ffeabb6 100644 --- a/docs/development/current/main/phases/phase-29ao/README.md +++ b/docs/development/current/main/phases/phase-29ao/README.md @@ -157,13 +157,11 @@ Gate(SSOT): - 指示書: `docs/development/current/main/phases/phase-29ao/P26-STRICT-ADOPT-PATTERN2-BREAK-SUBSET-FROM-FACTS-INSTRUCTIONS.md` - ねらい: Pattern2 のうち Facts が表現できる subset を strict/dev で Facts→CorePlan に寄せ、段階的に CorePlan 合成へ収束(既定挙動は不変) -## P27: strict/dev Pattern6(ScanWithInit) subset adopt from facts +## P27: strict/dev Pattern6(ScanWithInit) subset adopt from facts ✅ - 指示書: `docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md` - ねらい: Pattern6 のうち planner subset(Facts由来)だけを strict/dev で Facts→CorePlan に寄せ、reverse/matchscan 等の variant は fallback 維持(既定挙動は不変) ## Next(planned) -- Next: P27(実装) - - 指示書: `docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md` -- After P27: P28(TBD) +- Next: P28(TBD) diff --git a/src/mir/builder/control_flow/joinir/patterns/router.rs b/src/mir/builder/control_flow/joinir/patterns/router.rs index 6827e132..d8331e22 100644 --- a/src/mir/builder/control_flow/joinir/patterns/router.rs +++ b/src/mir/builder/control_flow/joinir/patterns/router.rs @@ -379,6 +379,29 @@ 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::ScanWithInit(_) + ) + && matches!( + outcome.plan.as_ref(), + Some(crate::mir::builder::control_flow::plan::DomainPlan::ScanWithInit(_)) + ) + { + let facts = outcome + .facts + .as_ref() + .ok_or_else(|| "pattern6 strict/dev adopt failed: facts missing".to_string())?; + if facts.facts.scan_with_init.is_none() { + return Err("pattern6 strict/dev adopt failed: facts mismatch".to_string()); + } + let core_plan = PlanNormalizer::normalize_scan_with_init_from_facts(builder, facts, ctx)? + .ok_or_else(|| "pattern6 strict/dev adopt failed: compose rejected".to_string())?; + PlanVerifier::verify(&core_plan)?; + return PlanLowerer::lower(builder, core_plan, ctx); + } + if strict_or_dev && matches!( domain_plan, diff --git a/src/mir/builder/control_flow/plan/normalizer/pattern_scan_with_init.rs b/src/mir/builder/control_flow/plan/normalizer/pattern_scan_with_init.rs index c33d4dca..1e6d42d8 100644 --- a/src/mir/builder/control_flow/plan/normalizer/pattern_scan_with_init.rs +++ b/src/mir/builder/control_flow/plan/normalizer/pattern_scan_with_init.rs @@ -1,14 +1,31 @@ use super::{CoreEffectPlan, CoreLoopPlan, CorePhiInfo, CorePlan, ScanWithInitPlan}; +use crate::ast::{ASTNode, Span}; use crate::mir::builder::control_flow::plan::ScanDirection; use crate::mir::basic_block::EdgeArgs; use crate::mir::builder::control_flow::edgecfg::api::{BranchStub, EdgeStub, ExitKind, Frag}; use crate::mir::builder::control_flow::joinir::patterns::router::LoopPatternContext; +use crate::mir::builder::control_flow::plan::facts::loop_facts::ScanWithInitFacts; +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::{BinaryOp, CompareOp, ConstValue, Effect, EffectMask, MirType}; use std::collections::BTreeMap; impl super::PlanNormalizer { + pub(in crate::mir::builder) fn normalize_scan_with_init_from_facts( + builder: &mut MirBuilder, + facts: &CanonicalLoopFacts, + ctx: &LoopPatternContext, + ) -> Result, String> { + let Some(scan) = facts.facts.scan_with_init.as_ref() else { + return Ok(None); + }; + + let parts = plan_from_facts(scan); + let core_plan = Self::normalize_scan_with_init(builder, parts, ctx)?; + Ok(Some(core_plan)) + } + /// ScanWithInit → CorePlan 変換 /// /// Expands scan-specific semantics into generic CorePlan: @@ -384,3 +401,19 @@ impl super::PlanNormalizer { Ok(CorePlan::Loop(loop_plan)) } } + +fn plan_from_facts(facts: &ScanWithInitFacts) -> ScanWithInitPlan { + ScanWithInitPlan { + loop_var: facts.loop_var.clone(), + haystack: facts.haystack.clone(), + needle: facts.needle.clone(), + step_lit: facts.step_lit, + early_return_expr: ASTNode::Variable { + name: facts.loop_var.clone(), + span: Span::unknown(), + }, + not_found_return_lit: -1, + scan_direction: ScanDirection::Forward, + dynamic_needle: false, + } +}