diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 30656af3..6170338c 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -18,8 +18,11 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu **CorePlan migration 道筋 SSOT** `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。 -**Next implementation (Phase 29ao P13)** -TBD +**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` **2025-12-29: Phase 29am P0 COMPLETE (CorePlan If/Exit lowerer/verifier)** CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan 移行の土台を作った。 diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md index 5a6bd504..f6bff863 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 P13(ValueJoin expr_result minimal usage) -指示書: TBD +Next: Phase 29ao P14(ValueJoin exit 実使用: Pattern2 Break after join) +指示書: `docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md` 運用ルール: integration filter で phase143_* は回さない(JoinIR 回帰は phase29ae pack のみ) 運用ルール: phase286_pattern9_* は legacy pack (SKIP) を使う 移行道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` @@ -71,7 +71,12 @@ Next: Phase 29ao P13(ValueJoin expr_result minimal usage) **2025-12-30: Phase 29ao P12 完了** ✅ - 目的: Pattern7 SplitScan の step join を `Frag.block_params + EdgeArgs` に移行 - 変更: `src/mir/builder/control_flow/plan/normalizer/pattern_split_scan.rs` / `src/mir/builder/control_flow/plan/normalizer/common.rs` -- 検証: `cargo test --release -p nyash-rust --lib` (FAILED: runtime::plugin_loader_v2::enabled::loader::library::tests::load_all_plugins_strict_fails_on_missing_library) / `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` +- 検証: `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 P13 完了** ✅ +- 目的: Pattern3 If‑Phi の merge join を `Frag.block_params + EdgeArgs` に移行(expr_result 的な 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-29: Phase 29an P15 完了** ✅ - 目的: P0–P14 の成果を closeout 形式でまとめ、次フェーズ(Phase 29ao)入口を固定 diff --git a/docs/development/current/main/30-Backlog.md b/docs/development/current/main/30-Backlog.md index 97be0f10..19b94e18 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/P1/P2/P3/P4/P5/P6/P7/P8/P9/P10/P11/P12 ✅ 完了 / Next: P13(TBD) - - Next 指示書: TBD + - 状況: P0–P13 ✅ 完了 / Next: P14(Pattern2 Break after join → block_params) + - Next 指示書: `docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md` - **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-29ao/P13-VALUEJOIN-REAL-USAGE-PATTERN3-IFPHI-MERGE-INSTRUCTIONS.md b/docs/development/current/main/phases/phase-29ao/P13-VALUEJOIN-REAL-USAGE-PATTERN3-IFPHI-MERGE-INSTRUCTIONS.md new file mode 100644 index 00000000..4b8700ff --- /dev/null +++ b/docs/development/current/main/phases/phase-29ao/P13-VALUEJOIN-REAL-USAGE-PATTERN3-IFPHI-MERGE-INSTRUCTIONS.md @@ -0,0 +1,85 @@ +--- +Status: Ready +Scope: code(仕様不変) +Related: + - docs/development/current/main/phases/phase-29ao/README.md + - docs/development/current/main/design/post-phi-final-form-ssot.md + - docs/development/current/main/design/edgecfg-fragments.md + - docs/development/current/main/phases/phase-29ae/README.md +--- + +# Phase 29ao P13: ValueJoin expr_result の実使用(Pattern3 If‑Phi の merge join を block_params 化) + +Date: 2025-12-30 +Status: Ready for execution +Scope: 仕様不変。P10 で用意した `Frag.block_params → emit_frag() の PHI` を、**実経路(Pattern3 If‑Phi)**で 1 箇所だけ使い始める。 + +## 目的 + +- Pattern3 If‑Phi の `then/else → merge_bb` の合流(これまで `CorePhiInfo` で表現していた PHI)を、 + **`Frag.block_params + EdgeArgs(values)`** に置き換える。 +- これにより “expr_result 的な join 値(単一値)を EdgeCFG の SSOT(block params + edge-args)で表す” を、実経路で 1 件固定できる。 + +## 非目的 + +- loop header の 2 PHI(loop_var/carrier)を block_params 化する(今回は merge join の 1 本だけ) +- DomainPlan/Planner の拡張(P13 は Normalizer の内部表現だけ差し替え) +- 新 env var 追加、恒常ログ追加、エラー文字列変更 + +## 対象(最小) + +- `src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs` + - 現状: `CorePhiInfo` 3 本(header 2 本 + merge 1 本) + - 変更: **merge の 1 本だけ**を block_params へ移し、`CorePhiInfo` から除去する + +## 変換方針(SSOT) + +### before + +- `merge_bb` に `CorePhiInfo { dst: carrier_next, inputs: [(then_bb, carrier_then), (else_bb, carrier_else)] }` +- `then_bb → merge_bb` / `else_bb → merge_bb` の Normal exit args は空(`CarriersOnly + values=[]`) + +### after + +- `Frag.block_params[merge_bb] = BlockParams { layout: ExprResultPlusCarriers, params: [carrier_next] }` +- `then_bb → merge_bb` の Normal exit args: + - `layout=ExprResultPlusCarriers` + - `values=[carrier_then]` +- `else_bb → merge_bb` の Normal exit args: + - `layout=ExprResultPlusCarriers` + - `values=[carrier_else]` + +注: `ExprResultPlusCarriers` は “先頭 1 slot + carriers” の SSOT 語彙だが、P13 では **join の単一値を運ぶ最小ラベル**として使う。 +(layout/len が一致していれば、PHI は機械的に挿入できる。) + +## 実装手順 + +### Step 1: merge PHI 1 本を CorePhiInfo から削除 + +- `pattern3_if_phi.rs` の `phis` 生成で、`block: merge_bb` の 1 件を削除する +- `header_bb` の 2 PHI はそのまま維持する(仕様不変) + +### Step 2: then/else の Normal args を “join 値” にする + +- `then_bb → merge_bb` / `else_bb → merge_bb` の `EdgeStub.args` を `ExprResultPlusCarriers + values=[…]` に差し替える +- それ以外の branch/wire の args は既存どおり空のまま + +### Step 3: frag に block_params を追加 + +- `frag.block_params.insert(merge_bb, BlockParams { layout: ExprResultPlusCarriers, params: vec![carrier_next] })` +- これにより P10 の `emit_frag()` が merge_bb に 1 本の PHI を挿入する + +## 検証(必須) + +- `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` + +任意(Pattern3 固定を強くしたい場合): +- `./tools/smokes/v2/run.sh --profile integration --filter "phase118_pattern3_if_sum_vm"` + +## コミット + +- `git add -A` +- `git commit -m "phase29ao(p13): use block_params for pattern3 if-phi merge join"` diff --git a/docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md b/docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md new file mode 100644 index 00000000..2deff60c --- /dev/null +++ b/docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md @@ -0,0 +1,89 @@ +--- +Status: Ready +Scope: code(仕様不変) +Related: + - docs/development/current/main/phases/phase-29ao/README.md + - docs/development/current/main/design/post-phi-final-form-ssot.md + - docs/development/current/main/design/edgecfg-fragments.md + - docs/development/current/main/phases/phase-29ae/README.md +--- + +# Phase 29ao P14: ValueJoin exit の実使用(Pattern2 Break の after join を block_params 化) + +Date: 2025-12-30 +Status: Ready for execution +Scope: 仕様不変。P10 の `Frag.block_params → emit_frag() の PHI` を、**exit join(loop の出口合流)**で 1 箇所だけ使い始める。 + +## 目的 + +- Pattern2 Break の loop exit 合流(`after_bb` の PHI)を **`Frag.block_params + EdgeArgs(values)`** に置き換える。 +- `CorePhiInfo` の “exit 側の PHI” を減らし、join の表現を EdgeCFG の SSOT に寄せる。 +- JoinIR 回帰 SSOT(phase29ae pack)を緑のまま維持する(Pattern2 は pack に入っている)。 + +## 非目的 + +- loop header の 2 PHI(loop_var/carrier)を block_params 化する +- break/continue の ExitMap 合成や cleanup の拡張(今回の対象は “after join 1 本” のみ) +- 新 env var 追加、恒常ログ追加、エラー文字列変更 + +## 対象(最小) + +- `src/mir/builder/control_flow/plan/normalizer/pattern2_break.rs` + - 現状: `CorePhiInfo` 3 本(header 2 本 + after 1 本) + - 変更: **after の 1 本だけ**を block_params へ移し、`CorePhiInfo` から除去する + +## 変換方針(SSOT) + +### before + +- `after_bb` に `CorePhiInfo { dst: carrier_out, inputs: [(header_bb, carrier_current), (break_then_bb, carrier_break)] }` +- `header_bb → after_bb` の else_args は空(`CarriersOnly + values=[]`) +- `break_then_bb → after_bb` の wire args も空 + +### after + +- `Frag.block_params[after_bb] = BlockParams { layout: ExprResultPlusCarriers, params: [carrier_out] }` +- `header_bb → after_bb`(loop 終了)の else_args: + - `layout=ExprResultPlusCarriers` + - `values=[carrier_current]` +- `break_then_bb → after_bb` の Normal wire args: + - `layout=ExprResultPlusCarriers` + - `values=[carrier_break]` + +注: `ExprResultPlusCarriers` は “先頭 1 slot + carriers” の SSOT 語彙だが、P14 では **exit join の単一値を運ぶ最小ラベル**として使う。 + +## 実装手順 + +### Step 1: after PHI 1 本を CorePhiInfo から削除 + +- `pattern2_break.rs` の `phis` 生成で、`block: after_bb` の 1 件を削除する +- `header_bb` の 2 PHI はそのまま維持する(仕様不変) + +### Step 2: header の loop exit edge args を “join 値” にする + +- `header_bb` の loop condition branch(`cond_loop`)で、`else_target=after_bb` の `else_args` を差し替える + +### Step 3: break_then → after の args を “join 値” にする + +- `break_then_bb → after_bb` の `EdgeStub.args` を差し替える + +### Step 4: frag に block_params を追加 + +- `frag.block_params.insert(after_bb, BlockParams { layout: ExprResultPlusCarriers, params: vec![carrier_out] })` +- これにより P10 の `emit_frag()` が after_bb に 1 本の PHI を挿入する + +## 検証(必須) + +- `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` + +任意(Pattern2 だけ回す): +- `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern2_"` + +## コミット + +- `git add -A` +- `git commit -m "phase29ao(p14): use block_params for pattern2 break exit join"` + diff --git a/docs/development/current/main/phases/phase-29ao/README.md b/docs/development/current/main/phases/phase-29ao/README.md index d35fb2d6..b2a7530a 100644 --- a/docs/development/current/main/phases/phase-29ao/README.md +++ b/docs/development/current/main/phases/phase-29ao/README.md @@ -83,6 +83,12 @@ Gate(SSOT): - 指示書: `docs/development/current/main/phases/phase-29ao/P12-VALUEJOIN-FIRST-REAL-USAGE-PATTERN7-SPLITSCAN-INSTRUCTIONS.md` - ねらい: step join の 2 PHI を `Frag.block_params + EdgeArgs` で表現し、emit_frag() の挿入経路を 1 件固定 +## P13: ValueJoin expr_result の実使用(Pattern3 If‑Phi の merge join を block_params 化)✅ + +- 指示書: `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 件固定 + ## Next(planned) -- P13: ValueJoin expr_result の最小実使用(TBD) +- 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` diff --git a/src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs b/src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs index 8634000d..c68d0608 100644 --- a/src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs +++ b/src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs @@ -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)", ); }