diff options
| author | Samuel E. Moelius III <sam@moeli.us> | 2022-03-25 21:11:49 -0400 |
|---|---|---|
| committer | Samuel E. Moelius III <sam@moeli.us> | 2022-03-26 08:01:51 -0400 |
| commit | 37ebd47ddb1398c7b0f19aeb888417fbcf2d5992 (patch) | |
| tree | 1f53942b70d5523b4dc8c9c4b2225989c9601e90 /compiler/rustc_mir_dataflow/src/framework | |
| parent | ee7413b94cd0f953518ad73f37cac28feb6e8d52 (diff) | |
| download | rust-37ebd47ddb1398c7b0f19aeb888417fbcf2d5992.tar.gz rust-37ebd47ddb1398c7b0f19aeb888417fbcf2d5992.zip | |
Address review comments
* Add lazily computed `switch_sources` data structure * Don't assume a target has only one associated value
Diffstat (limited to 'compiler/rustc_mir_dataflow/src/framework')
| -rw-r--r-- | compiler/rustc_mir_dataflow/src/framework/direction.rs | 18 |
1 files changed, 11 insertions, 7 deletions
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<u128>], 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; } |
