phase29ao(p13): block_params for pattern3 if-phi merge join
This commit is contained in:
@ -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)",
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user