phase29ao(p13): block_params for pattern3 if-phi merge join

This commit is contained in:
2025-12-30 07:59:47 +09:00
parent c87bdad59d
commit f0025f6b34
7 changed files with 223 additions and 22 deletions

View File

@ -1,7 +1,7 @@
use super::helpers::{create_phi_bindings, LoopBlocksWithIfPhi};
use super::{CoreEffectPlan, CoreLoopPlan, CorePhiInfo, CorePlan, Pattern3IfPhiPlan};
use crate::mir::basic_block::EdgeArgs;
use crate::mir::builder::control_flow::edgecfg::api::{BranchStub, EdgeStub, ExitKind, Frag};
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::MirBuilder;
use crate::mir::join_ir::lowering::inline_boundary::JumpArgsLayout;
@ -13,7 +13,8 @@ impl super::PlanNormalizer {
///
/// Expands Pattern3 (Loop with If-Phi) semantics into generic CorePlan:
/// - CFG structure: preheader → header → body → then/else → merge → step → header
/// - 3 PHIs: 2 in header (loop_var, carrier), 1 in merge (carrier_next)
/// - 2 PHIs: in header (loop_var, carrier)
/// - merge join (carrier_next) is expressed via `Frag.block_params + EdgeArgs`
/// - If-else branching with PHI merge (no Select instruction)
pub(super) fn normalize_pattern3_if_phi(
builder: &mut MirBuilder,
@ -171,7 +172,7 @@ impl super::PlanNormalizer {
(step_bb, step_effects),
];
// Step 13: Build PHIs
// Step 13: Build PHIs (2 PHIs in header only)
let phis = vec![
CorePhiInfo {
block: header_bb,
@ -185,20 +186,23 @@ impl super::PlanNormalizer {
inputs: vec![(preheader_bb, carrier_init), (step_bb, carrier_next)],
tag: format!("carrier_{}", parts.carrier_var),
},
CorePhiInfo {
block: merge_bb,
dst: carrier_next,
inputs: vec![(then_bb, carrier_then), (else_bb, carrier_else)],
tag: format!("merge_{}", parts.carrier_var),
},
];
// Step 14: Build Frag
// Step 14: Build Frag (merge join via block_params + edge args)
let empty_args = EdgeArgs {
layout: JumpArgsLayout::CarriersOnly,
values: vec![],
};
let merge_join_args_then = EdgeArgs {
layout: JumpArgsLayout::ExprResultPlusCarriers,
values: vec![carrier_then],
};
let merge_join_args_else = EdgeArgs {
layout: JumpArgsLayout::ExprResultPlusCarriers,
values: vec![carrier_else],
};
let branches = vec![
BranchStub {
from: header_bb,
@ -223,13 +227,13 @@ impl super::PlanNormalizer {
from: then_bb,
kind: ExitKind::Normal,
target: Some(merge_bb),
args: empty_args.clone(),
args: merge_join_args_then,
},
EdgeStub {
from: else_bb,
kind: ExitKind::Normal,
target: Some(merge_bb),
args: empty_args.clone(),
args: merge_join_args_else,
},
EdgeStub {
from: merge_bb,
@ -245,9 +249,18 @@ impl super::PlanNormalizer {
},
];
let mut block_params = BTreeMap::new();
block_params.insert(
merge_bb,
BlockParams {
layout: JumpArgsLayout::ExprResultPlusCarriers,
params: vec![carrier_next],
},
);
let frag = Frag {
entry: header_bb,
block_params: BTreeMap::new(),
block_params,
exits: BTreeMap::new(),
wires,
branches,
@ -279,7 +292,7 @@ impl super::PlanNormalizer {
if debug {
trace_logger.debug(
"normalizer/pattern3_if_phi",
"CorePlan construction complete (7 blocks, 3 PHIs)",
"CorePlan construction complete (7 blocks, 2 PHIs + merge join via block_params)",
);
}