phase29ao(p23): strict/dev adopt pattern3 from facts

This commit is contained in:
2025-12-30 10:15:23 +09:00
parent dbf9438cbb
commit 314231d6ea
6 changed files with 71 additions and 9 deletions

View File

@ -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);
}

View File

@ -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<Option<CorePlan>, 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(),
}
}