4.8 KiB
4.8 KiB
Status, Scope, Related
| Status | Scope | Related | |||||
|---|---|---|---|---|---|---|---|
| Ready | code(仕様不変・strict/dev のみ Fail-Fast) |
|
Phase 29ao P9: ValueJoin minimal wire(BlockParams 足場 + strict/dev verify)
Date: 2025-12-30
Status: Draft for execution
Scope: 既定挙動は不変。ValueJoin の実配線の前に「join の受け口(block params)」を SSOT として用意し、strict/dev で contract 違反を局所で落とせるようにする。
目的
- EdgeCFG の北極星(
edgecfg-fragments.md)どおりに、join 値の合流をblock params + edge-argsで表現する足場を追加する。 - Phase 29ao P7/P8 で確立した
EdgeArgs(layout+values)を前提に、target 側が受け口を持たない / 長さがズレるなどの事故を strict/dev で Fail-Fast に固定する。 - まだ ValueJoin を「本当に使う」段階ではないので、既定挙動(release 既定・回帰 pack のログ/挙動)は不変のままにする。
非目的
- ValueJoin の本実配線(join block の PHI 生成や expr_result の読み出し)
- router/single_planner の経路変更(採用範囲の拡大)
- 新 env var の追加
- 恒常ログの追加(strict/dev のみタグは可)
提案する最小アーキテクチャ(P9 の成果物)
- EdgeCFG API に join 受け口(BlockParams)を追加する(未接続でも SSOT 型が存在する)。
- compose は BlockParams を破壊しない(合成は写像だけ、allocation は caller)。
- strict/dev の verify で “edge-args と block params の整合” をチェックする(release は不変)。
実装手順
Step 1: EdgeCFG に BlockParams 型を追加
新規ファイル(推奨):
src/mir/builder/control_flow/edgecfg/api/block_params.rs
例(方向性):
pub struct BlockParams { pub layout: JumpArgsLayout, pub params: Vec<ValueId> }layoutはEdgeArgs.layoutと同一 SSOT を参照するparams.len()はEdgeArgs.values.len()と一致する(expr_result + carriers の長さ)
Step 2: Frag に block_params を追加(既定は空)
対象:
src/mir/builder/control_flow/edgecfg/api/frag.rs
やること:
Frag { .. }にpub block_params: BTreeMap<BasicBlockId, BlockParams>を追加Frag::new/Frag::with_single_exitの既定はBTreeMap::new()
Step 3: compose が block_params を合成しても壊れないことを固定
対象:
src/mir/builder/control_flow/edgecfg/api/compose/seq.rssrc/mir/builder/control_flow/edgecfg/api/compose/if_.rssrc/mir/builder/control_flow/edgecfg/api/compose/cleanup.rs
やること:
Fragを返すときにblock_paramsを merge(衝突は strict/dev で Fail-Fast)- SSOT 方針:
BasicBlockIdが同じなら同じ join のはずなので、二重定義は contract violation
- SSOT 方針:
Step 4: strict/dev verify を追加(ValueJoin 事故の早期検知)
対象(候補):
src/mir/builder/control_flow/edgecfg/api/verify.rs
追加する検証(strict/dev のみ):
wires/branchesにEdgeArgs.layout == ExprResultPlusCarriersが現れる場合:targetblock にblock_params[target]が存在することblock_params[target].layout == ExprResultPlusCarriersblock_params[target].params.len() == edge_args.values.len()
注:
- Phase 29ao P7 で PlanVerifier 側に V13 があるので、P9 は EdgeCFG 側の “受け口” を固定する(責務分離)。
Step 5: unit tests(Some/None 境界と Fail-Fast の固定)
推奨:
src/mir/builder/control_flow/edgecfg/api/verify.rsにverify_frag_invariants_strict()に並ぶ strict 検証を追加するなら、その関数単体の unit tests をここに追加compose側の unit tests でblock_paramsが保持されることを確認(P8 と同じスタイル)
検証(必須)
cargo test --release -p nyash-rust --libcargo build --release./tools/smokes/v2/run.sh --profile quick./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh
コミット
git add -Agit commit -m "phase29ao(p9): scaffold block params for valuejoin (strict/dev verify)"
次(P10 の方向性)
P10 では、最小ケース(If2 か loop の after join のどちらか 1つ)に対して:
block_paramsを normalizer が生成する- join block で PHI(または block param lowering)を 1 箇所に固定
post-phi-final-form-ssot.mdの “局所 verify” と整合させる