phase29ao(p24): strict/dev adopt pattern7 from facts

This commit is contained in:
2025-12-30 10:34:31 +09:00
parent 314231d6ea
commit e122c9a7d6
8 changed files with 184 additions and 4 deletions

View File

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

View File

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