feat(joinir): Phase 61-1 If-in-loop JoinIR化インフラ整備完了
## 実装内容 ### 新規ファイル - `if_phi_context.rs`: If-in-loop用PHIコンテキスト構造体 (135行) - `IfPhiContext::for_loop_body()`: ループ内if用コンストラクタ - `is_carrier()`: ループキャリア変数判定 - 単体テスト2個完全動作 ### 既存ファイル拡張 - `if_select.rs`, `if_merge.rs`: context パラメータ追加 (+68行) - `with_context()` コンストラクタ実装 - Pure If との完全互換性維持 - `mod.rs`: `try_lower_if_to_joinir()` シグネチャ拡張 (+25行) - `context: Option<&IfPhiContext>` パラメータ追加 - 既存呼び出し箇所6箇所修正完了 - `loop_builder.rs`: JoinIR経路実装 (+43行) - `NYASH_JOINIR_IF_SELECT=1` で試行 - フォールバック設計(PhiBuilderBox経路保持) - デバッグログ完備 ## テスト結果 - ✅ loopform テスト 14/14 PASS(退行なし) - ✅ ビルド成功(エラー0件) - ✅ Borrow Checker 問題解決 ## コード変更量 - 新規: +135行 - 拡張: +136行 - 削除: -18行 - 純増: +253行(インフラ投資、Phase 61-3で-226行削減予定) ## 次のステップ Phase 61-2: join_inst dry-run実装で実際のPHI生成を行う 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -22,6 +22,7 @@ pub mod funcscanner_trim;
|
||||
pub mod generic_case_a;
|
||||
pub mod if_dry_runner; // Phase 33-10.0
|
||||
pub mod if_merge; // Phase 33-7
|
||||
pub mod if_phi_context; // Phase 61-1
|
||||
pub mod if_select; // Phase 33
|
||||
pub mod loop_form_intake;
|
||||
pub mod loop_scope_shape;
|
||||
@ -92,11 +93,16 @@ pub(crate) fn is_loop_lowered_function(name: &str) -> bool {
|
||||
/// - 1 variable → Select
|
||||
/// - 2+ variables → IfMerge
|
||||
///
|
||||
/// Phase 61-1: If-in-loop support
|
||||
/// - `context` parameter: If-in-loop context (carrier_names for loop variables)
|
||||
/// - None = Pure If, Some(_) = If-in-loop
|
||||
///
|
||||
/// Returns Some(JoinInst::Select) or Some(JoinInst::IfMerge) if pattern matched, None otherwise.
|
||||
pub fn try_lower_if_to_joinir(
|
||||
func: &MirFunction,
|
||||
block_id: BasicBlockId,
|
||||
debug: bool,
|
||||
context: Option<&if_phi_context::IfPhiContext>, // Phase 61-1: If-in-loop context
|
||||
) -> Option<JoinInst> {
|
||||
// 1. dev トグルチェック
|
||||
if !crate::config::env::joinir_if_select_enabled() {
|
||||
@ -151,7 +157,12 @@ pub fn try_lower_if_to_joinir(
|
||||
|
||||
// 3. Phase 33-7: IfMerge を優先的に試行(複数変数パターン)
|
||||
// IfMerge が成功すればそれを返す、失敗したら Select を試行
|
||||
let if_merge_lowerer = if_merge::IfMergeLowerer::new(debug_level);
|
||||
// Phase 61-1: context がある場合は with_context() を使用
|
||||
let if_merge_lowerer = if let Some(ctx) = context {
|
||||
if_merge::IfMergeLowerer::with_context(debug_level, ctx.clone())
|
||||
} else {
|
||||
if_merge::IfMergeLowerer::new(debug_level)
|
||||
};
|
||||
|
||||
if if_merge_lowerer.can_lower_to_if_merge(func, block_id) {
|
||||
if let Some(result) = if_merge_lowerer.lower_if_to_if_merge(func, block_id) {
|
||||
@ -166,7 +177,12 @@ pub fn try_lower_if_to_joinir(
|
||||
}
|
||||
|
||||
// 4. IfMerge が失敗したら Select を試行(単一変数パターン)
|
||||
let if_select_lowerer = if_select::IfSelectLowerer::new(debug_level);
|
||||
// Phase 61-1: context がある場合は with_context() を使用
|
||||
let if_select_lowerer = if let Some(ctx) = context {
|
||||
if_select::IfSelectLowerer::with_context(debug_level, ctx.clone())
|
||||
} else {
|
||||
if_select::IfSelectLowerer::new(debug_level)
|
||||
};
|
||||
|
||||
if !if_select_lowerer.can_lower_to_select(func, block_id) {
|
||||
if debug_level >= 1 {
|
||||
|
||||
Reference in New Issue
Block a user