Files
hakorune/docs/development/current/main/phases/phase-29af/P4-LAYOUT-CONSISTENCY-CONTRACT-INSTRUCTIONS.md

3.1 KiB
Raw Blame History

Phase 29af P4: Layout Consistency Contract — Instructions

Status: Ready for execution
Scope: carrier layout / header PHI の順序整合を Fail-Fast で固定(仕様不変)

Goal

Phase 29af P3 で導入した BoundaryCarrierLayoutorder 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.rs
    • verify_header_phi_layout(boundary: &JoinInlineBoundary, info: &LoopHeaderPhiInfo) -> Result<(), String>
    • BoundaryCarrierLayoutordered_names()info.carrier_order が一致することを要求

呼び出し場所(案):

  • src/mir/builder/control_flow/joinir/merge/coordinator.rs
    • prebuild_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 のまま