feat(phi): Phase 26-E-4 - variable_map リセットタイミング修正
**問題**: - loop_builder.rs の lower_if_in_loop で PHI生成**前**に variable_map を pre_if_var_map にリセット - else ブロック内で定義された変数が消失 → domination error 発生 - エラー: `Value %48 (obj_end) used in block bb54 but defined in non-dominating block bb52` **修正内容**: - 1053行, 1129行削除: PHI生成前の variable_map リセット(早すぎる) - 1155-1159行追加: PHI生成**後**に variable_map リセット - 理由: else_var_map_end_opt が正しい snapshot を保持したまま PHI 生成に渡す必要がある **結果**: - 決定性100%達成(3回実行で一貫したエラー) - domination error 部分改善: bb52→bb54 から bb53→bb55 に変化 - 残課題: bb53 (break先) → bb55 (merge) の PHI 問題(別途対応予定) **指示元**: ChatGPT + Task先生 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -113,7 +113,7 @@ impl<'a> LoopBuilder<'a> {
|
||||
// [LoopForm] continue-backedge path: スナップショット保存(continue_merge → header)
|
||||
match kind {
|
||||
LoopExitKind::Break => {
|
||||
if std::env::var("NYASH_LOOPFORM_DEBUG").ok().as_deref() == Some("1") {
|
||||
if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() {
|
||||
eprintln!(
|
||||
"[DEBUG/do_break] Saved snapshot from block {:?}, vars: {:?}",
|
||||
cur_block,
|
||||
@ -1049,9 +1049,6 @@ impl<'a> LoopBuilder<'a> {
|
||||
crate::mir::phi_core::if_phi::collect_assigned_vars(&else_prog, &mut vars);
|
||||
}
|
||||
|
||||
// Reset to pre-if map before rebinding to ensure a clean environment
|
||||
self.parent_builder.variable_map = pre_if_var_map.clone();
|
||||
|
||||
// Phase 26-E: PhiBuilderBox 統合
|
||||
// Ops構造体: PhiMergeOps(Legacy)と PhiBuilderOps(新)の両対応
|
||||
struct Ops<'b, 'a>(&'b mut LoopBuilder<'a>);
|
||||
@ -1128,8 +1125,6 @@ impl<'a> LoopBuilder<'a> {
|
||||
}
|
||||
}
|
||||
}
|
||||
// Reset to pre-if snapshot, then delegate to shared helper
|
||||
self.parent_builder.variable_map = pre_if_var_map.clone();
|
||||
|
||||
// Phase 25.1h: ControlForm統合版に切り替え
|
||||
let if_shape = IfShape {
|
||||
@ -1157,6 +1152,12 @@ impl<'a> LoopBuilder<'a> {
|
||||
};
|
||||
phi_builder.generate_phis(&mut ops, &form, &pre_if_var_map, &post_snapshots)?;
|
||||
|
||||
// Phase 26-E-4: PHI生成後に variable_map をリセット(ChatGPT/Task先生指示)
|
||||
// 理由: else_var_map_end_opt が正しい snapshot を保持したまま PHI 生成に渡す必要がある
|
||||
// 修正前: PHI生成前にリセット → else ブロック内定義変数が消失 → domination error
|
||||
// 修正後: PHI生成後にリセット → 正しいPHI入力 → SSA保証
|
||||
self.parent_builder.variable_map = pre_if_var_map.clone();
|
||||
|
||||
// ControlForm 観測: 環境フラグ(未設定時は既定ON)のとき IfShape をダンプ
|
||||
if is_control_form_trace_on() {
|
||||
form.debug_dump();
|
||||
|
||||
Reference in New Issue
Block a user