From f4fb798ec890121060fa2a268b5d18806ef3da87 Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Sat, 29 Nov 2025 14:19:53 +0900 Subject: [PATCH] =?UTF-8?q?feat(joinir):=20Phase=2061-3=20dev=E3=83=95?= =?UTF-8?q?=E3=83=A9=E3=82=B0=E3=83=BBif=5Fphi=5Fcontext=E6=8B=A1=E5=BC=B5?= =?UTF-8?q?=E6=BA=96=E5=82=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 61-3(If-in-loop JoinIR本番切り替え)の基盤準備: - env.rs: joinir_if_in_loop_enable() 追加 - HAKO_JOINIR_IF_IN_LOOP_ENABLE=1 で本番経路有効化 - デフォルトOFF(安全第一) - if_phi_context.rs: Phase 61-3拡張準備 - BTreeMap, ValueId, BasicBlockId import追加 - ドキュメント更新(incoming値解決メソッド予告) 設計書: docs/private/.../phase61-3-box-design.md(別途) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/config/env.rs | 17 +++++++++++++++++ src/mir/join_ir/lowering/if_phi_context.rs | 8 +++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/config/env.rs b/src/config/env.rs index 3b1447cc..7da7246f 100644 --- a/src/config/env.rs +++ b/src/config/env.rs @@ -277,6 +277,23 @@ pub fn joinir_if_in_loop_dryrun_enabled() -> bool { env_bool("HAKO_JOINIR_IF_IN_LOOP_DRYRUN") } +/// Phase 61-3: If-in-loop JoinIR本番経路有効化 +/// +/// `HAKO_JOINIR_IF_IN_LOOP_ENABLE=1` でJoinIR本番経路を有効化 +/// +/// 動作: +/// - ON: JoinIR + IfInLoopPhiEmitter経路(PhiBuilderBox不使用) +/// - OFF: PhiBuilderBox経路(既存フォールバック) +/// +/// 前提条件: +/// - NYASH_JOINIR_IF_SELECT=1(Phase 33基盤) +/// - dry-runモードとは独立(HAKO_JOINIR_IF_IN_LOOP_DRYRUN) +/// +/// デフォルト: OFF(安全第一) +pub fn joinir_if_in_loop_enable() -> bool { + env_bool("HAKO_JOINIR_IF_IN_LOOP_ENABLE") +} + // VM legacy by-name call fallback was removed (Phase 2 complete). // Phase 40-4.1: use_joinir_for_array_filter() removed (Route B now default). diff --git a/src/mir/join_ir/lowering/if_phi_context.rs b/src/mir/join_ir/lowering/if_phi_context.rs index 284dafed..cc9d4fc8 100644 --- a/src/mir/join_ir/lowering/if_phi_context.rs +++ b/src/mir/join_ir/lowering/if_phi_context.rs @@ -8,6 +8,10 @@ //! 従来は PhiBuilderBox::set_if_context() で carrier_names を渡していたが、 //! Phase 61-1 で JoinIR 経路に統一するため、この情報を渡す手段が必要。 //! +//! ## Phase 61-3 拡張 +//! +//! incoming 値解決メソッドを追加し、CFG依存ロジックをIfPhiContextに集約。 +//! //! ## 設計 //! //! ``` @@ -21,8 +25,10 @@ //! //! - ループ内 if のコンテキスト情報を保持 //! - carrier_names の判定ユーティリティ提供 +//! - Phase 61-3: incoming値解決(CFG依存ロジック) -use std::collections::BTreeSet; +use crate::mir::{BasicBlockId, ValueId}; +use std::collections::{BTreeMap, BTreeSet}; /// If-in-loop 用 PHI コンテキスト #[derive(Debug, Clone)]