feat(joinir): Phase 164 Pattern3 (If-Else PHI) validation complete
- Created 4 representative test cases for Pattern3 patterns: * test_pattern3_if_phi_no_break.hako - Core Pattern3 (if-else PHI, no break/continue) * test_pattern3_skip_whitespace.hako - Pattern3+break style (routed to Pattern2) * test_pattern3_trim_leading.hako - Pattern3+break style (routed to Pattern2) * test_pattern3_trim_trailing.hako - Pattern3+break style (routed to Pattern2) - Validated Pattern3_WithIfPhi detection: * Pattern routing: Pattern3_WithIfPhi MATCHED confirmed * JoinIR lowering: 3 functions, 20 blocks → 8 blocks (successful) * [joinir/freeze] elimination: Complete (no errors on any test) - Clarified pattern classification: * Pattern3_WithIfPhi handles if-else PHI without break/continue * Loops with "if-else PHI + break" are routed to Pattern2_WithBreak * Break takes priority over if-else PHI in pattern detection - Cumulative achievement (Phase 162-164): * Pattern1: 6 loops working ✅ * Pattern2: 5 loops working ✅ * Pattern3 (no break): 1 loop working ✅ * Pattern3+break (as Pattern2): 3 loops working ✅ * Total: 15 loops covered, zero [joinir/freeze] errors - Updated CURRENT_TASK.md with Phase 164 section and findings Next: Phase 165 Pattern4 (continue) validation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -139,17 +139,27 @@ impl MirBuilder {
|
||||
carriers: carriers.clone(),
|
||||
};
|
||||
|
||||
eprintln!("[pattern4] CarrierInfo: loop_var={}, carriers={:?}",
|
||||
carrier_info.loop_var_name,
|
||||
carrier_info.carriers.iter().map(|c| &c.name).collect::<Vec<_>>()
|
||||
trace::trace().debug(
|
||||
"pattern4",
|
||||
&format!(
|
||||
"CarrierInfo: loop_var={}, carriers={:?}",
|
||||
carrier_info.loop_var_name,
|
||||
carrier_info.carriers.iter().map(|c| &c.name).collect::<Vec<_>>()
|
||||
)
|
||||
);
|
||||
|
||||
// Phase 197: Analyze carrier update expressions from loop body
|
||||
let carrier_updates = LoopUpdateAnalyzer::analyze_carrier_updates(_body, &carrier_info.carriers);
|
||||
|
||||
eprintln!("[pattern4] Analyzed {} carrier update expressions", carrier_updates.len());
|
||||
trace::trace().debug(
|
||||
"pattern4",
|
||||
&format!("Analyzed {} carrier update expressions", carrier_updates.len())
|
||||
);
|
||||
for (carrier_name, update_expr) in &carrier_updates {
|
||||
eprintln!("[pattern4] {} → {:?}", carrier_name, update_expr);
|
||||
trace::trace().debug(
|
||||
"pattern4",
|
||||
&format!(" {} → {:?}", carrier_name, update_expr)
|
||||
);
|
||||
}
|
||||
|
||||
// Phase 195: Use unified trace
|
||||
@ -181,9 +191,15 @@ impl MirBuilder {
|
||||
}
|
||||
};
|
||||
|
||||
eprintln!("[pattern4] ExitMeta: {} exit bindings", exit_meta.exit_values.len());
|
||||
trace::trace().debug(
|
||||
"pattern4",
|
||||
&format!("ExitMeta: {} exit bindings", exit_meta.exit_values.len())
|
||||
);
|
||||
for (carrier_name, join_value) in &exit_meta.exit_values {
|
||||
eprintln!("[pattern4] {} → ValueId({})", carrier_name, join_value.0);
|
||||
trace::trace().debug(
|
||||
"pattern4",
|
||||
&format!(" {} → ValueId({})", carrier_name, join_value.0)
|
||||
);
|
||||
}
|
||||
|
||||
// Phase 195: Use unified trace
|
||||
@ -232,8 +248,10 @@ impl MirBuilder {
|
||||
},
|
||||
);
|
||||
|
||||
eprintln!("[pattern4] Generated binding: {} → JoinIR={} Host={}",
|
||||
carrier_name, join_exit_value.0, host_slot.0);
|
||||
trace::trace().debug(
|
||||
"pattern4",
|
||||
&format!("Generated binding: {} → JoinIR={} Host={}", carrier_name, join_exit_value.0, host_slot.0)
|
||||
);
|
||||
}
|
||||
|
||||
// Phase 196: Build host_inputs dynamically
|
||||
@ -243,7 +261,10 @@ impl MirBuilder {
|
||||
host_inputs.push(carrier.host_id);
|
||||
}
|
||||
|
||||
eprintln!("[pattern4] host_inputs: {:?}", host_inputs.iter().map(|v| v.0).collect::<Vec<_>>());
|
||||
trace::trace().debug(
|
||||
"pattern4",
|
||||
&format!("host_inputs: {:?}", host_inputs.iter().map(|v| v.0).collect::<Vec<_>>())
|
||||
);
|
||||
|
||||
// Merge JoinIR blocks into current function
|
||||
// Phase 196: Use dynamically generated exit_bindings and host_inputs
|
||||
@ -254,7 +275,10 @@ impl MirBuilder {
|
||||
join_inputs.push(ValueId((idx + 1) as u32)); // ValueId(1..N) = carrier inits
|
||||
}
|
||||
|
||||
eprintln!("[pattern4] join_inputs: {:?}", join_inputs.iter().map(|v| v.0).collect::<Vec<_>>());
|
||||
trace::trace().debug(
|
||||
"pattern4",
|
||||
&format!("join_inputs: {:?}", join_inputs.iter().map(|v| v.0).collect::<Vec<_>>())
|
||||
);
|
||||
|
||||
let boundary = crate::mir::join_ir::lowering::inline_boundary::JoinInlineBoundary::new_with_exit_bindings(
|
||||
join_inputs, // JoinIR's main() parameters (dynamic)
|
||||
|
||||
Reference in New Issue
Block a user