phase29ao(p26): strict/dev adopt pattern2 break subset from facts

This commit is contained in:
2025-12-30 13:30:28 +09:00
parent 00f824e3e5
commit 52fc3f9353
9 changed files with 81 additions and 12 deletions

View File

@ -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 P26)**
- 目的: Pattern2(Break) のうち Facts が表現できる subset を strict/dev で Facts→CorePlan に寄せ、段階的に CorePlan 合成へ収束(既定挙動は不変)
- 指示書: `docs/development/current/main/phases/phase-29ao/P26-STRICT-ADOPT-PATTERN2-BREAK-SUBSET-FROM-FACTS-INSTRUCTIONS.md`
**Next implementation (Phase 29ao P27)**
- 目的: TBD
- 指示書: TBD
**2025-12-30: Phase 29ao P25 COMPLETE (Pattern5 strict/dev adopt from facts)**
Pattern5Infinite Early-Exitを strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を 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 で検知できるようにした。
**2025-12-30: Phase 29ao P24 COMPLETE (Pattern7 strict/dev adopt from facts)**
Pattern7SplitScanを strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。

View File

@ -2,12 +2,17 @@
## Current Focus: Phase 29aoCorePlan composition
Next: Phase 29ao P26Pattern2 subset strict/dev adopt from facts
指示書: `docs/development/current/main/phases/phase-29ao/P26-STRICT-ADOPT-PATTERN2-BREAK-SUBSET-FROM-FACTS-INSTRUCTIONS.md`
Next: Phase 29ao P27TBD
指示書: 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 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`

View File

@ -15,8 +15,8 @@ Related:
- **Phase 29aoactive: CorePlan composition from Skeleton/Feature**
- 入口: `docs/development/current/main/phases/phase-29ao/README.md`
- 状況: P0P25 ✅ 完了 / Next: P26Pattern2 subset strict/dev adopt from facts
- Next 指示書: `docs/development/current/main/phases/phase-29ao/P26-STRICT-ADOPT-PATTERN2-BREAK-SUBSET-FROM-FACTS-INSTRUCTIONS.md`
- 状況: P0P26 ✅ 完了 / Next: P27TBD
- Next 指示書: TBD
- **Phase 29af✅ COMPLETE: Boundary hygiene / regression entrypoint / carrier layout SSOT**
- 入口: `docs/development/current/main/phases/phase-29af/README.md`

View File

@ -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/P26-STRICT-ADOPT-PATTERN2-BREAK-SUBSET-FROM-FACTS-INSTRUCTIONS.md`
- Next step: TBD (Phase 29ao P27)
## 2. すでに固めた SSOT再発防止の土台

View File

@ -6,6 +6,7 @@ Goal: JoinIR の最小回帰セットを SSOT として固定する。
- Pattern2: `phase29ab_pattern2_*`
- Pattern2 (real-world): `phase263_pattern2_*`
- Pattern2 (subset, strict shadow, VM): `phase29ai_pattern2_break_plan_subset_ok_min_vm`
- Pattern3 (IfPhi, VM): `phase118_pattern3_if_sum_vm`
- Pattern1 (strict shadow, VM): `phase29ao_pattern1_strict_shadow_vm`
- Pattern1 (subset reject, VM): `phase29ao_pattern1_subset_reject_extra_stmt_vm`

View File

@ -152,13 +152,11 @@ GateSSOT:
- 指示書: `docs/development/current/main/phases/phase-29ao/P25-STRICT-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-FROM-FACTS-INSTRUCTIONS.md`
- ねらい: Pattern5 を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を早期検知(既定挙動は不変)
## P26: strict/dev Pattern2(Break) subset adopt from facts
## P26: strict/dev Pattern2(Break) subset adopt from facts
- 指示書: `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 合成へ収束(既定挙動は不変)
## Nextplanned
- Next: P26実装
- 指示書: `docs/development/current/main/phases/phase-29ao/P26-STRICT-ADOPT-PATTERN2-BREAK-SUBSET-FROM-FACTS-INSTRUCTIONS.md`
- After P26: P27TBD
- Next: P27TBD

View File

@ -420,6 +420,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::Pattern2Break(_)
)
&& matches!(
outcome.plan.as_ref(),
Some(crate::mir::builder::control_flow::plan::DomainPlan::Pattern2Break(_))
)
{
let facts = outcome
.facts
.as_ref()
.ok_or_else(|| "pattern2 strict/dev adopt failed: facts missing".to_string())?;
if facts.facts.pattern2_break.is_none() {
return Err("pattern2 strict/dev adopt failed: facts mismatch".to_string());
}
let core_plan = PlanNormalizer::normalize_pattern2_break_from_facts(builder, facts, ctx)?
.ok_or_else(|| "pattern2 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);
}

View File

@ -5,12 +5,34 @@ 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::pattern2_break_facts::Pattern2BreakFacts;
use crate::mir::builder::control_flow::plan::normalize::CanonicalLoopFacts;
use crate::mir::builder::control_flow::plan::Pattern2PromotionHint;
use crate::mir::builder::MirBuilder;
use crate::mir::join_ir::lowering::inline_boundary::JumpArgsLayout;
use crate::mir::{BinaryOp, ConstValue, MirType};
use std::collections::BTreeMap;
impl super::PlanNormalizer {
pub(in crate::mir::builder) fn normalize_pattern2_break_from_facts(
builder: &mut MirBuilder,
facts: &CanonicalLoopFacts,
ctx: &LoopPatternContext,
) -> Result<Option<CorePlan>, String> {
let Some(pattern2) = facts.facts.pattern2_break.as_ref() else {
return Ok(None);
};
let promotion = facts
.facts
.pattern2_loopbodylocal
.as_ref()
.map(|facts| Pattern2PromotionHint::LoopBodyLocal(facts.clone()));
let parts = plan_from_facts(pattern2, promotion);
let core_plan = Self::normalize_pattern2_break(builder, parts, ctx)?;
Ok(Some(core_plan))
}
/// Pattern2Break → CorePlan 変換
///
/// CFG structure (6 blocks):
@ -311,3 +333,19 @@ impl super::PlanNormalizer {
Ok(CorePlan::Loop(loop_plan))
}
}
fn plan_from_facts(
facts: &Pattern2BreakFacts,
promotion: Option<Pattern2PromotionHint>,
) -> Pattern2BreakPlan {
Pattern2BreakPlan {
loop_var: facts.loop_var.clone(),
carrier_var: facts.carrier_var.clone(),
loop_condition: facts.loop_condition.clone(),
break_condition: facts.break_condition.clone(),
carrier_update_in_break: facts.carrier_update_in_break.clone(),
carrier_update_in_body: facts.carrier_update_in_body.clone(),
loop_increment: facts.loop_increment.clone(),
promotion,
}
}

View File

@ -19,6 +19,7 @@ run_filter() {
run_filter "pattern2" "phase29ab_pattern2_" || exit 1
run_filter "pattern2_realworld" "phase263_pattern2_" || exit 1
run_filter "pattern2_subset" "phase29ai_pattern2_break_plan_subset_ok_min_vm" || exit 1
run_filter "pattern3_ifphi_vm" "phase118_pattern3_if_sum_vm" || exit 1
run_filter "pattern1_strict_shadow_vm" "phase29ao_pattern1_strict_shadow_vm" || exit 1
run_filter "pattern1_subset_reject_extra_stmt_vm" "phase29ao_pattern1_subset_reject_extra_stmt_vm" || exit 1