fix(joinir): Phase 118 Pattern3 exit carrier PHI SSOT

This commit is contained in:
nyash-codex
2025-12-18 03:43:00 +09:00
parent 2c7f5f7a5e
commit 1080dee58f
4 changed files with 161 additions and 134 deletions

View File

@ -14,7 +14,6 @@
mod block_allocator;
mod carrier_init_builder;
#[cfg(debug_assertions)]
mod contract_checks;
pub mod exit_line;
mod exit_phi_builder;
@ -738,6 +737,48 @@ pub(in crate::mir::builder) fn merge_joinir_mir_blocks(
debug,
)?;
// Phase 118 P2: Contract check (Fail-Fast) - exit_bindings LoopState carriers must have exit PHIs.
if let Some(boundary) = boundary {
contract_checks::verify_exit_bindings_have_exit_phis(boundary, &exit_carrier_phis)?;
}
// Phase 118 P1: Dev-only carrier-phi SSOT logs (exit_bindings vs carrier_inputs vs exit_carrier_phis)
if crate::config::env::joinir_dev_enabled() {
if let Some(boundary) = boundary {
let exit_binding_names: Vec<&str> = boundary
.exit_bindings
.iter()
.map(|b| b.carrier_name.as_str())
.collect();
let carrier_input_names: Vec<&str> =
merge_result.carrier_inputs.keys().map(|s| s.as_str()).collect();
let exit_phi_names: Vec<&str> =
exit_carrier_phis.keys().map(|s| s.as_str()).collect();
trace.stderr_if(
&format!(
"[joinir/phase118/dev] exit_bindings carriers={:?}",
exit_binding_names
),
true,
);
trace.stderr_if(
&format!(
"[joinir/phase118/dev] carrier_inputs keys={:?}",
carrier_input_names
),
true,
);
trace.stderr_if(
&format!(
"[joinir/phase118/dev] exit_carrier_phis keys={:?}",
exit_phi_names
),
true,
);
}
}
// Phase 246-EX: CRITICAL FIX - Use exit PHI dsts for variable_map reconnection
//
// **Why EXIT PHI, not HEADER PHI?**