3.1 KiB
3.1 KiB
Phase 29af P4: Layout Consistency Contract — Instructions
Status: Ready for execution
Scope: carrier layout / header PHI の順序整合を Fail-Fast で固定(仕様不変)
Goal
Phase 29af P3 で導入した BoundaryCarrierLayout(order SSOT)と、merge が生成する header PHI 側の order がズレた場合に、
JoinIR merge の入口で fail-fast できる状態にする。
- “BTreeMapの反復順” などの偶然に依存して順序が崩れたとき、即時に検知できる
- Pattern2/6/7/phase1883 の回帰パックを壊さず、将来の refactor を安全にする
Non-goals
- 既定挙動の変更(release 既定では挙動不変)
- env var の追加
- ループ仕様の拡張(PHI/edge_args の新設など)
SSOT
- Carrier order SSOT:
src/mir/builder/control_flow/joinir/merge/boundary_carrier_layout.rs - Header PHI Entry/Latch contract:
docs/development/current/main/phases/phase-29ae/README.md
Implementation Steps
Step 1: Boundary の “layout長” を実質的なチェックに強化
対象: src/mir/builder/control_flow/joinir/merge/contract_checks/boundary_hygiene.rs
carrier_info があるとき:
boundary.loop_var_name == Some(carrier_info.loop_var_name)を要求(名前不整合を fail-fast)BoundaryCarrierLayout::from_boundary(boundary).ordered_names()が["loop_var", ...carrier_info.carriers]と 同名同順 で一致することを要求boundary.join_inputs.len() == boundary.host_inputs.len() == layout.len()を要求- 注: host_inputs の中身(ValueId(0) placeholder)は問わない(SkipBinding があるため)
実行条件は既存と同じ(joinir_strict または joinir_dev のみ)。
Step 2: Header PHI 側の order と BoundaryCarrierLayout を突合して fail-fast
新規チェック(案):
src/mir/builder/control_flow/joinir/merge/contract_checks/header_phi_layout.rsverify_header_phi_layout(boundary: &JoinInlineBoundary, info: &LoopHeaderPhiInfo) -> Result<(), String>BoundaryCarrierLayoutのordered_names()とinfo.carrier_orderが一致することを要求
呼び出し場所(案):
src/mir/builder/control_flow/joinir/merge/coordinator.rsprebuild_header_phis後、rewrite/merge の前(info が確定した直後)
Step 3: docs 更新(迷子防止)
docs/development/current/main/phases/phase-29af/README.md- P4 として “order consistency contract” を追記し、入口ファイルを列挙
docs/development/current/main/10-Now.md- 次にやる P4 のリンクを追記
docs/development/current/main/30-Backlog.md- Phase 29af の “Next: P4” を追記
Verification
cargo build --release./tools/smokes/v2/run.sh --profile quick./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh
Acceptance Criteria
- strict/dev を有効にしたときのみ新しい fail-fast が働く(release 既定挙動は不変)
- order mismatch を意図的に作ると、P4 の tag で freeze する(診断が安定)
- 回帰パック(phase29ae entrypoint)が PASS のまま