feat(joinir): Phase 61-4-D/E function guard and toplevel emitter

Phase 61-4 追加実装:

1. Phase 61-4-D: 関数名ガード整理
   - is_joinir_if_toplevel_target() ヘルパー追加
   - IfSelectTest.*, IfToplevelTest.*, IfMergeTest.* 対応
   - if_form.rs で関数名チェック統合

2. Phase 61-4-E: emit_toplevel_phis() 追加
   - IfInLoopPhiEmitter に toplevel 用メソッド追加
   - carrier_names 不要(PhiSpec の全変数を対象)
   - HAKO_JOINIR_IF_TOPLEVEL_TRACE でトレース可能

現状:
- dry-run モードでパターンマッチング確認可能
- 本番経路のPHI生成統合は次フェーズ(MirBuilder PHI emit 方式検討必要)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-11-29 15:15:22 +09:00
parent b73413566d
commit 3439de0f65
3 changed files with 147 additions and 8 deletions

View File

@ -79,6 +79,36 @@ pub(crate) fn is_loop_lowered_function(name: &str) -> bool {
LOOP_LOWERED_FUNCTIONS.contains(&name)
}
/// Phase 61-4: ループ外 If の JoinIR 対象関数判定
///
/// HAKO_JOINIR_IF_TOPLEVEL=1 有効時に、ループ外 if の JoinIR 経路を試行する関数。
/// 段階的に対象を拡大するため、最小限のホワイトリストから開始。
///
/// ## 対象関数
/// - IfSelectTest.*: テスト専用関数群
/// - IfToplevelTest.*: ループ外 if テスト専用Phase 61-4
/// - JsonShapeToMap._read_value_from_pair/1: Phase 33-4 で検証済み
///
/// ## 使用方法
/// if_form.rs から呼び出され、関数名がホワイトリストに含まれる場合のみ
/// JoinIR 経路を試行する。
pub fn is_joinir_if_toplevel_target(name: &str) -> bool {
// Test prefixes (always enabled)
if name.starts_with("IfSelectTest.")
|| name.starts_with("IfToplevelTest.")
|| name.starts_with("IfMergeTest.")
{
return true;
}
// Explicit approvals (Phase 33-4 verified)
matches!(
name,
"JsonShapeToMap._read_value_from_pair/1"
| "Stage1JsonScannerBox.value_start_after_key_pos/2"
)
}
/// Phase 33-7: Try to lower if/else to JoinIR Select/IfMerge instruction
///
/// Scope: