Avoid constructing switch sources unless necessary

Switch sources are used by backward analysis with a custom switch int
edge effects, but are otherwise unnecessarily computed.

Delay the computation until we know that switch sources are indeed
required and avoid the computation otherwise.
This commit is contained in:
Tomasz Miąsko
2022-05-08 00:00:00 +00:00
parent 83322c557f
commit fbc3cc18be
2 changed files with 6 additions and 3 deletions
+2
View File
@@ -580,6 +580,8 @@ pub fn predecessors(&self) -> &Predecessors {
self.predecessor_cache.compute(&self.basic_blocks)
}
/// `body.switch_sources()[target][switch]` returns a list of switch values
/// that lead to a `target` block from a `switch` block.
#[inline]
pub fn switch_sources(&self) -> &SwitchSources {
self.switch_source_cache.compute(&self.basic_blocks)
@@ -269,9 +269,9 @@ fn join_state_into_successors_of<'tcx, A>(
mir::TerminatorKind::SwitchInt { targets: _, ref discr, switch_ty: _ } => {
let mut applier = BackwardSwitchIntEdgeEffectsApplier {
body,
pred,
exit_state,
values: &body.switch_sources()[bb][pred],
bb,
propagate: &mut propagate,
effects_applied: false,
@@ -305,9 +305,9 @@ fn join_state_into_successors_of<'tcx, A>(
}
struct BackwardSwitchIntEdgeEffectsApplier<'a, D, F> {
body: &'a mir::Body<'a>,
pred: BasicBlock,
exit_state: &'a mut D,
values: &'a [Option<u128>],
bb: BasicBlock,
propagate: &'a mut F,
@@ -322,7 +322,8 @@ impl<D, F> super::SwitchIntEdgeEffects<D> for BackwardSwitchIntEdgeEffectsApplie
fn apply(&mut self, mut apply_edge_effect: impl FnMut(&mut D, SwitchIntTarget)) {
assert!(!self.effects_applied);
let targets = self.values.iter().map(|&value| SwitchIntTarget { value, target: self.bb });
let values = &self.body.switch_sources()[self.bb][self.pred];
let targets = values.iter().map(|&value| SwitchIntTarget { value, target: self.bb });
let mut tmp = None;
for target in targets {