Establish If lowering infrastructure with dedicated JOINIR_IF_TARGETS table, separate from loop lowering (JOINIR_TARGETS). Implementation: - Add JOINIR_IF_TARGETS table with 6 representative functions - Add is_if_lowered_function() for table-based lookup - Update is_if_mainline_target() to use table (SSOT) - Update is_joinir_if_toplevel_target() with table-first lookup - Export via join_ir_vm_bridge_dispatch public API Representative functions: - IfSelectTest.test/1 (simple return pattern) - IfSelectLocalTest.main/0 (local variable pattern) - IfMergeTest.simple_true/0, simple_false/0 (multiple variables) - JsonShapeToMap._read_value_from_pair/1 (Stage-1 production) - Stage1JsonScannerBox.value_start_after_key_pos/2 (Stage-B production) Architecture: Loop/If separation complete (1関数につき1 lowering) Verification: All representative paths pass with NYASH_JOINIR_DEBUG=1 Phase 184 complete → Phase 185+ ready 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
171 lines
7.4 KiB
Rust
171 lines
7.4 KiB
Rust
use crate::mir::MirModule;
|
||
|
||
/// JoinIR ブリッジの実行範囲を表す enum
|
||
///
|
||
/// - `Exec`: JoinIR→VM 実行まで対応。意味論を A/B 実証済みのものに限定。
|
||
/// - `LowerOnly`: JoinIR lowering / Bridge 構造検証専用。実行は VM Route A にフォールバック。
|
||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||
pub enum JoinIrBridgeKind {
|
||
/// JoinIR→VM 実行まで対応(skip/trim など、意味論を A/B 実証済み)
|
||
Exec,
|
||
/// JoinIR lowering / Bridge 構造検証専用(Stage-1/Stage-B など)
|
||
LowerOnly,
|
||
}
|
||
|
||
/// JoinIR ブリッジ対象の記述子
|
||
///
|
||
/// 関数名と実行範囲(Exec/LowerOnly)をペアで管理する。
|
||
#[derive(Debug, Clone, Copy)]
|
||
pub struct JoinIrTargetDesc {
|
||
/// 対象関数名(MirModule.functions のキー)
|
||
pub func_name: &'static str,
|
||
/// 実行範囲
|
||
pub kind: JoinIrBridgeKind,
|
||
/// デフォルト有効化(env フラグなしでも JoinIR 経路に入る)
|
||
pub default_enabled: bool,
|
||
}
|
||
|
||
/// JoinIR ループ lowering 対象テーブル(SSOT)
|
||
///
|
||
/// Phase 32 L-4: 全対象関数を一覧化し、Exec/LowerOnly の区分を明示する。
|
||
/// Phase 82: このテーブルが唯一の SSOT。is_loop_lowered_function() はここから参照。
|
||
/// Phase 182: representative paths 対応(3 upgrades - LOOP ONLY)
|
||
/// Phase 184: Loop/If 分離を明文化(If は JOINIR_IF_TARGETS へ)
|
||
///
|
||
/// **重要**: このテーブルは LOOP lowering 専用です。
|
||
/// If lowering の関数を追加すると、is_loop_lowered_function() で除外され、
|
||
/// if-lowering が機能しなくなります。If 関数は JOINIR_IF_TARGETS で管理。
|
||
///
|
||
/// | 関数 | Kind | デフォルト有効 | 備考 |
|
||
/// |-----|------|---------------|------|
|
||
/// | Main.skip/1 | Exec | No | PHI canary のため env 必須 |
|
||
/// | FuncScannerBox.trim/1 | Exec | Yes | A/B 実証済み、事実上本線 |
|
||
/// | FuncScannerBox.append_defs/2 | Exec | No | Phase 82 SSOT統一で追加 |
|
||
/// | Stage1UsingResolverBox.resolve_for_source/5 | Exec | Yes | Phase 182: LowerOnly→Exec 昇格 |
|
||
/// | StageBBodyExtractorBox.build_body_src/2 | Exec | Yes | Phase 182: LowerOnly→Exec 昇格 |
|
||
/// | StageBFuncScannerBox.scan_all_boxes/1 | Exec | Yes | Phase 182: LowerOnly→Exec 昇格 |
|
||
///
|
||
/// Phase 181/182 設計ドキュメント:
|
||
/// - docs/private/roadmap2/phases/phase-181/joinir-targets-mapping.md
|
||
/// - docs/private/roadmap2/phases/phase-181/representative-paths-finalized.md
|
||
/// - docs/private/roadmap2/phases/phase-182/FINDINGS.md (Phase 182 実装時発見事項)
|
||
pub const JOINIR_TARGETS: &[JoinIrTargetDesc] = &[
|
||
// Loop Exec(実行対応)
|
||
JoinIrTargetDesc {
|
||
func_name: "Main.skip/1",
|
||
kind: JoinIrBridgeKind::Exec,
|
||
default_enabled: false, // PHI canary のため env 必須
|
||
},
|
||
JoinIrTargetDesc {
|
||
func_name: "FuncScannerBox.trim/1",
|
||
kind: JoinIrBridgeKind::Exec,
|
||
default_enabled: true, // A/B 実証済み、事実上本線
|
||
},
|
||
JoinIrTargetDesc {
|
||
func_name: "FuncScannerBox.append_defs/2",
|
||
kind: JoinIrBridgeKind::Exec,
|
||
default_enabled: false,
|
||
},
|
||
// Phase 182 昇格: Stage-1/Stage-B infrastructure (LowerOnly → Exec)
|
||
JoinIrTargetDesc {
|
||
func_name: "Stage1UsingResolverBox.resolve_for_source/5",
|
||
kind: JoinIrBridgeKind::Exec, // Phase 182: LowerOnly から昇格
|
||
default_enabled: true,
|
||
},
|
||
JoinIrTargetDesc {
|
||
func_name: "StageBBodyExtractorBox.build_body_src/2",
|
||
kind: JoinIrBridgeKind::Exec, // Phase 182: LowerOnly から昇格
|
||
default_enabled: true,
|
||
},
|
||
JoinIrTargetDesc {
|
||
func_name: "StageBFuncScannerBox.scan_all_boxes/1",
|
||
kind: JoinIrBridgeKind::Exec, // Phase 182: LowerOnly から昇格
|
||
default_enabled: true,
|
||
},
|
||
];
|
||
|
||
/// Phase 32 L-4: テーブルから対象関数を探す
|
||
pub(crate) fn find_joinir_target(module: &MirModule) -> Option<&'static JoinIrTargetDesc> {
|
||
JOINIR_TARGETS
|
||
.iter()
|
||
.find(|target| module.functions.contains_key(target.func_name))
|
||
}
|
||
|
||
// ============================================================================
|
||
// Phase 184: JoinIR If Lowering Targets (Separate from Loop Targets)
|
||
// ============================================================================
|
||
|
||
/// JoinIR If lowering 対象テーブル(SSOT)
|
||
///
|
||
/// Phase 184: Loop lowering(JOINIR_TARGETS)と分離した If lowering 専用テーブル。
|
||
/// Phase 182 で判明した設計制約(JOINIR_TARGETS は Loop 専用)に基づく責務分離。
|
||
///
|
||
/// **責務**:
|
||
/// - If/Else → Select/IfMerge lowering の対象関数を一覧化
|
||
/// - Loop lowering と独立して管理(1関数につき1 lowering の原則)
|
||
///
|
||
/// **使用箇所**:
|
||
/// - `is_if_mainline_target()`: Core ON 時の本線化判定
|
||
/// - `try_lower_if_to_joinir()`: If lowering 試行時のホワイトリスト
|
||
///
|
||
/// | 関数 | Kind | デフォルト有効 | 備考 |
|
||
/// |-----|------|---------------|------|
|
||
/// | IfSelectTest.test/1 | Exec | Yes | Phase 33-2/33-3 simple return pattern |
|
||
/// | IfSelectLocalTest.main/0 | Exec | Yes | Phase 33-10 local variable pattern |
|
||
/// | IfMergeTest.simple_true/0 | Exec | Yes | Phase 33-7 multiple variables (IfMerge) |
|
||
/// | IfMergeTest.simple_false/0 | Exec | Yes | Phase 33-7 multiple variables (IfMerge) |
|
||
/// | JsonShapeToMap._read_value_from_pair/1 | Exec | Yes | Phase 33-4 Stage-1 実用関数 |
|
||
/// | Stage1JsonScannerBox.value_start_after_key_pos/2 | Exec | Yes | Phase 33-4 Stage-B 実用関数 |
|
||
///
|
||
/// Phase 184 設計ドキュメント:
|
||
/// - docs/private/roadmap2/phases/phase-184/if_lowering_inventory.md
|
||
/// - docs/private/roadmap2/phases/phase-184/README.md
|
||
pub const JOINIR_IF_TARGETS: &[JoinIrTargetDesc] = &[
|
||
// Test functions (Phase 33 series)
|
||
JoinIrTargetDesc {
|
||
func_name: "IfSelectTest.test/1",
|
||
kind: JoinIrBridgeKind::Exec,
|
||
default_enabled: true, // Simple return pattern (Phase 33-2/33-3)
|
||
},
|
||
JoinIrTargetDesc {
|
||
func_name: "IfSelectLocalTest.main/0",
|
||
kind: JoinIrBridgeKind::Exec,
|
||
default_enabled: true, // Local variable pattern (Phase 33-10)
|
||
},
|
||
JoinIrTargetDesc {
|
||
func_name: "IfMergeTest.simple_true/0",
|
||
kind: JoinIrBridgeKind::Exec,
|
||
default_enabled: true, // Multiple variables (Phase 33-7)
|
||
},
|
||
JoinIrTargetDesc {
|
||
func_name: "IfMergeTest.simple_false/0",
|
||
kind: JoinIrBridgeKind::Exec,
|
||
default_enabled: true, // Multiple variables (Phase 33-7)
|
||
},
|
||
// Selfhost/Production functions (Phase 33-4 explicit approvals)
|
||
JoinIrTargetDesc {
|
||
func_name: "JsonShapeToMap._read_value_from_pair/1",
|
||
kind: JoinIrBridgeKind::Exec,
|
||
default_enabled: true, // Stage-1 実用関数
|
||
},
|
||
JoinIrTargetDesc {
|
||
func_name: "Stage1JsonScannerBox.value_start_after_key_pos/2",
|
||
kind: JoinIrBridgeKind::Exec,
|
||
default_enabled: true, // Stage-B 実用関数
|
||
},
|
||
];
|
||
|
||
/// Phase 184: If lowering 対象関数の判定
|
||
///
|
||
/// JOINIR_IF_TARGETS テーブルから対象関数を検索し、
|
||
/// default_enabled が true の関数のみを本線対象とする。
|
||
///
|
||
/// **用途**:
|
||
/// - `is_if_mainline_target()`: Core ON 時の本線化判定
|
||
/// - `should_try_joinir_mainline(func_name, is_loop=false)` 経由で使用
|
||
pub fn is_if_lowered_function(name: &str) -> bool {
|
||
JOINIR_IF_TARGETS
|
||
.iter()
|
||
.any(|t| t.func_name == name && t.default_enabled)
|
||
}
|