Files
hakorune/docs/development/architecture/loops/loopform_ssot.md

2.0 KiB
Raw Blame History

LoopForm SSOT単一起点設計ート

目的

  • ループのPHI整形・前処理preheader Copy、header PHI seed、latch/continue 合流)を単一モジュールに集約してドリフトを防ぐ。
  • ビルダーDirect MIRとブリッジJSON v0 → MIRの双方で同一の規約と検証を通す。

SSOTSingle Source of Truth

  • 中心: src/mir/phi_core/loop_phi.rs
    • 型: IncompletePhi, VarSnapshot
    • API: prepare_loop_variables_with, seal_incomplete_phis_with, build_exit_phis_with
    • デバッグ: phi_core::common::debug_verify_phi_inputs(到達検証・重複検出)
  • Direct MIR既にSSOT使用
    • src/mir/loop_builder.rsLoopPhiOps を実装し、prepare/seal/exit を phi_core へ委譲。
    • 形状: preheader → header(φ) → body → latch → header|exitLoopForm準拠
  • JSON v0 Bridge段階移行→完了済みの範囲
    • header PHIseed/完成・exit PHI を LoopPhiOps アダプタ経由で SSOT API に委譲。
    • break/continue スナップショットは threadlocal stack で収集し、seal/build_exit に渡す。
    • 代表 parity カナリアoptinで Direct と Bridge の一致を検証。

規約(不変条件)

  • header の PHI 入力は「preheader 経由の定義済み値」と「latch/continue からの値」だけ。
  • preheader で Copy を先行挿入し、PHI 入力は Copy の出力を参照するUse-Before-Def回避
  • 1 predecessor なら直接 bindPHI省略、2つ以上で PHI を生成。
  • 検証は FailFast ではなく開発時 WARNdebug_assert)だが、将来 Core 側で整形に移管予定。

今後の移行

  • Bridge 側に LoopPhiOps 実装を追加し、prepare/seal/exit を直接呼ぶ。
  • ループ形状の生成をユーティリティ化builder/bridge 双方から共通呼び出し)。

関連

  • src/mir/loop_builder.rs
  • src/runner/json_v0_bridge/lowering/loop_.rs
  • src/mir/phi_core/common.rs