use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_middle::mir::*;
use rustc_middle::ty::TyCtxt;
-use std::borrow::Cow;
pub struct UnreachablePropagation;
{
let terminator = match *terminator_kind {
TerminatorKind::Goto { target } if predicate(target) => TerminatorKind::Unreachable,
- TerminatorKind::SwitchInt { ref discr, switch_ty, ref values, ref targets } => {
- let original_targets_len = targets.len();
- let (otherwise, targets) = targets.split_last().unwrap();
+ TerminatorKind::SwitchInt { ref discr, switch_ty, ref targets } => {
+ let otherwise = targets.otherwise();
+
+ let original_targets_len = targets.iter().len() + 1;
let (mut values, mut targets): (Vec<_>, Vec<_>) =
- values.iter().zip(targets.iter()).filter(|(_, &t)| !predicate(t)).unzip();
+ targets.iter().filter(|(_, bb)| !predicate(*bb)).unzip();
- if !predicate(*otherwise) {
- targets.push(*otherwise);
+ if !predicate(otherwise) {
+ targets.push(otherwise);
} else {
values.pop();
}
TerminatorKind::SwitchInt {
discr: discr.clone(),
switch_ty,
- values: Cow::from(values),
- targets,
+ targets: SwitchTargets::new(
+ values.iter().copied().zip(targets.iter().copied()),
+ *targets.last().unwrap(),
+ ),
}
} else {
return None;