diff --git a/src/mir/loop_builder.rs b/src/mir/loop_builder.rs index a176f65b..7a30ff4a 100644 --- a/src/mir/loop_builder.rs +++ b/src/mir/loop_builder.rs @@ -368,42 +368,46 @@ impl<'a> LoopBuilder<'a> { // Exit block self.set_current_block(exit_id)?; - // NOTE(25.1g+): ControlForm 統合後は build_exit_phis_for_control(...) 経由で - // LoopShape から exit_id/branch_source_block を決める導線に寄せる予定。 - // 現在は既存実装のまま(挙動変更なし)。 + // Phase 25.1h: ControlForm統合版に切り替え + // continue / break のターゲットブロックをユニーク化して収集 + use std::collections::HashSet; + let mut cont_set: HashSet = HashSet::new(); + let mut break_set: HashSet = HashSet::new(); + for (bb, _) in &self.continue_snapshots { + cont_set.insert(*bb); + } + for (bb, _) in &self.exit_snapshots { + break_set.insert(*bb); + } + let continue_targets: Vec = cont_set.into_iter().collect(); + let break_targets: Vec = break_set.into_iter().collect(); - // Build exit PHIs for break statements + let loop_shape = LoopShape { + preheader: preheader_id, + header: header_id, + body: body_id, + latch: latch_id, + exit: exit_id, + continue_targets, + break_targets, + }; + let form = ControlForm::from_loop(loop_shape.clone()); + + // Build exit PHIs for break statements using ControlForm wrapper let exit_snaps = self.exit_snapshots.clone(); - loopform.build_exit_phis(self, exit_id, branch_source_block, &exit_snaps)?; + crate::mir::phi_core::loopform_builder::build_exit_phis_for_control( + &loopform, + self, + &form, + &exit_snaps, + branch_source_block, + )?; // Pop loop context crate::mir::builder::loops::pop_loop_context(self.parent_builder); // ControlForm 観測: 環境フラグ(未設定時は既定ON)のとき LoopShape をダンプ if is_control_form_trace_on() { - // continue / break のターゲットブロックをユニーク化して収集 - use std::collections::HashSet; - let mut cont_set: HashSet = HashSet::new(); - let mut break_set: HashSet = HashSet::new(); - for (bb, _) in &self.continue_snapshots { - cont_set.insert(*bb); - } - for (bb, _) in &self.exit_snapshots { - break_set.insert(*bb); - } - let continue_targets: Vec = cont_set.into_iter().collect(); - let break_targets: Vec = break_set.into_iter().collect(); - - let loop_shape = LoopShape { - preheader: preheader_id, - header: header_id, - body: body_id, - latch: latch_id, - exit: exit_id, - continue_targets, - break_targets, - }; - let form = ControlForm::from_loop(loop_shape.clone()); form.debug_dump(); #[cfg(debug_assertions)] if let Some(ref func) = self.parent_builder.current_function { @@ -1181,31 +1185,28 @@ impl<'a> LoopBuilder<'a> { self.parent_builder.variable_map = pre_if_var_map.clone(); let mut ops = Ops(self); - // TODO(25.1g+): ControlForm 統合版に切り替えるときは、 - // IfShape から ControlForm を渡して merge_modified_with_control() を呼ぶ。 - // 現在は既存実装のまま(挙動変更なし)。 - crate::mir::phi_core::if_phi::merge_modified_at_merge_with( + // Phase 25.1h: ControlForm統合版に切り替え + let if_shape = IfShape { + cond_block: pre_branch_bb, + then_block: then_bb, + else_block: Some(else_bb), + merge_block: merge_bb, + }; + let form = ControlForm::from_if(if_shape.clone()); + + crate::mir::phi_core::if_phi::merge_modified_with_control( &mut ops, - merge_bb, - then_bb, - else_bb, - then_pred_to_merge, - else_pred_to_merge, + &form, &pre_if_var_map, &then_var_map_end, &else_var_map_end_opt, None, + then_pred_to_merge, + else_pred_to_merge, )?; // ControlForm 観測: 環境フラグ(未設定時は既定ON)のとき IfShape をダンプ if is_control_form_trace_on() { - let if_shape = IfShape { - cond_block: pre_branch_bb, - then_block: then_bb, - else_block: Some(else_bb), - merge_block: merge_bb, - }; - let form = ControlForm::from_if(if_shape.clone()); form.debug_dump(); #[cfg(debug_assertions)] if let Some(ref func) = self.parent_builder.current_function {