diff --git a/src/mir/builder/control_flow/joinir/patterns/pattern1_minimal.rs b/src/mir/builder/control_flow/joinir/patterns/pattern1_minimal.rs index 10ae7edb..5e823d63 100644 --- a/src/mir/builder/control_flow/joinir/patterns/pattern1_minimal.rs +++ b/src/mir/builder/control_flow/joinir/patterns/pattern1_minimal.rs @@ -35,15 +35,14 @@ impl MirBuilder { /// # Phase 188-Impl-2: Host Variable Integration /// /// Extracts the loop variable from the host function (e.g., `i` from `i < 3`) - /// and passes it to the Pattern 1 lowerer along with a ValueId allocator. + /// and creates a JoinInlineBoundary for mapping between host and JoinIR ValueIds. /// /// # Pipeline /// 1. Extract loop variable name from condition /// 2. Look up ValueId in host variable_map - /// 3. Create Pattern1Context with host variable + allocator - /// 4. Call simple_while_minimal::lower_simple_while_minimal() → JoinModule - /// 5. convert_join_module_to_mir_with_meta() → MirModule - /// 6. Merge MIR blocks into current_function + /// 3. Call simple_while_minimal::lower_simple_while_minimal() → JoinModule + /// 4. convert_join_module_to_mir_with_meta() → MirModule + /// 5. Merge MIR blocks into current_function pub(in crate::mir::builder) fn cf_loop_pattern1_minimal( &mut self, condition: &ASTNode, @@ -51,9 +50,7 @@ impl MirBuilder { _func_name: &str, debug: bool, ) -> Result, String> { - use crate::mir::join_ir::lowering::simple_while_minimal::{ - lower_simple_while_minimal, Pattern1Context, - }; + use crate::mir::join_ir::lowering::simple_while_minimal::lower_simple_while_minimal; use crate::mir::BasicBlockId; use std::collections::{BTreeMap, BTreeSet}; @@ -89,16 +86,8 @@ impl MirBuilder { variable_definitions: BTreeMap::new(), }; - // Phase 188-Impl-2: Create Pattern1Context with host variable + allocator - // Clone value_gen to move into closure - let mut value_gen_clone = self.value_gen.clone(); - let ctx = Pattern1Context { - loop_var: loop_var_id, - value_allocator: Box::new(move || value_gen_clone.next()), - }; - - // Call Pattern 1 lowerer with host context - let join_module = match lower_simple_while_minimal(scope, Some(ctx)) { + // Call Pattern 1 lowerer + let join_module = match lower_simple_while_minimal(scope) { Some(module) => module, None => { // Phase 195: Use unified trace diff --git a/src/mir/join_ir/lowering/generic_type_resolver.rs b/src/mir/join_ir/lowering/generic_type_resolver.rs index a2c2d1a4..b9dd7f20 100644 --- a/src/mir/join_ir/lowering/generic_type_resolver.rs +++ b/src/mir/join_ir/lowering/generic_type_resolver.rs @@ -115,32 +115,9 @@ impl GenericTypeResolver { None } - /// PHI の type_hint から型を抽出(将来拡張用) - /// - /// # Phase 66 現在 - /// - /// P3-C メソッドは JoinIR で type_hint を設定しないため、 - /// この関数は現在使用されない。 - /// - /// # Phase 67+ 拡張 - /// - /// 型変数システム導入後、ArrayBox.get() の T を - /// type_hint として伝播する際に使用。 - #[allow(dead_code)] - pub fn extract_type_hint(function: &MirFunction, ret_val: ValueId) -> Option { - function - .blocks - .values() - .flat_map(|bb| &bb.instructions) - .find_map(|inst| { - if let MirInstruction::Phi { dst, type_hint, .. } = inst { - if *dst == ret_val { - return type_hint.clone(); - } - } - None - }) - } + // NOTE: extract_type_hint() method was removed as dead code. + // It was intended for Phase 67+ type variable system (ArrayBox.get() type hints). + // If needed in the future, reintroduce from git history. } #[cfg(test)] diff --git a/src/mir/join_ir/lowering/if_merge.rs b/src/mir/join_ir/lowering/if_merge.rs index a95eb525..c8c90126 100644 --- a/src/mir/join_ir/lowering/if_merge.rs +++ b/src/mir/join_ir/lowering/if_merge.rs @@ -24,7 +24,6 @@ use super::if_phi_context::IfPhiContext; pub struct IfMergeLowerer { debug_level: u8, // Phase 61-1: If-in-loop context (None = Pure If) - #[allow(dead_code)] context: Option, } diff --git a/src/mir/join_ir/lowering/if_select.rs b/src/mir/join_ir/lowering/if_select.rs index d1465690..d6f73b0f 100644 --- a/src/mir/join_ir/lowering/if_select.rs +++ b/src/mir/join_ir/lowering/if_select.rs @@ -20,7 +20,6 @@ use super::if_phi_context::IfPhiContext; pub struct IfSelectLowerer { debug_level: u8, // Phase 61-1: If-in-loop context (None = Pure If) - #[allow(dead_code)] context: Option, } diff --git a/src/mir/join_ir/lowering/inline_boundary.rs b/src/mir/join_ir/lowering/inline_boundary.rs index d711951b..1f29f21c 100644 --- a/src/mir/join_ir/lowering/inline_boundary.rs +++ b/src/mir/join_ir/lowering/inline_boundary.rs @@ -271,42 +271,6 @@ impl JoinInlineBoundary { /// /// **DEPRECATED**: Use `new_with_exit_bindings` instead. /// - /// Reserved for future loop patterns that produce values. - /// - /// 現在の実装では Multi-carrier 出力には未対応だが、型としては複数出力を - /// 表現できるようにしておく。 - #[allow(dead_code)] - #[deprecated(since = "Phase 190", note = "Use new_with_exit_bindings instead")] - pub fn new_with_outputs( - join_inputs: Vec, - host_inputs: Vec, - join_outputs: Vec, - host_outputs: Vec, - ) -> Self { - assert_eq!( - join_inputs.len(), - host_inputs.len(), - "join_inputs and host_inputs must have same length" - ); - assert_eq!( - join_outputs.len(), - host_outputs.len(), - "join_outputs and host_outputs must have same length" - ); - Self { - join_inputs, - host_inputs, - join_outputs, - #[allow(deprecated)] - host_outputs, - exit_bindings: vec![], - #[allow(deprecated)] - condition_inputs: vec![], // Phase 171: Default to empty (deprecated) - condition_bindings: vec![], // Phase 171-fix: Default to empty - expr_result: None, // Phase 33-14 - loop_var_name: None, // Phase 33-16 - } - } /// Create a new boundary with inputs and **host outputs only** (DEPRECATED) /// diff --git a/src/mir/join_ir/lowering/loop_scope_shape/shape.rs b/src/mir/join_ir/lowering/loop_scope_shape/shape.rs index 58f6ddd0..91536bcf 100644 --- a/src/mir/join_ir/lowering/loop_scope_shape/shape.rs +++ b/src/mir/join_ir/lowering/loop_scope_shape/shape.rs @@ -57,7 +57,6 @@ impl LoopVarClass { /// - `progress_carrier`: 進捗チェック用(将来の Verifier で使用予定) /// - `variable_definitions`: definition blocks collected from LoopFormIntake snapshots #[derive(Debug, Clone)] -#[allow(dead_code)] // Block IDs and progress_carrier are reserved for future F-3/F-4 use pub(crate) struct LoopScopeShape { pub header: BasicBlockId, pub body: BasicBlockId, diff --git a/src/mir/join_ir/lowering/loop_scope_shape/tests.rs b/src/mir/join_ir/lowering/loop_scope_shape/tests.rs index f46cbafc..7b467ce0 100644 --- a/src/mir/join_ir/lowering/loop_scope_shape/tests.rs +++ b/src/mir/join_ir/lowering/loop_scope_shape/tests.rs @@ -1,9 +1,25 @@ +//! Tests for loop_scope_shape module +//! +//! ## Test Organization +//! +//! This file contains tests for multiple components: +//! - **LoopScopeShape tests** (shape.rs): from_loop_form, needs_phi, block_ids, ordering +//! - **CaseAContext tests** (case_a*.rs): validation, lowering shape +//! - **Variable classification tests** (structural.rs): classify, phi consistency +//! - **Variable definitions tests** (builder.rs): availability, inspector +//! +//! Future work: Consider splitting into per-module test files for better organization. + use super::shape::LoopVarClass; use super::*; use crate::mir::join_ir::lowering::loop_form_intake::LoopFormIntake; use crate::mir::{BasicBlockId, MirQuery, ValueId}; use std::collections::{BTreeMap, BTreeSet}; +// ============================================================================ +// Test Fixtures (shared across all tests) +// ============================================================================ + fn make_dummy_loop_form() -> crate::mir::loop_form::LoopForm { crate::mir::loop_form::LoopForm { preheader: BasicBlockId::new(1), @@ -47,6 +63,10 @@ impl MirQuery for EmptyQuery { } } +// ============================================================================ +// LoopScopeShape Tests (shape.rs) +// ============================================================================ + #[test] fn test_from_loop_form_basic() { let loop_form = make_dummy_loop_form(); @@ -118,6 +138,10 @@ fn test_ordered_accessors() { assert!(carriers.contains(&"i".to_string())); } +// ============================================================================ +// CaseAContext Tests (case_a*.rs) +// ============================================================================ + /// CaseAContext::from_scope で header == exit のとき None を返すテスト #[test] fn test_from_scope_validation_header_eq_exit() { @@ -234,6 +258,10 @@ fn test_needs_phi_consistency() { } } +// ============================================================================ +// Variable Classification Tests (structural.rs) +// ============================================================================ + /// classify() メソッドのテスト #[test] fn test_classify_method() { @@ -326,6 +354,10 @@ fn test_get_exit_live() { assert!(exit_live.contains("i")); } +// ============================================================================ +// Variable Definitions Tests (builder.rs) +// ============================================================================ + /// Phase 48-4: is_available_in_all() API テスト(空の variable_definitions) #[test] fn test_is_available_in_all_phase48_4() { diff --git a/src/mir/join_ir/lowering/loop_to_join.rs b/src/mir/join_ir/lowering/loop_to_join.rs index e6a37927..2a7040f2 100644 --- a/src/mir/join_ir/lowering/loop_to_join.rs +++ b/src/mir/join_ir/lowering/loop_to_join.rs @@ -360,8 +360,8 @@ impl LoopToJoinLowerer { eprintln!("[LoopToJoinLowerer] Trying Pattern 1 lowering for {:?}", name); } - // Phase 188-Impl-2: Use standalone mode (None context) for backward compatibility - if let Some(result) = super::simple_while_minimal::lower_simple_while_minimal(scope.clone(), None) { + // Phase 188-Impl-3: Call lowerer directly (context removed) + if let Some(result) = super::simple_while_minimal::lower_simple_while_minimal(scope.clone()) { if self.debug { eprintln!("[LoopToJoinLowerer] Pattern 1 lowering succeeded for {:?}", name); } diff --git a/src/mir/join_ir/lowering/simple_while_minimal.rs b/src/mir/join_ir/lowering/simple_while_minimal.rs index 06584895..c931162b 100644 --- a/src/mir/join_ir/lowering/simple_while_minimal.rs +++ b/src/mir/join_ir/lowering/simple_while_minimal.rs @@ -49,31 +49,6 @@ use crate::mir::join_ir::{ }; use crate::mir::ValueId; -/// Context passed from the host function to the Pattern 1 lowerer -/// -/// Phase 188-Impl-3: This context is now REMOVED - JoinIR uses only local ValueIds -/// The boundary mapping is handled by JoinInlineBoundary instead. -#[deprecated(since = "188-Impl-3", note = "Use JoinInlineBoundary for host integration")] -pub struct Pattern1Context { - /// DEPRECATED: This is no longer used, JoinIR uses local ValueIds - pub loop_var: ValueId, - /// DEPRECATED: JoinIR allocates sequentially from 0 - pub value_allocator: Box ValueId>, -} - -impl Pattern1Context { - /// Create a standalone context with hardcoded ValueIds (for backward compatibility) - pub fn standalone() -> Self { - let mut counter = 0u32; - Self { - loop_var: ValueId(counter), - value_allocator: Box::new(move || { - counter += 1; - ValueId(counter) - }), - } - } -} /// Lower Pattern 1 (Simple While Loop) to JoinIR /// @@ -98,7 +73,6 @@ impl Pattern1Context { /// # Arguments /// /// * `_scope` - LoopScopeShape (reserved for future generic implementation) -/// * `_ctx` - DEPRECATED: No longer used, kept for backward compatibility /// /// # Returns /// @@ -110,10 +84,7 @@ impl Pattern1Context { /// This function returns a JoinModule with: /// - **Input slot**: ValueId(0) in loop_step function represents the loop variable /// - **Caller responsibility**: Create JoinInlineBoundary to map ValueId(0) to host's loop var -pub fn lower_simple_while_minimal( - _scope: LoopScopeShape, - _ctx: Option, -) -> Option { +pub fn lower_simple_while_minimal(_scope: LoopScopeShape) -> Option { // Phase 188-Impl-3: Use local ValueId allocator (sequential from 0) // JoinIR has NO knowledge of host ValueIds - boundary handled separately let mut value_counter = 0u32;