From 37ebd47ddb1398c7b0f19aeb888417fbcf2d5992 Mon Sep 17 00:00:00 2001 From: "Samuel E. Moelius III" Date: Fri, 25 Mar 2022 21:11:49 -0400 Subject: Address review comments * Add lazily computed `switch_sources` data structure * Don't assume a target has only one associated value --- compiler/rustc_mir_dataflow/src/framework/direction.rs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'compiler/rustc_mir_dataflow/src/framework') diff --git a/compiler/rustc_mir_dataflow/src/framework/direction.rs b/compiler/rustc_mir_dataflow/src/framework/direction.rs index 1ad2722d91b..d7f531f7de7 100644 --- a/compiler/rustc_mir_dataflow/src/framework/direction.rs +++ b/compiler/rustc_mir_dataflow/src/framework/direction.rs @@ -267,11 +267,11 @@ impl Direction for Backward { propagate(pred, &tmp); } - mir::TerminatorKind::SwitchInt { ref targets, ref discr, switch_ty: _ } => { + mir::TerminatorKind::SwitchInt { targets: _, ref discr, switch_ty: _ } => { let mut applier = BackwardSwitchIntEdgeEffectsApplier { pred, exit_state, - targets, + values: &body.switch_sources()[bb][pred], bb, propagate: &mut propagate, effects_applied: false, @@ -309,7 +309,7 @@ impl Direction for Backward { struct BackwardSwitchIntEdgeEffectsApplier<'a, D, F> { pred: BasicBlock, exit_state: &'a mut D, - targets: &'a SwitchTargets, + values: &'a [Option], bb: BasicBlock, propagate: &'a mut F, @@ -324,10 +324,14 @@ where fn apply(&mut self, mut apply_edge_effect: impl FnMut(&mut D, SwitchIntTarget)) { assert!(!self.effects_applied); - let value = - self.targets.iter().find_map(|(value, target)| (target == self.bb).then_some(value)); - apply_edge_effect(self.exit_state, SwitchIntTarget { value, target: self.bb }); - (self.propagate)(self.pred, self.exit_state); + let targets = self.values.iter().map(|&value| SwitchIntTarget { value, target: self.bb }); + + let mut tmp = None; + for target in targets { + let tmp = opt_clone_from_or_clone(&mut tmp, self.exit_state); + apply_edge_effect(tmp, target); + (self.propagate)(self.pred, tmp); + } self.effects_applied = true; } -- cgit 1.4.1-3-g733a5