phase29ao(p14): use block_params for pattern2 break exit join

This commit is contained in:
2025-12-30 08:09:40 +09:00
parent f0025f6b34
commit 9458231127
5 changed files with 46 additions and 24 deletions

View File

@ -18,11 +18,8 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu
**CorePlan migration 道筋 SSOT**
`docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。
**Next implementation (Phase 29ao P14)**
ValueJoin exit の実使用を 1 件固定Pattern2 Break の after join を `Frag.block_params + EdgeArgs` 化)。
- 指示書: `docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md`
- Gate: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
**Next implementation (Phase 29ao P15)**
TBD
**2025-12-29: Phase 29am P0 COMPLETE (CorePlan If/Exit lowerer/verifier)**
CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan 移行の土台を作った。
@ -30,6 +27,9 @@ CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan
**2025-12-30: Phase 29ao P12 COMPLETE (Pattern7 SplitScan step join via block_params)**
Pattern7 SplitScan の step join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の step PHI を撤去した。
**2025-12-30: Phase 29ao P14 COMPLETE (Pattern2 Break exit join via block_params)**
Pattern2 Break の after join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の after PHI を撤去した。
**2025-12-29: Phase 29am P1 COMPLETE (CoreLoopPlan.body Seq flatten)**
CoreLoopPlan.body の `Seq([Effect...])` を再帰で flatten して emit できるようにしたEffect-only制約は維持

View File

@ -2,8 +2,8 @@
## Current Focus: Phase 29aoCorePlan composition
Next: Phase 29ao P14ValueJoin exit 実使用: Pattern2 Break after join
指示書: `docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md`
Next: Phase 29ao P15TBD
指示書: TBD
運用ルール: integration filter で phase143_* は回さないJoinIR 回帰は phase29ae pack のみ)
運用ルール: phase286_pattern9_* は legacy pack (SKIP) を使う
移行道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`
@ -78,6 +78,11 @@ Next: Phase 29ao P14ValueJoin exit 実使用: Pattern2 Break after join
- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs` / `docs/development/current/main/phases/phase-29ao/P13-VALUEJOIN-REAL-USAGE-PATTERN3-IFPHI-MERGE-INSTRUCTIONS.md`
- 検証: `cargo test --release -p nyash-rust --lib` / `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 P14 完了**
- 目的: Pattern2 Break の after join を `Frag.block_params + EdgeArgs` に移行
- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern2_break.rs` / `docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md`
- 検証: `cargo test --release -p nyash-rust --lib` / `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
**2025-12-29: Phase 29an P15 完了**
- 目的: P0P14 の成果を closeout 形式でまとめ、次フェーズPhase 29ao入口を固定
- 変更: `docs/development/current/main/phases/phase-29an/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md`

View File

@ -15,8 +15,8 @@ Related:
- **Phase 29aoactive: CorePlan composition from Skeleton/Feature**
- 入口: `docs/development/current/main/phases/phase-29ao/README.md`
- 状況: P0P13 ✅ 完了 / Next: P14Pattern2 Break after join → block_params
- Next 指示書: `docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md`
- 状況: P0P14 ✅ 完了 / Next: P15TBD
- Next 指示書: TBD
- **Phase 29af✅ COMPLETE: Boundary hygiene / regression entrypoint / carrier layout SSOT**
- 入口: `docs/development/current/main/phases/phase-29af/README.md`

View File

@ -88,7 +88,11 @@ GateSSOT:
- 指示書: `docs/development/current/main/phases/phase-29ao/P13-VALUEJOIN-REAL-USAGE-PATTERN3-IFPHI-MERGE-INSTRUCTIONS.md`
- ねらい: merge join の 1 PHI を `Frag.block_params + EdgeArgs` で表現し、expr_result 的な join 値の経路を 1 件固定
## P14: ValueJoin exit の実使用Pattern2 Break の after join を block_params 化)✅
- 指示書: `docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md`
- ねらい: after join の 1 PHI を `Frag.block_params + EdgeArgs` で表現し、exit join の経路を 1 件固定
## Nextplanned
- P14: ValueJoin exit の実使用Pattern2 Break の after join を block_params 化)
- 指示書: `docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md`
- P15: TBD

View File

@ -1,7 +1,9 @@
use super::helpers::create_phi_bindings;
use super::{CoreEffectPlan, CoreLoopPlan, CorePhiInfo, CorePlan, Pattern2BreakPlan};
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;
@ -22,7 +24,7 @@ impl super::PlanNormalizer {
/// (optional ↓
/// update) header (back-edge)
/// ↓
/// after_bb(PHI: carrier_out)
/// after_bb(join: carrier_out)
/// ↑
/// header (natural exit when !cond_loop)
/// ```
@ -195,7 +197,7 @@ impl super::PlanNormalizer {
(step_bb, step_effects),
];
// Step 10: Build PHIs
// Step 10: Build PHIs (header only)
let phis = vec![
CorePhiInfo {
block: header_bb,
@ -209,12 +211,6 @@ impl super::PlanNormalizer {
inputs: vec![(preheader_bb, carrier_init), (step_bb, carrier_step)],
tag: format!("carrier_{}", parts.carrier_var),
},
CorePhiInfo {
block: after_bb,
dst: carrier_out,
inputs: vec![(header_bb, carrier_current), (break_then_bb, carrier_break)],
tag: format!("after_{}", parts.carrier_var),
},
];
// Step 11: Build Frag
@ -222,6 +218,14 @@ impl super::PlanNormalizer {
layout: JumpArgsLayout::CarriersOnly,
values: vec![],
};
let after_join_args = EdgeArgs {
layout: JumpArgsLayout::ExprResultPlusCarriers,
values: vec![carrier_current],
};
let break_join_args = EdgeArgs {
layout: JumpArgsLayout::ExprResultPlusCarriers,
values: vec![carrier_break],
};
let branches = vec![
BranchStub {
@ -230,7 +234,7 @@ impl super::PlanNormalizer {
then_target: body_bb,
else_target: after_bb,
then_args: empty_args.clone(),
else_args: empty_args.clone(),
else_args: after_join_args,
},
BranchStub {
from: body_bb,
@ -247,7 +251,7 @@ impl super::PlanNormalizer {
from: break_then_bb,
kind: ExitKind::Normal,
target: Some(after_bb),
args: empty_args.clone(),
args: break_join_args,
},
EdgeStub {
from: step_bb,
@ -257,9 +261,18 @@ impl super::PlanNormalizer {
},
];
let mut block_params = BTreeMap::new();
block_params.insert(
after_bb,
BlockParams {
layout: JumpArgsLayout::ExprResultPlusCarriers,
params: vec![carrier_out],
},
);
let frag = Frag {
entry: header_bb,
block_params: BTreeMap::new(),
block_params,
exits: BTreeMap::new(),
wires,
branches,
@ -291,7 +304,7 @@ impl super::PlanNormalizer {
if debug {
trace_logger.debug(
"normalizer/pattern2_break",
"CorePlan construction complete (6 blocks, 3 PHIs, after_bb PHI is key!)",
"CorePlan construction complete (6 blocks, 2 PHIs, after_bb uses block_params)",
);
}