From d5eccc23e20aaa012f9b1d3bc4cb87d997bdd412 Mon Sep 17 00:00:00 2001 From: tomoaki Date: Tue, 30 Dec 2025 21:01:12 +0900 Subject: [PATCH] phase29ao(p51): unify split-scan v0/v1 value-join path --- docs/development/current/main/10-Now.md | 2 +- docs/development/current/main/30-Backlog.md | 2 +- .../design/coreplan-migration-roadmap-ssot.md | 2 +- .../current/main/phases/phase-29ao/README.md | 5 +++ .../control_flow/plan/composer/coreloop_v1.rs | 41 +++++++++++++++++++ 5 files changed, 49 insertions(+), 3 deletions(-) diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md index fd6dfab2..2fcc752d 100644 --- a/docs/development/current/main/10-Now.md +++ b/docs/development/current/main/10-Now.md @@ -3,7 +3,7 @@ ## Current Focus - Phase: `docs/development/current/main/phases/phase-29ao/README.md` -- Next: TBD (P50 done; see `docs/development/current/main/phases/phase-29ao/README.md`) +- Next: TBD (P51 done; see `docs/development/current/main/phases/phase-29ao/README.md`) ## Gate (SSOT) diff --git a/docs/development/current/main/30-Backlog.md b/docs/development/current/main/30-Backlog.md index 1e5a019d..1da5d160 100644 --- a/docs/development/current/main/30-Backlog.md +++ b/docs/development/current/main/30-Backlog.md @@ -5,7 +5,7 @@ Scope: 「次にやる候補」を短く列挙するメモ。入口は `docs/dev ## Active -- CorePlan migration: `docs/development/current/main/phases/phase-29ao/README.md`(Next: TBD, P50 done) +- CorePlan migration: `docs/development/current/main/phases/phase-29ao/README.md`(Next: TBD, P51 done) ## Near-Term Candidates 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 db42ee75..16207b91 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: TBD (P50 done) +- Next step: TBD (P51 done) ## 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 f891600d..dbf1791e 100644 --- a/docs/development/current/main/phases/phase-29ao/README.md +++ b/docs/development/current/main/phases/phase-29ao/README.md @@ -276,6 +276,11 @@ Gate(SSOT): - 指示書: `docs/development/current/main/phases/phase-29ao/P50-CORELOOPCOMPOSER-V1-PATTERN3-IFPHI-VALUEJOIN-INSTRUCTIONS.md` - ねらい: Pattern3 join を v1 で受理し、block_params/EdgeArgs 経由の PHI 一本化を維持(仕様不変) +## P51: CoreLoopComposer v1 — Pattern7 value-join path unification ✅ + +- 指示書: `docs/development/current/main/phases/phase-29ao/P51-CORELOOPCOMPOSER-V1-PATTERN7-VALUEJOIN-UNIFY-INSTRUCTIONS.md` +- ねらい: Pattern7 の value-join を v1 に統一し、v0 は no-join 専用に固定(仕様不変) + ## Next(planned) - Next: TBD diff --git a/src/mir/builder/control_flow/plan/composer/coreloop_v1.rs b/src/mir/builder/control_flow/plan/composer/coreloop_v1.rs index dc209947..3fbe8d05 100644 --- a/src/mir/builder/control_flow/plan/composer/coreloop_v1.rs +++ b/src/mir/builder/control_flow/plan/composer/coreloop_v1.rs @@ -255,6 +255,47 @@ mod tests { assert!(matches!(composed, Some(crate::mir::builder::control_flow::plan::CorePlan::Loop(_)))); } + #[test] + fn coreloop_v1_rejects_split_scan_without_value_join() { + let condition = ASTNode::Literal { + value: LiteralValue::Bool(true), + span: Span::unknown(), + }; + let facts = LoopFacts { + condition_shape: ConditionShape::Unknown, + step_shape: StepShape::Unknown, + skeleton: SkeletonFacts { + kind: SkeletonKind::Loop, + }, + features: LoopFeatureFacts::default(), + scan_with_init: None, + split_scan: Some(crate::mir::builder::control_flow::plan::facts::loop_facts::SplitScanFacts { + s_var: "s".to_string(), + sep_var: "sep".to_string(), + result_var: "result".to_string(), + i_var: "i".to_string(), + start_var: "start".to_string(), + shape: SplitScanShape::Minimal, + }), + pattern1_simplewhile: None, + pattern3_ifphi: None, + pattern4_continue: None, + pattern5_infinite_early_exit: None, + pattern8_bool_predicate_scan: None, + pattern9_accum_const_loop: None, + pattern2_break: None, + pattern2_loopbodylocal: None, + }; + let canonical = canonicalize_loop_facts(facts); + let mut builder = MirBuilder::new(); + builder.enter_function_for_test("coreloop_v1_split_scan_no_join".to_string()); + let ctx = + LoopPatternContext::new(&condition, &[], "coreloop_v1_split_scan_no_join", false, false); + let composed = + try_compose_core_loop_v1(&mut builder, &canonical, &ctx).expect("Ok"); + assert!(composed.is_none()); + } + #[test] fn coreloop_v1_rejects_split_scan_with_disallowed_exitmap() { let condition = ASTNode::Literal {