From 7a29ebd2689b182b2a7044db21bae9d672213d6e Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Wed, 26 Nov 2025 02:36:43 +0900 Subject: [PATCH] refactor(phase31): Connect 4 lowerers to LoopToJoinLowerer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 31 Step 2 complete: - skip_ws.rs: use LoopToJoinLowerer::lower_minimal_skip_ws_case_a() - funcscanner_trim.rs: use LoopToJoinLowerer::lower_minimal_trim_case_a() - funcscanner_append_defs.rs: use LoopToJoinLowerer::lower_minimal_append_defs_case_a() - stage1_using_resolver.rs: use LoopToJoinLowerer::lower_minimal_stage1_case_a() Eliminates direct generic_case_a calls, routing through unified box. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- CURRENT_TASK.md | 18 ++++++++++ docs/private | 2 +- .../lowering/funcscanner_append_defs.rs | 36 ++++++------------- src/mir/join_ir/lowering/funcscanner_trim.rs | 32 +++++------------ src/mir/join_ir/lowering/skip_ws.rs | 30 +++------------- .../join_ir/lowering/stage1_using_resolver.rs | 35 ++++++------------ 6 files changed, 52 insertions(+), 101 deletions(-) diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 79aa40d4..a97729eb 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -40,6 +40,24 @@ ## 1. 最近完了した重要タスク +### 1-00v. Phase 31 — LoopToJoinLowerer 統一箱(**完了** 2025-11-26) + +**目的** +- MIR LoopForm → JoinIR 変換を1つの統一箱に集約 +- 個別手書き lowerer(skip_ws, trim, append_defs, stage1)を LoopToJoinLowerer 経由に移行 + +**実装内容** +1. `src/mir/join_ir/lowering/loop_to_join.rs` 新規作成 + - `LoopToJoinLowerer` 構造体 + - `lower()` メソッド(汎用) + - `lower_minimal_skip_ws_case_a()`, `lower_minimal_trim_case_a()`, `lower_minimal_append_defs_case_a()`, `lower_minimal_stage1_case_a()` 専用メソッド +2. 4つの lowerer を LoopToJoinLowerer 経由に変更 + - `skip_ws.rs`, `funcscanner_trim.rs`, `funcscanner_append_defs.rs`, `stage1_using_resolver.rs` + +**成果**: ループ→JoinIR変換の単一エントリポイント確立 + +--- + ### 1-00w. Phase 30 F-3 レガシー削除 — 旧API関数とCaseAContext::new削除(**完了** 2025-11-25) **目的** diff --git a/docs/private b/docs/private index a5a00fc7..186d4c35 160000 --- a/docs/private +++ b/docs/private @@ -1 +1 @@ -Subproject commit a5a00fc717f1f0ee348a867a6d873072400070b4 +Subproject commit 186d4c35d7bef59d3c088601e3f58574690575c4 diff --git a/src/mir/join_ir/lowering/funcscanner_append_defs.rs b/src/mir/join_ir/lowering/funcscanner_append_defs.rs index 7adddc19..ddac4e75 100644 --- a/src/mir/join_ir/lowering/funcscanner_append_defs.rs +++ b/src/mir/join_ir/lowering/funcscanner_append_defs.rs @@ -346,11 +346,9 @@ fn lower_from_mir(module: &crate::mir::MirModule) -> Option { eprintln!("[joinir/funcscanner_append_defs/mir] CFG sanity checks passed ✅"); eprintln!("[joinir/funcscanner_append_defs/mir] Found: length(), get(), push(), i+1"); - // Phase 30 F-3: LoopScopeShape 経由の新API を使用 + // Phase 31: LoopToJoinLowerer 統一箱経由に移行 if crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_LOWER_GENERIC") { - use crate::mir::join_ir::lowering::generic_case_a::lower_case_a_append_defs_with_scope; - use crate::mir::join_ir::lowering::loop_form_intake::intake_loop_form; - use crate::mir::join_ir::lowering::loop_scope_shape::LoopScopeShape; + use crate::mir::join_ir::lowering::loop_to_join::LoopToJoinLowerer; let header = query.succs(entry).get(0).copied().unwrap_or(entry); let succs_header = query.succs(header); @@ -367,31 +365,17 @@ fn lower_from_mir(module: &crate::mir::MirModule) -> Option { }; if crate::mir::join_ir::lowering::common::case_a::is_simple_case_a_loop(&loop_form) { eprintln!( - "[joinir/funcscanner_append_defs/generic-hook] detected simple Case A loop (generic_case_a hookup point)" + "[joinir/funcscanner_append_defs/generic-hook] detected simple Case A loop (LoopToJoinLowerer)" ); - let var_classes = crate::mir::phi_core::loop_var_classifier::LoopVarClassBox::new(); - let exit_live = crate::mir::phi_core::loop_exit_liveness::LoopExitLivenessBox::new(); - - // Phase 30 F-3: LoopFormIntake + LoopScopeShape 経由で呼び出し - if let Some(intake) = intake_loop_form(&loop_form, &var_classes, &query, target_func) { - if let Some(scope) = LoopScopeShape::from_existing_boxes( - &loop_form, - &intake, - &var_classes, - &exit_live, - &query, - Some("FuncScannerBox.append_defs/2"), // Phase 30 F-3.1: Case-A minimal target - ) { - if let Some(jm) = lower_case_a_append_defs_with_scope(scope) { - eprintln!( - "[joinir/funcscanner_append_defs/generic-hook] generic_case_a produced JoinIR via _with_scope, returning early" - ); - return Some(jm); - } - } + let lowerer = LoopToJoinLowerer::new(); + if let Some(jm) = lowerer.lower_minimal_append_defs_case_a(target_func, &loop_form) { + eprintln!( + "[joinir/funcscanner_append_defs/generic-hook] LoopToJoinLowerer produced JoinIR, returning early" + ); + return Some(jm); } eprintln!( - "[joinir/funcscanner_append_defs/generic-hook] generic_case_a via _with_scope returned None, falling back to handwritten/MIR path" + "[joinir/funcscanner_append_defs/generic-hook] LoopToJoinLowerer returned None, falling back to handwritten/MIR path" ); } } diff --git a/src/mir/join_ir/lowering/funcscanner_trim.rs b/src/mir/join_ir/lowering/funcscanner_trim.rs index cd30417b..2156140f 100644 --- a/src/mir/join_ir/lowering/funcscanner_trim.rs +++ b/src/mir/join_ir/lowering/funcscanner_trim.rs @@ -619,11 +619,9 @@ fn lower_trim_from_mir(module: &crate::mir::MirModule) -> Option { eprintln!("[joinir/trim/mir] CFG sanity checks passed ✅"); - // Phase 30 F-3: LoopScopeShape 経由の新API を使用 + // Phase 31: LoopToJoinLowerer 統一箱経由に移行 if crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_LOWER_GENERIC") { - use crate::mir::join_ir::lowering::generic_case_a::lower_case_a_trim_with_scope; - use crate::mir::join_ir::lowering::loop_form_intake::intake_loop_form; - use crate::mir::join_ir::lowering::loop_scope_shape::LoopScopeShape; + use crate::mir::join_ir::lowering::loop_to_join::LoopToJoinLowerer; let header = query.succs(entry_id).get(0).copied().unwrap_or(entry_id); let succs_header = query.succs(header); @@ -640,29 +638,15 @@ fn lower_trim_from_mir(module: &crate::mir::MirModule) -> Option { }; if crate::mir::join_ir::lowering::common::case_a::is_simple_case_a_loop(&loop_form) { eprintln!( - "[joinir/trim/generic-hook] simple Case A loop detected (generic_case_a hook planned)" + "[joinir/trim/generic-hook] simple Case A loop detected (LoopToJoinLowerer)" ); - let var_classes = crate::mir::phi_core::loop_var_classifier::LoopVarClassBox::new(); - let exit_live = crate::mir::phi_core::loop_exit_liveness::LoopExitLivenessBox::new(); - - // Phase 30 F-3: LoopFormIntake + LoopScopeShape 経由で呼び出し - if let Some(intake) = intake_loop_form(&loop_form, &var_classes, &query, target_func) { - if let Some(scope) = LoopScopeShape::from_existing_boxes( - &loop_form, - &intake, - &var_classes, - &exit_live, - &query, - Some("FuncScannerBox.trim/1"), // Phase 30 F-3.1: Case-A minimal target - ) { - if let Some(jm) = lower_case_a_trim_with_scope(scope) { - eprintln!("[joinir/trim/generic-hook] generic_case_a produced JoinIR via _with_scope, returning early"); - return Some(jm); - } - } + let lowerer = LoopToJoinLowerer::new(); + if let Some(jm) = lowerer.lower_minimal_trim_case_a(target_func, &loop_form) { + eprintln!("[joinir/trim/generic-hook] LoopToJoinLowerer produced JoinIR, returning early"); + return Some(jm); } eprintln!( - "[joinir/trim/generic-hook] generic_case_a via _with_scope returned None, falling back to handwritten" + "[joinir/trim/generic-hook] LoopToJoinLowerer returned None, falling back to handwritten" ); } } diff --git a/src/mir/join_ir/lowering/skip_ws.rs b/src/mir/join_ir/lowering/skip_ws.rs index acb3789b..c3ae11c3 100644 --- a/src/mir/join_ir/lowering/skip_ws.rs +++ b/src/mir/join_ir/lowering/skip_ws.rs @@ -353,14 +353,10 @@ fn lower_skip_ws_handwritten_or_mir(module: &crate::mir::MirModule) -> Option Option { - use crate::mir::join_ir::lowering::generic_case_a::lower_case_a_skip_ws_with_scope; - use crate::mir::join_ir::lowering::loop_form_intake::intake_loop_form; - use crate::mir::join_ir::lowering::loop_scope_shape::LoopScopeShape; + use crate::mir::join_ir::lowering::loop_to_join::LoopToJoinLowerer; use crate::mir::loop_form::LoopForm; - use crate::mir::phi_core::loop_exit_liveness::LoopExitLivenessBox; - use crate::mir::phi_core::loop_var_classifier::LoopVarClassBox; use crate::mir::query::MirQueryBox; let target_func = module.functions.get("Main.skip/1")?; @@ -384,23 +380,7 @@ fn try_lower_skip_ws_generic_case_a(module: &crate::mir::MirModule) -> Option Option { eprintln!("[joinir/stage1_using_resolver/mir] CFG sanity checks passed ✅"); - // Phase 30 F-3: LoopScopeShape 経由の新API を使用 + // Phase 31: LoopToJoinLowerer 統一箱経由に移行 if crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_LOWER_GENERIC") { - use crate::mir::join_ir::lowering::generic_case_a::lower_case_a_stage1_usingresolver_with_scope; - use crate::mir::join_ir::lowering::loop_form_intake::intake_loop_form; - use crate::mir::join_ir::lowering::loop_scope_shape::LoopScopeShape; + use crate::mir::join_ir::lowering::loop_to_join::LoopToJoinLowerer; let header = query.succs(entry).get(0).copied().unwrap_or(entry); let succs_header = query.succs(header); @@ -364,33 +362,20 @@ fn lower_from_mir(module: &crate::mir::MirModule) -> Option { }; if crate::mir::join_ir::lowering::common::case_a::is_simple_case_a_loop(&loop_form) { eprintln!( - "[joinir/stage1_using_resolver/generic-hook] simple Case A loop detected (minimal target, generic_case_a hook placeholder)" + "[joinir/stage1_using_resolver/generic-hook] simple Case A loop detected (LoopToJoinLowerer)" ); - let var_classes = crate::mir::phi_core::loop_var_classifier::LoopVarClassBox::new(); - let exit_live = crate::mir::phi_core::loop_exit_liveness::LoopExitLivenessBox::new(); let params_len = target_func.params.len(); if params_len == 5 { - // Phase 30 F-3: LoopFormIntake + LoopScopeShape 経由で呼び出し - if let Some(intake) = intake_loop_form(&loop_form, &var_classes, &query, target_func) { - if let Some(scope) = LoopScopeShape::from_existing_boxes( - &loop_form, - &intake, - &var_classes, - &exit_live, - &query, - Some("Stage1UsingResolverBox.resolve_for_source/5"), // Phase 30 F-3.1: Case-A minimal target - ) { - if let Some(jm) = lower_case_a_stage1_usingresolver_with_scope(scope) { - eprintln!( - "[joinir/stage1_using_resolver/generic-hook] generic_case_a produced JoinIR via _with_scope, returning early" - ); - return Some(jm); - } - } + let lowerer = LoopToJoinLowerer::new(); + if let Some(jm) = lowerer.lower_minimal_stage1_case_a(target_func, &loop_form) { + eprintln!( + "[joinir/stage1_using_resolver/generic-hook] LoopToJoinLowerer produced JoinIR, returning early" + ); + return Some(jm); } } eprintln!( - "[joinir/stage1_using_resolver/generic-hook] generic_case_a via _with_scope returned None or params mismatch, falling back to handwritten/MIR path" + "[joinir/stage1_using_resolver/generic-hook] LoopToJoinLowerer returned None or params mismatch, falling back to handwritten/MIR path" ); } }