From 090a0dbbaa04616c50e542d32c64e345a42a63ec Mon Sep 17 00:00:00 2001 From: tomoaki Date: Tue, 30 Dec 2025 08:31:00 +0900 Subject: [PATCH] phase29ao(p16): use block_params for pattern5 exit join --- CURRENT_TASK.md | 9 +++-- docs/development/current/main/10-Now.md | 9 ++++- docs/development/current/main/30-Backlog.md | 4 +- .../current/main/phases/phase-29ae/README.md | 1 + .../current/main/phases/phase-29ao/README.md | 8 +++- .../pattern5_infinite_early_exit.rs | 39 ++++++++++++------- .../joinir/phase29ae_regression_pack_vm.sh | 1 + 7 files changed, 48 insertions(+), 23 deletions(-) diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index a2bcce6e..b2ae0fb9 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -18,10 +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 P16)** -Pattern5 Infinite Early-Exit の after join を `Frag.block_params + EdgeArgs` 化して、exit join の PHI を emit_frag 経由に一本化する。 - -- 指示書: `docs/development/current/main/phases/phase-29ao/P16-VALUEJOIN-REAL-USAGE-PATTERN5-EXITJOIN-INSTRUCTIONS.md` +**Next implementation (Phase 29ao P17)** +TBD **2025-12-29: Phase 29am P0 COMPLETE (CorePlan If/Exit lowerer/verifier)** CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan 移行の土台を作った。 @@ -32,6 +30,9 @@ Pattern7 SplitScan の step join を `Frag.block_params + EdgeArgs` で表現し **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-30: Phase 29ao P16 COMPLETE (Pattern5 Break exit join via block_params)** +Pattern5 Infinite Early-Exit の after join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の exit PHI を撤去した。 + **2025-12-29: Phase 29am P1 COMPLETE (CoreLoopPlan.body Seq flatten)** CoreLoopPlan.body の `Seq([Effect...])` を再帰で flatten して emit できるようにした(Effect-only制約は維持)。 diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md index 1ee0fc2a..59341d92 100644 --- a/docs/development/current/main/10-Now.md +++ b/docs/development/current/main/10-Now.md @@ -2,8 +2,8 @@ ## Current Focus: Phase 29ao(CorePlan composition) -Next: Phase 29ao P16(ValueJoin exit 実使用: Pattern5 after join) -指示書: `docs/development/current/main/phases/phase-29ao/P16-VALUEJOIN-REAL-USAGE-PATTERN5-EXITJOIN-INSTRUCTIONS.md` +Next: Phase 29ao P17(TBD) +指示書: TBD 運用ルール: integration filter で phase143_* は回さない(JoinIR 回帰は phase29ae pack のみ) 運用ルール: phase286_pattern9_* は legacy pack (SKIP) を使う 移行道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` @@ -88,6 +88,11 @@ Next: Phase 29ao P16(ValueJoin exit 実使用: Pattern5 after join) - 変更: `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `docs/development/current/main/phases/phase-29ao/P15-REGRESSION-PACK-INCLUDE-PATTERN3-INSTRUCTIONS.md` - 検証: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile quick` +**2025-12-30: Phase 29ao P16 完了** ✅ +- 目的: Pattern5 Infinite Early-Exit の after join を `Frag.block_params + EdgeArgs` に移行 +- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.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 完了** ✅ - 目的: P0–P14 の成果を 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` diff --git a/docs/development/current/main/30-Backlog.md b/docs/development/current/main/30-Backlog.md index 7737872e..1dcfd48f 100644 --- a/docs/development/current/main/30-Backlog.md +++ b/docs/development/current/main/30-Backlog.md @@ -15,8 +15,8 @@ Related: - **Phase 29ao(active): CorePlan composition from Skeleton/Feature** - 入口: `docs/development/current/main/phases/phase-29ao/README.md` - - 状況: P0–P15 ✅ 完了 / Next: P16(Pattern5 after join → block_params) - - Next 指示書: `docs/development/current/main/phases/phase-29ao/P16-VALUEJOIN-REAL-USAGE-PATTERN5-EXITJOIN-INSTRUCTIONS.md` + - 状況: P0–P16 ✅ 完了 / Next: P17(TBD) + - Next 指示書: TBD - **Phase 29af(✅ COMPLETE): Boundary hygiene / regression entrypoint / carrier layout SSOT** - 入口: `docs/development/current/main/phases/phase-29af/README.md` diff --git a/docs/development/current/main/phases/phase-29ae/README.md b/docs/development/current/main/phases/phase-29ae/README.md index 81ff55c8..6238224b 100644 --- a/docs/development/current/main/phases/phase-29ae/README.md +++ b/docs/development/current/main/phases/phase-29ae/README.md @@ -7,6 +7,7 @@ Goal: JoinIR の最小回帰セットを SSOT として固定する。 - Pattern2: `phase29ab_pattern2_*` - Pattern2 (real-world): `phase263_pattern2_*` - Pattern3 (If‑Phi, VM): `phase118_pattern3_if_sum_vm` +- Pattern5 (Break, VM): `phase286_pattern5_break_vm` - Pattern6: `phase29ab_pattern6_*` - Pattern7: `phase29ab_pattern7_*` - Merge/Phi代表: `apps/tests/phase1883_nested_minimal.hako`(RC=9) diff --git a/docs/development/current/main/phases/phase-29ao/README.md b/docs/development/current/main/phases/phase-29ao/README.md index ce2ef026..62428c2e 100644 --- a/docs/development/current/main/phases/phase-29ao/README.md +++ b/docs/development/current/main/phases/phase-29ao/README.md @@ -98,7 +98,11 @@ Gate(SSOT): - 指示書: `docs/development/current/main/phases/phase-29ao/P15-REGRESSION-PACK-INCLUDE-PATTERN3-INSTRUCTIONS.md` - ねらい: P13 の実経路(Pattern3 If‑Phi)が回帰ゲート(phase29ae pack)で必ず実行されるようにする +## P16: ValueJoin exit の実使用(Pattern5 Infinite Early-Exit の after join を block_params 化)✅ + +- 指示書: `docs/development/current/main/phases/phase-29ao/P16-VALUEJOIN-REAL-USAGE-PATTERN5-EXITJOIN-INSTRUCTIONS.md` +- ねらい: after join の 1 PHI を `Frag.block_params + EdgeArgs` で表現し、exit join の経路を 1 件固定 + ## Next(planned) -- P16: ValueJoin exit の実使用(Pattern5 Infinite Early-Exit の after join を block_params 化) - - 指示書: `docs/development/current/main/phases/phase-29ao/P16-VALUEJOIN-REAL-USAGE-PATTERN5-EXITJOIN-INSTRUCTIONS.md` +- P17: TBD diff --git a/src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs b/src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs index 575e4342..f8ce4384 100644 --- a/src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs +++ b/src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs @@ -4,7 +4,9 @@ use super::{ Pattern5InfiniteEarlyExitPlan, }; 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; @@ -31,7 +33,7 @@ impl super::PlanNormalizer { /// ↑ ↓ /// └───── step ←────────── else path /// ↓ - /// then path → after_bb(PHI: carrier_out) + /// then path → after_bb(join: carrier_out) /// ``` pub(super) fn normalize_pattern5_infinite_early_exit( builder: &mut MirBuilder, @@ -428,7 +430,7 @@ impl super::PlanNormalizer { rhs: inc_rhs, }); - // Step 11: Build PHIs + // Step 11: Build PHIs (header only) let phis = vec![ CorePhiInfo { block: header_bb, @@ -442,12 +444,6 @@ impl super::PlanNormalizer { inputs: vec![(preheader_bb, carrier_init), (step_bb, carrier_step)], tag: format!("loop_carrier_{}", carrier_var), }, - CorePhiInfo { - block: after_bb, - dst: carrier_out, - inputs: vec![(break_then_bb, carrier_current)], - tag: format!("exit_carrier_{}", carrier_var), - }, ]; // Step 12: Build block_effects @@ -464,6 +460,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_current], + }; let branches = vec![ BranchStub { @@ -472,7 +476,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, @@ -491,7 +495,7 @@ impl super::PlanNormalizer { from: break_then_bb, kind: ExitKind::Break(loop_id), target: Some(after_bb), - args: empty_args.clone(), + args: break_join_args, }, EdgeStub { from: step_bb, @@ -501,9 +505,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, @@ -535,7 +548,7 @@ impl super::PlanNormalizer { if debug { trace_logger.debug( "normalizer/pattern5_break", - "CorePlan construction complete (6 blocks, 3 PHIs, after_bb PHI for carrier)", + "CorePlan construction complete (6 blocks, 2 PHIs, after_bb uses block_params)", ); } diff --git a/tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh b/tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh index 61f81d36..39ceddc9 100644 --- a/tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh +++ b/tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh @@ -20,6 +20,7 @@ run_filter() { run_filter "pattern2" "phase29ab_pattern2_" || exit 1 run_filter "pattern2_realworld" "phase263_pattern2_" || exit 1 run_filter "pattern3_ifphi_vm" "phase118_pattern3_if_sum_vm" || exit 1 +run_filter "pattern5_break_vm" "phase286_pattern5_break_vm" || exit 1 run_filter "pattern6" "phase29ab_pattern6_" || exit 1 run_filter "pattern7" "phase29ab_pattern7_" || exit 1 run_filter "phase1883" "phase1883_" || exit 1