about summary refs log tree commit diff
path: root/compiler/rustc_mir_dataflow/src/framework
diff options
context:
space:
mode:
authorSamuel E. Moelius III <sam@moeli.us>2022-03-25 21:11:49 -0400
committerSamuel E. Moelius III <sam@moeli.us>2022-03-26 08:01:51 -0400
commit37ebd47ddb1398c7b0f19aeb888417fbcf2d5992 (patch)
tree1f53942b70d5523b4dc8c9c4b2225989c9601e90 /compiler/rustc_mir_dataflow/src/framework
parentee7413b94cd0f953518ad73f37cac28feb6e8d52 (diff)
downloadrust-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.rs18
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;
     }