phase29ao(p24): strict/dev adopt pattern7 from facts
This commit is contained in:
@ -379,6 +379,25 @@ 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::SplitScan(_)
|
||||
)
|
||||
{
|
||||
let facts = outcome
|
||||
.facts
|
||||
.as_ref()
|
||||
.ok_or_else(|| "pattern7 strict/dev adopt failed: facts missing".to_string())?;
|
||||
if facts.facts.split_scan.is_none() {
|
||||
return Err("pattern7 strict/dev adopt failed: facts mismatch".to_string());
|
||||
}
|
||||
let core_plan = PlanNormalizer::normalize_split_scan_from_facts(builder, facts, ctx)?
|
||||
.ok_or_else(|| "pattern7 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);
|
||||
}
|
||||
|
||||
|
||||
@ -4,6 +4,8 @@ use crate::mir::builder::control_flow::edgecfg::api::{
|
||||
compose, BlockParams, BranchStub, EdgeStub, ExitKind, Frag,
|
||||
};
|
||||
use crate::mir::builder::control_flow::joinir::patterns::router::LoopPatternContext;
|
||||
use crate::mir::builder::control_flow::plan::facts::loop_facts::SplitScanFacts;
|
||||
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};
|
||||
@ -11,6 +13,20 @@ use std::collections::BTreeMap;
|
||||
use super::common::empty_args;
|
||||
|
||||
impl super::PlanNormalizer {
|
||||
pub(in crate::mir::builder) fn normalize_split_scan_from_facts(
|
||||
builder: &mut MirBuilder,
|
||||
facts: &CanonicalLoopFacts,
|
||||
ctx: &LoopPatternContext,
|
||||
) -> Result<Option<CorePlan>, String> {
|
||||
let Some(split_scan) = facts.facts.split_scan.as_ref() else {
|
||||
return Ok(None);
|
||||
};
|
||||
|
||||
let parts = plan_from_facts(split_scan);
|
||||
let core_plan = Self::normalize_split_scan(builder, parts, ctx)?;
|
||||
Ok(Some(core_plan))
|
||||
}
|
||||
|
||||
/// SplitScan → CorePlan 変換
|
||||
///
|
||||
/// Expands split-specific semantics into generic CorePlan:
|
||||
@ -452,3 +468,13 @@ impl super::PlanNormalizer {
|
||||
Ok(CorePlan::Loop(loop_plan))
|
||||
}
|
||||
}
|
||||
|
||||
fn plan_from_facts(facts: &SplitScanFacts) -> SplitScanPlan {
|
||||
SplitScanPlan {
|
||||
s_var: facts.s_var.clone(),
|
||||
sep_var: facts.sep_var.clone(),
|
||||
result_var: facts.result_var.clone(),
|
||||
i_var: facts.i_var.clone(),
|
||||
start_var: facts.start_var.clone(),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user