diff --git a/src/mir/builder/control_flow/joinir/merge/instruction_rewriter.rs b/src/mir/builder/control_flow/joinir/merge/instruction_rewriter.rs index 759f8f6f..28761c27 100644 --- a/src/mir/builder/control_flow/joinir/merge/instruction_rewriter.rs +++ b/src/mir/builder/control_flow/joinir/merge/instruction_rewriter.rs @@ -365,9 +365,17 @@ pub(super) fn merge_and_rewrite( // The issue was that pre-pass used stale remapper values before Phase 33-21 updates. // Instead, we now generate Copies for non-carrier params in the main block processing loop. - // Phase 286C-2.1 Step 2: Call scan_blocks() to establish 3-stage pipeline - // Currently returns empty plan - future steps will extract instruction scanning logic - let _scan_plan = scan_blocks(mir_module, remapper, value_to_func_name, &ctx, debug)?; + // Phase 286C-2.1 Step 3: Call scan_blocks() to identify rewrites + let scan_plan = scan_blocks(mir_module, remapper, value_to_func_name, &ctx, debug)?; + + if debug { + log!( + true, + "[cf_loop/joinir] Phase 286C-2.1: Scan complete - {} tail calls, {} returns", + scan_plan.tail_calls.len(), + scan_plan.return_conversions.len() + ); + } // ===== STAGE 2: PLAN (Generate rewritten blocks) ===== // TODO Phase 286C-2.1: Extract to plan_rewrites() @@ -1601,19 +1609,16 @@ pub(super) fn merge_and_rewrite( } } - // Phase 286C-2.1: Future orchestrator structure (Step 2 onwards): + // Phase 286C-2.1: Step 3 complete - scan_blocks() integrated + // Step 4-5 future work: Extract plan/apply logic into separate functions // - // // Stage 1: Scan - Read-only analysis - // let plan = scan_blocks(mir_module, remapper, value_to_func_name, &ctx, debug)?; + // Target orchestrator structure: + // 1. let plan = scan_blocks(...)?; // ✅ Done (Step 3) + // 2. let blocks = plan_rewrites(plan, &mut ctx)?; // TODO (Step 4) + // 3. apply_rewrites(builder, blocks)?; // TODO (Step 5) // - // // Stage 2: Plan - Generate rewritten blocks - // let blocks = plan_rewrites(plan, &mut ctx)?; - // - // // Stage 3: Apply - Mutate builder - // apply_rewrites(builder, blocks)?; - // - // // Build final merge result - // Ok(MergeResult { ... }) + // Current state: Main loop (lines 380-1469) contains both plan and apply logic. + // This needs to be separated into 2 stages for clean architecture. Ok(MergeResult { exit_block_id: ctx.exit_block_id,