feat(joinir): Phase 224-D - ConditionAlias for promoted variable resolution

- Add ConditionAlias type to CarrierInfo (old_name → carrier_name)
- Record aliases in DigitPosPromoter and TrimPatternInfo
- Resolve aliases in Pattern2 ConditionEnv building
- digit_pos now correctly resolves to is_digit_pos carrier

Fixes "Variable 'digit_pos' not bound in ConditionEnv" error.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-10 18:45:04 +09:00
parent 8e3b55ddec
commit 4e00edcea5
8 changed files with 174 additions and 58 deletions

View File

@ -210,16 +210,6 @@ impl MirBuilder {
}
}
// Phase 201: Allocate carrier ValueIds from Param region and SET join_id
// This ensures carriers are also in the safe Param region
// CRITICAL: We must set join_id so the lowerer can access it
for carrier in &mut carrier_info.carriers {
let carrier_join_id = join_value_space.alloc_param();
carrier.join_id = Some(carrier_join_id);
eprintln!("[pattern2/phase201] Allocated carrier '{}' param ID: {:?}",
carrier.name, carrier_join_id);
}
// Phase 191: Create empty body-local environment
// LoopBodyLocalInitLowerer will populate it during init lowering
use crate::mir::join_ir::lowering::loop_body_local_env::LoopBodyLocalEnv;
@ -228,10 +218,6 @@ impl MirBuilder {
eprintln!("[pattern2/body-local] Phase 201: Created empty body-local environment (param_count={})",
join_value_space.param_count());
// Phase 201: Create alloc_join_value closure using JoinValueSpace
// This ensures all param allocations go through the unified space
let mut alloc_join_value = || join_value_space.alloc_param();
// Debug: Log condition bindings
eprintln!("[cf_loop/pattern2] Phase 201: ConditionEnv contains {} variables:", env.len());
eprintln!(" Loop param '{}' → JoinIR {:?}", loop_var_name, env.get(&loop_var_name));
@ -352,6 +338,62 @@ impl MirBuilder {
}
}
// Phase 224-D: Allocate join_ids for ALL carriers (including newly merged ones)
// This must happen AFTER promotion/merge to include promoted carriers
eprintln!("[pattern2/phase224d] Allocating join_ids for {} carriers", carrier_info.carriers.len());
for carrier in &mut carrier_info.carriers {
let carrier_join_id = join_value_space.alloc_param();
carrier.join_id = Some(carrier_join_id);
eprintln!("[pattern2/phase224d] Allocated carrier '{}' param ID: {:?}",
carrier.name, carrier_join_id);
}
// Phase 224-D: Save carriers with join_ids BEFORE filtering
let carriers_with_join_ids = carrier_info.carriers.clone();
// Phase 224-D: Add condition aliases to ConditionEnv
// This allows promoted variables to be referenced by their original names in conditions
for alias in &carrier_info.condition_aliases {
// Check if the carrier_name matches the loop_var_name (promoted as main carrier)
if alias.carrier_name == carrier_info.loop_var_name {
// Use loop variable's join_id from env
if let Some(join_id) = env.get(&carrier_info.loop_var_name) {
env.insert(alias.old_name.clone(), join_id);
eprintln!(
"[pattern2/phase224d] Added condition alias '{}' → loop_var '{}' (join_id={:?})",
alias.old_name, carrier_info.loop_var_name, join_id
);
}
} else {
// Find the carrier's join_id in the carriers list (BEFORE filtering, with join_ids)
if let Some(carrier) = carriers_with_join_ids.iter().find(|c| c.name == alias.carrier_name) {
if let Some(join_id) = carrier.join_id {
// Add alias mapping: old_name → carrier's join_id
env.insert(alias.old_name.clone(), join_id);
eprintln!(
"[pattern2/phase224d] Added condition alias '{}' → carrier '{}' (join_id={:?})",
alias.old_name, alias.carrier_name, join_id
);
} else {
eprintln!(
"[pattern2/phase224d] WARNING: Carrier '{}' has no join_id yet!",
alias.carrier_name
);
}
} else {
eprintln!(
"[pattern2/phase224d] WARNING: Carrier '{}' not found in carriers list!",
alias.carrier_name
);
}
}
}
// Phase 201: Create alloc_join_value closure using JoinValueSpace
// This ensures all param allocations go through the unified space
// NOTE: Must be created AFTER all direct join_value_space.alloc_param() calls
let mut alloc_join_value = || join_value_space.alloc_param();
// Phase 180-3: Delegate Trim/P5 processing to TrimLoopLowerer
let effective_break_condition = if let Some(trim_result) = super::trim_loop_lowering::TrimLoopLowerer::try_lower_trim_like_loop(
self,

View File

@ -73,6 +73,7 @@ impl Pattern4CarrierAnalyzer {
carriers: updated_carriers,
trim_helper: all_carriers.trim_helper.clone(),
promoted_loopbodylocals: all_carriers.promoted_loopbodylocals.clone(), // Phase 224
condition_aliases: all_carriers.condition_aliases.clone(), // Phase 224-D
})
}