phase29ao(p31): ssot shadow adopt routing in composer

This commit is contained in:
2025-12-30 14:47:44 +09:00
parent b3e2ff57d5
commit 20a3a918be
8 changed files with 161 additions and 153 deletions

View File

@ -336,140 +336,16 @@ pub(crate) fn route_loop_pattern(
let strict_or_dev = crate::config::env::joinir_dev::strict_enabled()
|| crate::config::env::joinir_dev_enabled();
if strict_or_dev
&& matches!(
domain_plan,
crate::mir::builder::control_flow::plan::DomainPlan::Pattern1SimpleWhile(_)
)
{
let facts = outcome
.facts
.as_ref()
.ok_or_else(|| "pattern1 strict/dev adopt failed: facts missing".to_string())?;
if facts.facts.pattern1_simplewhile.is_none() {
return Err("pattern1 strict/dev adopt failed: facts mismatch".to_string());
}
let core_plan =
composer::compose_coreplan_for_pattern1_simplewhile(builder, facts, ctx)?
.ok_or_else(|| {
"pattern1 strict/dev adopt failed: skeleton compose rejected".to_string()
})?;
if let Some(adopt) = composer::try_shadow_adopt_core_plan(
builder,
ctx,
strict_or_dev,
&domain_plan,
&outcome,
)? {
let composer::ShadowAdoptOutcome { core_plan, tag } = adopt;
PlanVerifier::verify(&core_plan)?;
eprintln!("[coreplan/shadow_adopt:pattern1_simplewhile]");
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 =
composer::compose_coreplan_for_pattern3_ifphi(builder, facts, ctx)?
.ok_or_else(|| {
"pattern3 strict/dev adopt failed: compose rejected".to_string()
})?;
PlanVerifier::verify(&core_plan)?;
eprintln!("[coreplan/shadow_adopt:pattern3_ifphi]");
return PlanLowerer::lower(builder, core_plan, ctx);
}
if strict_or_dev
&& matches!(
domain_plan,
crate::mir::builder::control_flow::plan::DomainPlan::ScanWithInit(_)
)
&& matches!(
outcome.plan.as_ref(),
Some(crate::mir::builder::control_flow::plan::DomainPlan::ScanWithInit(_))
)
{
let facts = outcome
.facts
.as_ref()
.ok_or_else(|| "pattern6 strict/dev adopt failed: facts missing".to_string())?;
if facts.facts.scan_with_init.is_none() {
return Err("pattern6 strict/dev adopt failed: facts mismatch".to_string());
}
let core_plan = composer::compose_coreplan_for_pattern6_scan_with_init(builder, facts, ctx)?
.ok_or_else(|| "pattern6 strict/dev adopt failed: compose rejected".to_string())?;
PlanVerifier::verify(&core_plan)?;
eprintln!("[coreplan/shadow_adopt:pattern6_scan_with_init]");
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 = composer::compose_coreplan_for_pattern7_split_scan(builder, facts, ctx)?
.ok_or_else(|| "pattern7 strict/dev adopt failed: compose rejected".to_string())?;
PlanVerifier::verify(&core_plan)?;
eprintln!("[coreplan/shadow_adopt:pattern7_split_scan]");
return PlanLowerer::lower(builder, core_plan, ctx);
}
if strict_or_dev
&& matches!(
domain_plan,
crate::mir::builder::control_flow::plan::DomainPlan::Pattern5InfiniteEarlyExit(_)
)
{
let facts = outcome
.facts
.as_ref()
.ok_or_else(|| "pattern5 strict/dev adopt failed: facts missing".to_string())?;
if facts.facts.pattern5_infinite_early_exit.is_none() {
return Err("pattern5 strict/dev adopt failed: facts mismatch".to_string());
}
let core_plan =
composer::compose_coreplan_for_pattern5_infinite_early_exit(builder, facts, ctx)?
.ok_or_else(|| {
"pattern5 strict/dev adopt failed: compose rejected".to_string()
})?;
PlanVerifier::verify(&core_plan)?;
eprintln!("[coreplan/shadow_adopt:pattern5_infinite_early_exit]");
return PlanLowerer::lower(builder, core_plan, ctx);
}
if strict_or_dev
&& matches!(
domain_plan,
crate::mir::builder::control_flow::plan::DomainPlan::Pattern2Break(_)
)
&& matches!(
outcome.plan.as_ref(),
Some(crate::mir::builder::control_flow::plan::DomainPlan::Pattern2Break(_))
)
{
let facts = outcome
.facts
.as_ref()
.ok_or_else(|| "pattern2 strict/dev adopt failed: facts missing".to_string())?;
if facts.facts.pattern2_break.is_none() {
return Err("pattern2 strict/dev adopt failed: facts mismatch".to_string());
}
let core_plan = composer::compose_coreplan_for_pattern2_break_subset(builder, facts, ctx)?
.ok_or_else(|| "pattern2 strict/dev adopt failed: compose rejected".to_string())?;
PlanVerifier::verify(&core_plan)?;
eprintln!("[coreplan/shadow_adopt:pattern2_break_subset]");
eprintln!("{}", tag);
return PlanLowerer::lower(builder, core_plan, ctx);
}

View File

@ -9,14 +9,7 @@ use crate::mir::builder::control_flow::plan::normalize::CanonicalLoopFacts;
use crate::mir::builder::control_flow::plan::planner::Freeze;
use crate::mir::builder::MirBuilder;
pub(in crate::mir::builder) use shadow_adopt::{
compose_coreplan_for_pattern1_simplewhile,
compose_coreplan_for_pattern2_break_subset,
compose_coreplan_for_pattern3_ifphi,
compose_coreplan_for_pattern5_infinite_early_exit,
compose_coreplan_for_pattern6_scan_with_init,
compose_coreplan_for_pattern7_split_scan,
};
pub(in crate::mir::builder) use shadow_adopt::{try_shadow_adopt_core_plan, ShadowAdoptOutcome};
#[allow(dead_code)]
pub(in crate::mir::builder) fn try_compose_domain_plan_from_canonical_facts(

View File

@ -4,6 +4,7 @@ use super::PlanNormalizer;
use crate::ast::{ASTNode, Span};
use crate::mir::builder::control_flow::joinir::patterns::router::LoopPatternContext;
use crate::mir::builder::control_flow::plan::normalize::CanonicalLoopFacts;
use crate::mir::builder::control_flow::plan::planner::PlanBuildOutcome;
use crate::mir::builder::control_flow::plan::{
CorePlan, DomainPlan, Pattern2BreakPlan, Pattern2PromotionHint,
Pattern3IfPhiPlan, Pattern5InfiniteEarlyExitPlan, ScanDirection, ScanWithInitPlan,
@ -11,6 +12,11 @@ use crate::mir::builder::control_flow::plan::{
};
use crate::mir::builder::MirBuilder;
pub(in crate::mir::builder) struct ShadowAdoptOutcome {
pub core_plan: CorePlan,
pub tag: &'static str,
}
pub(in crate::mir::builder) fn compose_coreplan_for_pattern1_simplewhile(
builder: &mut MirBuilder,
facts: &CanonicalLoopFacts,
@ -131,3 +137,122 @@ pub(in crate::mir::builder) fn compose_coreplan_for_pattern7_split_scan(
let core = PlanNormalizer::normalize(builder, plan, ctx)?;
Ok(Some(core))
}
pub(in crate::mir::builder) fn try_shadow_adopt_core_plan(
builder: &mut MirBuilder,
ctx: &LoopPatternContext,
strict_or_dev: bool,
domain_plan: &DomainPlan,
outcome: &PlanBuildOutcome,
) -> Result<Option<ShadowAdoptOutcome>, String> {
if !strict_or_dev {
return Ok(None);
}
match domain_plan {
DomainPlan::Pattern1SimpleWhile(_) => {
let facts = outcome
.facts
.as_ref()
.ok_or_else(|| "pattern1 strict/dev adopt failed: facts missing".to_string())?;
if facts.facts.pattern1_simplewhile.is_none() {
return Err("pattern1 strict/dev adopt failed: facts mismatch".to_string());
}
let core_plan =
compose_coreplan_for_pattern1_simplewhile(builder, facts, ctx)?
.ok_or_else(|| {
"pattern1 strict/dev adopt failed: skeleton compose rejected"
.to_string()
})?;
Ok(Some(ShadowAdoptOutcome {
core_plan,
tag: "[coreplan/shadow_adopt:pattern1_simplewhile]",
}))
}
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 = compose_coreplan_for_pattern3_ifphi(builder, facts, ctx)?
.ok_or_else(|| "pattern3 strict/dev adopt failed: compose rejected".to_string())?;
Ok(Some(ShadowAdoptOutcome {
core_plan,
tag: "[coreplan/shadow_adopt:pattern3_ifphi]",
}))
}
DomainPlan::ScanWithInit(_) => {
if !matches!(outcome.plan.as_ref(), Some(DomainPlan::ScanWithInit(_))) {
return Ok(None);
}
let facts = outcome
.facts
.as_ref()
.ok_or_else(|| "pattern6 strict/dev adopt failed: facts missing".to_string())?;
if facts.facts.scan_with_init.is_none() {
return Err("pattern6 strict/dev adopt failed: facts mismatch".to_string());
}
let core_plan = compose_coreplan_for_pattern6_scan_with_init(builder, facts, ctx)?
.ok_or_else(|| "pattern6 strict/dev adopt failed: compose rejected".to_string())?;
Ok(Some(ShadowAdoptOutcome {
core_plan,
tag: "[coreplan/shadow_adopt:pattern6_scan_with_init]",
}))
}
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 = compose_coreplan_for_pattern7_split_scan(builder, facts, ctx)?
.ok_or_else(|| "pattern7 strict/dev adopt failed: compose rejected".to_string())?;
Ok(Some(ShadowAdoptOutcome {
core_plan,
tag: "[coreplan/shadow_adopt:pattern7_split_scan]",
}))
}
DomainPlan::Pattern5InfiniteEarlyExit(_) => {
let facts = outcome
.facts
.as_ref()
.ok_or_else(|| "pattern5 strict/dev adopt failed: facts missing".to_string())?;
if facts.facts.pattern5_infinite_early_exit.is_none() {
return Err("pattern5 strict/dev adopt failed: facts mismatch".to_string());
}
let core_plan =
compose_coreplan_for_pattern5_infinite_early_exit(builder, facts, ctx)?
.ok_or_else(|| {
"pattern5 strict/dev adopt failed: compose rejected".to_string()
})?;
Ok(Some(ShadowAdoptOutcome {
core_plan,
tag: "[coreplan/shadow_adopt:pattern5_infinite_early_exit]",
}))
}
DomainPlan::Pattern2Break(_) => {
if !matches!(outcome.plan.as_ref(), Some(DomainPlan::Pattern2Break(_))) {
return Ok(None);
}
let facts = outcome
.facts
.as_ref()
.ok_or_else(|| "pattern2 strict/dev adopt failed: facts missing".to_string())?;
if facts.facts.pattern2_break.is_none() {
return Err("pattern2 strict/dev adopt failed: facts mismatch".to_string());
}
let core_plan = compose_coreplan_for_pattern2_break_subset(builder, facts, ctx)?
.ok_or_else(|| "pattern2 strict/dev adopt failed: compose rejected".to_string())?;
Ok(Some(ShadowAdoptOutcome {
core_plan,
tag: "[coreplan/shadow_adopt:pattern2_break_subset]",
}))
}
_ => Ok(None),
}
}