diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 8ea2c97b..378a4a24 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -1,5 +1,87 @@ # Current Task +## ✅ Phase 184: JoinIR If Lowering Mainline (Completed - 2025-12-04) + +**Status**: ✅ **All Tasks Completed** → Phase 185+ Ready + +**Key Achievement**: If lowering infrastructure now has dedicated JOINIR_IF_TARGETS table, separate from loop lowering (JOINIR_TARGETS). 6 representative functions established with default-enabled mainline paths. + +### Completed Tasks + +✅ **Task 1**: If lowering inventory +- Created comprehensive inventory of all If lowering functions +- Identified 6 representative functions (4 test + 2 production) +- Document: `docs/private/roadmap2/phases/phase-184/if_lowering_inventory.md` + +✅ **Task 2**: JOINIR_IF_TARGETS table and is_if_mainline_target() +- Implemented JOINIR_IF_TARGETS in `src/mir/join_ir_vm_bridge_dispatch/targets.rs` +- Added is_if_lowered_function() for table lookup +- Exported via module public API + +✅ **Task 3**: If lowering integration +- Updated is_if_mainline_target() to use table (src/mir/join_ir/lowering/mod.rs) +- Updated is_joinir_if_toplevel_target() to check table first +- Maintained Loop/If separation (Phase 33-9.1 responsibility principle) + +✅ **Task 4**: Representative paths verified +- IfSelectTest.test/1: ✅ Select lowering working +- IfSelectLocalTest.main/0: ✅ Local variable pattern working +- IfMergeTest.simple_true/0, simple_false/0: ✅ Multiple variable patterns working + +✅ **Task 5**: Documentation updated +- Phase 184 README: Complete with architecture diagrams +- CURRENT_TASK.md: Updated with completion status + +### Implementation Summary + +**JOINIR_IF_TARGETS Table** (6 functions): +1. `IfSelectTest.test/1` - Simple return pattern +2. `IfSelectLocalTest.main/0` - Local variable pattern +3. `IfMergeTest.simple_true/0` - Multiple variables (IfMerge) +4. `IfMergeTest.simple_false/0` - Multiple variables (IfMerge) +5. `JsonShapeToMap._read_value_from_pair/1` - Stage-1 production +6. `Stage1JsonScannerBox.value_start_after_key_pos/2` - Stage-B production + +**Architecture Impact**: +- JOINIR_TARGETS (Loop) and JOINIR_IF_TARGETS (If) are now clearly separated +- 1関数につき1 lowering の原則を完全実装 +- SSOT (Single Source of Truth) for If lowering targets established + +**Modified Files**: +- `src/mir/join_ir_vm_bridge_dispatch/targets.rs` (+75 lines) +- `src/mir/join_ir_vm_bridge_dispatch/mod.rs` (exports) +- `src/mir/join_ir/lowering/mod.rs` (table integration) + +### Known Issues (Non-blocking) + +1. **Double-invocation in strict mode**: NYASH_JOINIR_STRICT=1 can panic even when lowering succeeds (skeleton + lowering passes). Workaround: use NYASH_JOINIR_DEBUG=1 instead. +2. **Test output formatting**: Tests show "RC: 0" instead of expected print output (unrelated to If lowering infrastructure). + +### Verification Commands + +```bash +# Basic verification (default JoinIR ON) +NYASH_JOINIR_DEBUG=1 ./target/release/hakorune apps/tests/joinir_if_select_simple.hako +# Expected: [try_lower_if_to_joinir] ✅ Select lowering used for IfSelectTest.test/1 + +# IfMerge pattern +NYASH_JOINIR_DEBUG=1 ./target/release/hakorune apps/tests/joinir_if_merge_simple.hako +# Expected: IfMerge lowering messages + +# Build verification +cargo build --release +# Expected: Success with only warnings (no errors) +``` + +### Next Steps: Phase 185+ + +1. **Expand JOINIR_IF_TARGETS**: Add more selfhost functions as they stabilize +2. **Address double-invocation**: Refactor if_form.rs if needed +3. **Stage-1 rollout**: Automatic inclusion of Stage1* prefixed functions +4. **Metrics tracking**: If lowering success rate monitoring + +--- + ## 🎉 Phase 183: JoinIR Default ON & Legacy Toggle (Completed - 2025-12-04) **Status**: ✅ **All Tasks Completed** → Phase 184 Ready diff --git a/src/mir/join_ir/lowering/mod.rs b/src/mir/join_ir/lowering/mod.rs index 105af570..ad8322b3 100644 --- a/src/mir/join_ir/lowering/mod.rs +++ b/src/mir/join_ir/lowering/mod.rs @@ -94,12 +94,14 @@ pub fn is_loop_mainline_target(name: &str) -> bool { is_loop_lowered_function(name) } -/// Phase 80: JoinIR 本線化対象(If)の判定 +/// Phase 80/184: JoinIR 本線化対象(If)の判定 /// /// `joinir_core_enabled()=true` の時、これらの関数の if/else は /// 必ず JoinIR → MIR 経路を本線として試行します。 +/// +/// Phase 184: JOINIR_IF_TARGETS テーブルからの参照に変更 pub fn is_if_mainline_target(name: &str) -> bool { - is_joinir_if_toplevel_target(name) + crate::mir::join_ir_vm_bridge_dispatch::is_if_lowered_function(name) } /// Phase 80: Core ON 時に JoinIR を本線として試行すべきか判定 @@ -126,21 +128,33 @@ pub fn should_panic_on_joinir_failure(func_name: &str, is_loop: bool) -> bool { should_try_joinir_mainline(func_name, is_loop) } -/// Phase 61-4: ループ外 If の JoinIR 対象関数判定 +/// Phase 61-4/184: ループ外 If の JoinIR 対象関数判定 /// /// HAKO_JOINIR_IF_TOPLEVEL=1 有効時に、ループ外 if の JoinIR 経路を試行する関数。 -/// 段階的に対象を拡大するため、最小限のホワイトリストから開始。 +/// Phase 184: JOINIR_IF_TARGETS テーブルに統一(SSOT化) /// -/// ## 対象関数 +/// ## 対象関数(テーブル管理) /// - IfSelectTest.*: テスト専用関数群 +/// - IfMergeTest.*: 複数変数テスト(Phase 33-7) /// - IfToplevelTest.*: ループ外 if テスト専用(Phase 61-4) -/// - JsonShapeToMap._read_value_from_pair/1: Phase 33-4 で検証済み +/// - JsonShapeToMap._read_value_from_pair/1: Phase 33-4 Stage-1 実用関数 +/// - Stage1JsonScannerBox.value_start_after_key_pos/2: Phase 33-4 Stage-B 実用関数 /// /// ## 使用方法 -/// if_form.rs から呼び出され、関数名がホワイトリストに含まれる場合のみ +/// if_form.rs から呼び出され、関数名がテーブルに含まれる場合のみ /// JoinIR 経路を試行する。 +/// +/// Phase 184: テーブル参照に変更(プレフィックス判定は併用) pub fn is_joinir_if_toplevel_target(name: &str) -> bool { - // Test prefixes (always enabled) + // Phase 184: JOINIR_IF_TARGETS テーブルから参照(exact match) + if crate::mir::join_ir_vm_bridge_dispatch::JOINIR_IF_TARGETS + .iter() + .any(|t| t.func_name == name) + { + return true; + } + + // Test prefixes (backward compatibility - allows any test function) if name.starts_with("IfSelectTest.") || name.starts_with("IfToplevelTest.") || name.starts_with("IfMergeTest.") @@ -148,12 +162,7 @@ pub fn is_joinir_if_toplevel_target(name: &str) -> bool { return true; } - // Explicit approvals (Phase 33-4 verified) - matches!( - name, - "JsonShapeToMap._read_value_from_pair/1" - | "Stage1JsonScannerBox.value_start_after_key_pos/2" - ) + false } /// Phase 33-7: Try to lower if/else to JoinIR Select/IfMerge instruction diff --git a/src/mir/join_ir_vm_bridge_dispatch/mod.rs b/src/mir/join_ir_vm_bridge_dispatch/mod.rs index 23ec7d25..f6b3c1ae 100644 --- a/src/mir/join_ir_vm_bridge_dispatch/mod.rs +++ b/src/mir/join_ir_vm_bridge_dispatch/mod.rs @@ -20,7 +20,9 @@ use lower_only_routes::{ try_run_stage1_usingresolver, try_run_stageb_body, try_run_stageb_funcscanner, }; use targets::find_joinir_target; -pub use targets::{JoinIrBridgeKind, JoinIrTargetDesc, JOINIR_TARGETS}; +pub use targets::{ + is_if_lowered_function, JoinIrBridgeKind, JoinIrTargetDesc, JOINIR_IF_TARGETS, JOINIR_TARGETS, +}; use crate::mir::MirModule; diff --git a/src/mir/join_ir_vm_bridge_dispatch/targets.rs b/src/mir/join_ir_vm_bridge_dispatch/targets.rs index 9e19cd43..6a7138d6 100644 --- a/src/mir/join_ir_vm_bridge_dispatch/targets.rs +++ b/src/mir/join_ir_vm_bridge_dispatch/targets.rs @@ -25,15 +25,16 @@ pub struct JoinIrTargetDesc { pub default_enabled: bool, } -/// JoinIR ブリッジ対象テーブル(SSOT) +/// 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 関数は is_joinir_if_toplevel_target() で管理。 +/// if-lowering が機能しなくなります。If 関数は JOINIR_IF_TARGETS で管理。 /// /// | 関数 | Kind | デフォルト有効 | 備考 | /// |-----|------|---------------|------| @@ -89,3 +90,81 @@ pub(crate) fn find_joinir_target(module: &MirModule) -> Option<&'static JoinIrTa .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) +}