phase29ao(p23): strict/dev adopt pattern3 from facts
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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(),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user