phase29ao(p30): move shadow adopt composer ssot
This commit is contained in:
@ -18,9 +18,12 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu
|
||||
**CorePlan migration 道筋 SSOT**
|
||||
`docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。
|
||||
|
||||
**Next implementation (Phase 29ao P30)**
|
||||
- 目的: Facts→CorePlan の入口を `plan/composer` に集約し、Normalizer の責務を DomainPlan→CorePlan に縮退(挙動不変)
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P30-MOVE-SHADOW-ADOPT-COMPOSER-SSOT-INSTRUCTIONS.md`
|
||||
**Next implementation (Phase 29ao P31)**
|
||||
- 目的: TBD
|
||||
- 指示書: TBD
|
||||
|
||||
**2025-12-30: Phase 29ao P30 COMPLETE (Shadow adopt composer SSOT)**
|
||||
Facts→CorePlan の入口を `plan/composer` に集約し、Normalizer の責務を DomainPlan→CorePlan に縮退した(挙動不変)。
|
||||
|
||||
**2025-12-30: Phase 29ao P25 COMPLETE (Pattern5 strict/dev adopt from facts)**
|
||||
Pattern5(Infinite Early-Exit)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。
|
||||
|
||||
@ -2,12 +2,17 @@
|
||||
|
||||
## Current Focus: Phase 29ao(CorePlan composition)
|
||||
|
||||
Next: Phase 29ao P30(Shadow adopt composer SSOT)
|
||||
指示書: `docs/development/current/main/phases/phase-29ao/P30-MOVE-SHADOW-ADOPT-COMPOSER-SSOT-INSTRUCTIONS.md`
|
||||
Next: Phase 29ao P31(TBD)
|
||||
指示書: TBD
|
||||
運用ルール: integration filter で phase143_* は回さない(JoinIR 回帰は phase29ae pack のみ)
|
||||
運用ルール: phase286_pattern9_* は legacy pack (SKIP) を使う
|
||||
移行道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`
|
||||
|
||||
**2025-12-30: Phase 29ao P30 完了** ✅
|
||||
- 目的: Facts→CorePlan の入口を `plan/composer` に集約し、Normalizer の責務を DomainPlan→CorePlan に縮退(挙動不変)
|
||||
- 変更: `src/mir/builder/control_flow/plan/composer/shadow_adopt.rs` / `src/mir/builder/control_flow/plan/composer/mod.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern2_break.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern_scan_with_init.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern_split_scan.rs` / `docs/development/current/main/phases/phase-29ao/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md` / `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`
|
||||
- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
|
||||
|
||||
**2025-12-30: Phase 29ao P29 完了** ✅
|
||||
- 目的: regression gate 全パターンで shadow adopt タグを必須化し、strict/dev 実踏みを SSOT 化(仕様不変)
|
||||
- 変更: `src/mir/builder/control_flow/joinir/patterns/router.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern1_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern5_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/apps/phase29ai_pattern2_break_plan_subset_ok_min_vm.sh` / `tools/smokes/v2/profiles/integration/apps/phase118_pattern3_if_sum_vm.sh` / `tools/smokes/v2/lib/test_runner.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `docs/development/current/main/phases/phase-29ao/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md` / `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`
|
||||
|
||||
@ -15,8 +15,8 @@ Related:
|
||||
|
||||
- **Phase 29ao(active): CorePlan composition from Skeleton/Feature**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ao/README.md`
|
||||
- 状況: P0–P29 ✅ 完了 / Next: P30(Shadow adopt composer SSOT)
|
||||
- Next 指示書: `docs/development/current/main/phases/phase-29ao/P30-MOVE-SHADOW-ADOPT-COMPOSER-SSOT-INSTRUCTIONS.md`
|
||||
- 状況: P0–P30 ✅ 完了 / Next: P31(TBD)
|
||||
- Next 指示書: TBD
|
||||
|
||||
- **Phase 29af(✅ COMPLETE): Boundary hygiene / regression entrypoint / carrier layout SSOT**
|
||||
- 入口: `docs/development/current/main/phases/phase-29af/README.md`
|
||||
|
||||
@ -34,7 +34,7 @@ Related:
|
||||
## 1.1 Current (active)
|
||||
|
||||
- Active phase: `docs/development/current/main/phases/phase-29ao/README.md`
|
||||
- Next step: `docs/development/current/main/phases/phase-29ao/P30-MOVE-SHADOW-ADOPT-COMPOSER-SSOT-INSTRUCTIONS.md`
|
||||
- Next step: Phase 29ao P31(TBD)
|
||||
|
||||
## 2. すでに固めた SSOT(再発防止の土台)
|
||||
|
||||
|
||||
@ -172,13 +172,12 @@ Gate(SSOT):
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P29-SHADOW-ADOPT-TAGS-COVERAGE-ALL-GATE-PATTERNS-INSTRUCTIONS.md`
|
||||
- ねらい: regression gate に含まれる全パターンで “shadow adopt を踏んだ” をタグ必須として固定(仕様不変)
|
||||
|
||||
## P30: Shadow adopt composer SSOT(Facts→CorePlan入口を集約)
|
||||
## P30: Shadow adopt composer SSOT(Facts→CorePlan入口を集約)✅
|
||||
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P30-MOVE-SHADOW-ADOPT-COMPOSER-SSOT-INSTRUCTIONS.md`
|
||||
- ねらい: Facts→CorePlan の入口を `plan/composer` に集約し、Normalizer の責務を DomainPlan→CorePlan に縮退(挙動不変)
|
||||
|
||||
## Next(planned)
|
||||
|
||||
- Next: P30(実装)
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P30-MOVE-SHADOW-ADOPT-COMPOSER-SSOT-INSTRUCTIONS.md`
|
||||
- After P30: P31(TBD)
|
||||
- Next: P31(TBD)
|
||||
- After P31: TBD
|
||||
|
||||
@ -28,6 +28,7 @@ use crate::mir::loop_pattern_detection::{LoopFeatures, LoopPatternKind};
|
||||
use crate::mir::builder::control_flow::plan::lowerer::PlanLowerer;
|
||||
use crate::mir::builder::control_flow::plan::normalizer::PlanNormalizer;
|
||||
use crate::mir::builder::control_flow::plan::verifier::PlanVerifier;
|
||||
use crate::mir::builder::control_flow::plan::composer;
|
||||
use crate::mir::builder::control_flow::plan::single_planner;
|
||||
|
||||
/// AST Feature Extractor (declared in mod.rs as pub module, import from parent)
|
||||
@ -349,7 +350,7 @@ pub(crate) fn route_loop_pattern(
|
||||
return Err("pattern1 strict/dev adopt failed: facts mismatch".to_string());
|
||||
}
|
||||
let core_plan =
|
||||
PlanNormalizer::normalize_loop_skeleton_from_facts(builder, facts, ctx)?
|
||||
composer::compose_coreplan_for_pattern1_simplewhile(builder, facts, ctx)?
|
||||
.ok_or_else(|| {
|
||||
"pattern1 strict/dev adopt failed: skeleton compose rejected".to_string()
|
||||
})?;
|
||||
@ -372,7 +373,7 @@ pub(crate) fn route_loop_pattern(
|
||||
return Err("pattern3 strict/dev adopt failed: facts mismatch".to_string());
|
||||
}
|
||||
let core_plan =
|
||||
PlanNormalizer::normalize_pattern3_if_phi_from_facts(builder, facts, ctx)?
|
||||
composer::compose_coreplan_for_pattern3_ifphi(builder, facts, ctx)?
|
||||
.ok_or_else(|| {
|
||||
"pattern3 strict/dev adopt failed: compose rejected".to_string()
|
||||
})?;
|
||||
@ -398,7 +399,7 @@ pub(crate) fn route_loop_pattern(
|
||||
if facts.facts.scan_with_init.is_none() {
|
||||
return Err("pattern6 strict/dev adopt failed: facts mismatch".to_string());
|
||||
}
|
||||
let core_plan = PlanNormalizer::normalize_scan_with_init_from_facts(builder, facts, ctx)?
|
||||
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]");
|
||||
@ -418,7 +419,7 @@ pub(crate) fn route_loop_pattern(
|
||||
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)?
|
||||
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]");
|
||||
@ -439,7 +440,7 @@ pub(crate) fn route_loop_pattern(
|
||||
return Err("pattern5 strict/dev adopt failed: facts mismatch".to_string());
|
||||
}
|
||||
let core_plan =
|
||||
PlanNormalizer::normalize_pattern5_infinite_early_exit_from_facts(builder, facts, ctx)?
|
||||
composer::compose_coreplan_for_pattern5_infinite_early_exit(builder, facts, ctx)?
|
||||
.ok_or_else(|| {
|
||||
"pattern5 strict/dev adopt failed: compose rejected".to_string()
|
||||
})?;
|
||||
@ -465,7 +466,7 @@ pub(crate) fn route_loop_pattern(
|
||||
if facts.facts.pattern2_break.is_none() {
|
||||
return Err("pattern2 strict/dev adopt failed: facts mismatch".to_string());
|
||||
}
|
||||
let core_plan = PlanNormalizer::normalize_pattern2_break_from_facts(builder, facts, ctx)?
|
||||
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]");
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
//! Phase 29ao P0: CorePlan composer scaffold (CanonicalLoopFacts -> CorePlan)
|
||||
|
||||
mod shadow_adopt;
|
||||
|
||||
use super::{normalizer::PlanNormalizer, CorePlan, DomainPlan, Pattern1SimpleWhilePlan};
|
||||
use crate::mir::builder::control_flow::plan::facts::skeleton_facts::SkeletonKind;
|
||||
use crate::mir::builder::control_flow::joinir::patterns::router::LoopPatternContext;
|
||||
@ -7,6 +9,15 @@ 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,
|
||||
};
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub(in crate::mir::builder) fn try_compose_domain_plan_from_canonical_facts(
|
||||
facts: &CanonicalLoopFacts,
|
||||
|
||||
133
src/mir/builder/control_flow/plan/composer/shadow_adopt.rs
Normal file
133
src/mir/builder/control_flow/plan/composer/shadow_adopt.rs
Normal file
@ -0,0 +1,133 @@
|
||||
//! Phase 29ao P30: shadow adopt composer entrypoints (Facts -> CorePlan).
|
||||
|
||||
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::{
|
||||
CorePlan, DomainPlan, Pattern2BreakPlan, Pattern2PromotionHint,
|
||||
Pattern3IfPhiPlan, Pattern5InfiniteEarlyExitPlan, ScanDirection, ScanWithInitPlan,
|
||||
SplitScanPlan,
|
||||
};
|
||||
use crate::mir::builder::MirBuilder;
|
||||
|
||||
pub(in crate::mir::builder) fn compose_coreplan_for_pattern1_simplewhile(
|
||||
builder: &mut MirBuilder,
|
||||
facts: &CanonicalLoopFacts,
|
||||
ctx: &LoopPatternContext,
|
||||
) -> Result<Option<CorePlan>, String> {
|
||||
PlanNormalizer::normalize_loop_skeleton_from_facts(builder, facts, ctx)
|
||||
}
|
||||
|
||||
pub(in crate::mir::builder) fn compose_coreplan_for_pattern2_break_subset(
|
||||
builder: &mut MirBuilder,
|
||||
facts: &CanonicalLoopFacts,
|
||||
ctx: &LoopPatternContext,
|
||||
) -> Result<Option<CorePlan>, String> {
|
||||
let Some(pattern2) = facts.facts.pattern2_break.as_ref() else {
|
||||
return Ok(None);
|
||||
};
|
||||
let promotion = facts
|
||||
.facts
|
||||
.pattern2_loopbodylocal
|
||||
.as_ref()
|
||||
.map(|facts| Pattern2PromotionHint::LoopBodyLocal(facts.clone()));
|
||||
let plan = DomainPlan::Pattern2Break(Pattern2BreakPlan {
|
||||
loop_var: pattern2.loop_var.clone(),
|
||||
carrier_var: pattern2.carrier_var.clone(),
|
||||
loop_condition: pattern2.loop_condition.clone(),
|
||||
break_condition: pattern2.break_condition.clone(),
|
||||
carrier_update_in_break: pattern2.carrier_update_in_break.clone(),
|
||||
carrier_update_in_body: pattern2.carrier_update_in_body.clone(),
|
||||
loop_increment: pattern2.loop_increment.clone(),
|
||||
promotion,
|
||||
});
|
||||
let core = PlanNormalizer::normalize(builder, plan, ctx)?;
|
||||
Ok(Some(core))
|
||||
}
|
||||
|
||||
pub(in crate::mir::builder) fn compose_coreplan_for_pattern3_ifphi(
|
||||
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 plan = DomainPlan::Pattern3IfPhi(Pattern3IfPhiPlan {
|
||||
loop_var: pattern3.loop_var.clone(),
|
||||
carrier_var: pattern3.carrier_var.clone(),
|
||||
condition: pattern3.condition.clone(),
|
||||
if_condition: pattern3.if_condition.clone(),
|
||||
then_update: pattern3.then_update.clone(),
|
||||
else_update: pattern3.else_update.clone(),
|
||||
loop_increment: pattern3.loop_increment.clone(),
|
||||
});
|
||||
let core = PlanNormalizer::normalize(builder, plan, ctx)?;
|
||||
Ok(Some(core))
|
||||
}
|
||||
|
||||
pub(in crate::mir::builder) fn compose_coreplan_for_pattern5_infinite_early_exit(
|
||||
builder: &mut MirBuilder,
|
||||
facts: &CanonicalLoopFacts,
|
||||
ctx: &LoopPatternContext,
|
||||
) -> Result<Option<CorePlan>, String> {
|
||||
let Some(pattern5) = facts.facts.pattern5_infinite_early_exit.as_ref() else {
|
||||
return Ok(None);
|
||||
};
|
||||
let plan = DomainPlan::Pattern5InfiniteEarlyExit(Pattern5InfiniteEarlyExitPlan {
|
||||
loop_var: pattern5.loop_var.clone(),
|
||||
exit_kind: pattern5.exit_kind,
|
||||
exit_condition: pattern5.exit_condition.clone(),
|
||||
exit_value: pattern5.exit_value.clone(),
|
||||
carrier_var: pattern5.carrier_var.clone(),
|
||||
carrier_update: pattern5.carrier_update.clone(),
|
||||
loop_increment: pattern5.loop_increment.clone(),
|
||||
});
|
||||
let core = PlanNormalizer::normalize(builder, plan, ctx)?;
|
||||
Ok(Some(core))
|
||||
}
|
||||
|
||||
pub(in crate::mir::builder) fn compose_coreplan_for_pattern6_scan_with_init(
|
||||
builder: &mut MirBuilder,
|
||||
facts: &CanonicalLoopFacts,
|
||||
ctx: &LoopPatternContext,
|
||||
) -> Result<Option<CorePlan>, String> {
|
||||
let Some(scan) = facts.facts.scan_with_init.as_ref() else {
|
||||
return Ok(None);
|
||||
};
|
||||
let plan = DomainPlan::ScanWithInit(ScanWithInitPlan {
|
||||
loop_var: scan.loop_var.clone(),
|
||||
haystack: scan.haystack.clone(),
|
||||
needle: scan.needle.clone(),
|
||||
step_lit: scan.step_lit,
|
||||
early_return_expr: ASTNode::Variable {
|
||||
name: scan.loop_var.clone(),
|
||||
span: Span::unknown(),
|
||||
},
|
||||
not_found_return_lit: -1,
|
||||
scan_direction: ScanDirection::Forward,
|
||||
dynamic_needle: false,
|
||||
});
|
||||
let core = PlanNormalizer::normalize(builder, plan, ctx)?;
|
||||
Ok(Some(core))
|
||||
}
|
||||
|
||||
pub(in crate::mir::builder) fn compose_coreplan_for_pattern7_split_scan(
|
||||
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 plan = DomainPlan::SplitScan(SplitScanPlan {
|
||||
s_var: split_scan.s_var.clone(),
|
||||
sep_var: split_scan.sep_var.clone(),
|
||||
result_var: split_scan.result_var.clone(),
|
||||
i_var: split_scan.i_var.clone(),
|
||||
start_var: split_scan.start_var.clone(),
|
||||
});
|
||||
let core = PlanNormalizer::normalize(builder, plan, ctx)?;
|
||||
Ok(Some(core))
|
||||
}
|
||||
@ -5,34 +5,12 @@ 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::pattern2_break_facts::Pattern2BreakFacts;
|
||||
use crate::mir::builder::control_flow::plan::normalize::CanonicalLoopFacts;
|
||||
use crate::mir::builder::control_flow::plan::Pattern2PromotionHint;
|
||||
use crate::mir::builder::MirBuilder;
|
||||
use crate::mir::join_ir::lowering::inline_boundary::JumpArgsLayout;
|
||||
use crate::mir::{BinaryOp, ConstValue, MirType};
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
impl super::PlanNormalizer {
|
||||
pub(in crate::mir::builder) fn normalize_pattern2_break_from_facts(
|
||||
builder: &mut MirBuilder,
|
||||
facts: &CanonicalLoopFacts,
|
||||
ctx: &LoopPatternContext,
|
||||
) -> Result<Option<CorePlan>, String> {
|
||||
let Some(pattern2) = facts.facts.pattern2_break.as_ref() else {
|
||||
return Ok(None);
|
||||
};
|
||||
let promotion = facts
|
||||
.facts
|
||||
.pattern2_loopbodylocal
|
||||
.as_ref()
|
||||
.map(|facts| Pattern2PromotionHint::LoopBodyLocal(facts.clone()));
|
||||
|
||||
let parts = plan_from_facts(pattern2, promotion);
|
||||
let core_plan = Self::normalize_pattern2_break(builder, parts, ctx)?;
|
||||
Ok(Some(core_plan))
|
||||
}
|
||||
|
||||
/// Pattern2Break → CorePlan 変換
|
||||
///
|
||||
/// CFG structure (6 blocks):
|
||||
@ -333,19 +311,3 @@ impl super::PlanNormalizer {
|
||||
Ok(CorePlan::Loop(loop_plan))
|
||||
}
|
||||
}
|
||||
|
||||
fn plan_from_facts(
|
||||
facts: &Pattern2BreakFacts,
|
||||
promotion: Option<Pattern2PromotionHint>,
|
||||
) -> Pattern2BreakPlan {
|
||||
Pattern2BreakPlan {
|
||||
loop_var: facts.loop_var.clone(),
|
||||
carrier_var: facts.carrier_var.clone(),
|
||||
loop_condition: facts.loop_condition.clone(),
|
||||
break_condition: facts.break_condition.clone(),
|
||||
carrier_update_in_break: facts.carrier_update_in_break.clone(),
|
||||
carrier_update_in_body: facts.carrier_update_in_body.clone(),
|
||||
loop_increment: facts.loop_increment.clone(),
|
||||
promotion,
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,28 +3,12 @@ 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:
|
||||
@ -315,15 +299,3 @@ 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(),
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,28 +8,12 @@ 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::pattern5_infinite_early_exit_facts::Pattern5InfiniteEarlyExitFacts;
|
||||
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::{ConstValue, MirType, ValueId};
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
impl super::PlanNormalizer {
|
||||
pub(in crate::mir::builder) fn normalize_pattern5_infinite_early_exit_from_facts(
|
||||
builder: &mut MirBuilder,
|
||||
facts: &CanonicalLoopFacts,
|
||||
ctx: &LoopPatternContext,
|
||||
) -> Result<Option<CorePlan>, String> {
|
||||
let Some(pattern5) = facts.facts.pattern5_infinite_early_exit.as_ref() else {
|
||||
return Ok(None);
|
||||
};
|
||||
|
||||
let parts = plan_from_facts(pattern5);
|
||||
let core_plan = Self::normalize_pattern5_infinite_early_exit(builder, parts, ctx)?;
|
||||
Ok(Some(core_plan))
|
||||
}
|
||||
|
||||
/// Pattern5InfiniteEarlyExit → CorePlan 変換 (Phase 286 P3.2)
|
||||
///
|
||||
/// Expands infinite loop with early exit into CorePlan.
|
||||
@ -571,15 +555,3 @@ impl super::PlanNormalizer {
|
||||
Ok(CorePlan::Loop(loop_plan))
|
||||
}
|
||||
}
|
||||
|
||||
fn plan_from_facts(facts: &Pattern5InfiniteEarlyExitFacts) -> Pattern5InfiniteEarlyExitPlan {
|
||||
Pattern5InfiniteEarlyExitPlan {
|
||||
loop_var: facts.loop_var.clone(),
|
||||
exit_kind: facts.exit_kind,
|
||||
exit_condition: facts.exit_condition.clone(),
|
||||
exit_value: facts.exit_value.clone(),
|
||||
carrier_var: facts.carrier_var.clone(),
|
||||
carrier_update: facts.carrier_update.clone(),
|
||||
loop_increment: facts.loop_increment.clone(),
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,31 +1,14 @@
|
||||
use super::{CoreEffectPlan, CoreLoopPlan, CorePhiInfo, CorePlan, ScanWithInitPlan};
|
||||
use crate::ast::{ASTNode, Span};
|
||||
use crate::mir::builder::control_flow::plan::ScanDirection;
|
||||
use crate::mir::basic_block::EdgeArgs;
|
||||
use crate::mir::builder::control_flow::edgecfg::api::{BranchStub, EdgeStub, ExitKind, Frag};
|
||||
use crate::mir::builder::control_flow::joinir::patterns::router::LoopPatternContext;
|
||||
use crate::mir::builder::control_flow::plan::facts::loop_facts::ScanWithInitFacts;
|
||||
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};
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
impl super::PlanNormalizer {
|
||||
pub(in crate::mir::builder) fn normalize_scan_with_init_from_facts(
|
||||
builder: &mut MirBuilder,
|
||||
facts: &CanonicalLoopFacts,
|
||||
ctx: &LoopPatternContext,
|
||||
) -> Result<Option<CorePlan>, String> {
|
||||
let Some(scan) = facts.facts.scan_with_init.as_ref() else {
|
||||
return Ok(None);
|
||||
};
|
||||
|
||||
let parts = plan_from_facts(scan);
|
||||
let core_plan = Self::normalize_scan_with_init(builder, parts, ctx)?;
|
||||
Ok(Some(core_plan))
|
||||
}
|
||||
|
||||
/// ScanWithInit → CorePlan 変換
|
||||
///
|
||||
/// Expands scan-specific semantics into generic CorePlan:
|
||||
@ -401,19 +384,3 @@ impl super::PlanNormalizer {
|
||||
Ok(CorePlan::Loop(loop_plan))
|
||||
}
|
||||
}
|
||||
|
||||
fn plan_from_facts(facts: &ScanWithInitFacts) -> ScanWithInitPlan {
|
||||
ScanWithInitPlan {
|
||||
loop_var: facts.loop_var.clone(),
|
||||
haystack: facts.haystack.clone(),
|
||||
needle: facts.needle.clone(),
|
||||
step_lit: facts.step_lit,
|
||||
early_return_expr: ASTNode::Variable {
|
||||
name: facts.loop_var.clone(),
|
||||
span: Span::unknown(),
|
||||
},
|
||||
not_found_return_lit: -1,
|
||||
scan_direction: ScanDirection::Forward,
|
||||
dynamic_needle: false,
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,8 +4,6 @@ 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};
|
||||
@ -13,20 +11,6 @@ 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:
|
||||
@ -468,13 +452,3 @@ 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