//!
//! into just `x`.
-use crate::transform::{MirPass, MirSource, simplify};
-use rustc::ty::{TyCtxt, Ty};
+use crate::transform::{simplify, MirPass, MirSource};
+use itertools::Itertools as _;
use rustc::mir::*;
+use rustc::ty::{Ty, TyCtxt};
use rustc_target::abi::VariantIdx;
-use itertools::Itertools as _;
/// Simplifies arms of form `Variant(x) => Variant(x)` to just a move.
///
pub struct SimplifyArmIdentity;
impl<'tcx> MirPass<'tcx> for SimplifyArmIdentity {
- fn run_pass(&self, _: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut BodyCache<'tcx>) {
+ fn run_pass(&self, _: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut();
for bb in basic_blocks {
// Need 3 statements:
/// ```
fn match_set_discr<'tcx>(stmt: &Statement<'tcx>) -> Option<(Local, VariantIdx)> {
match &stmt.kind {
- StatementKind::SetDiscriminant { place, variant_index } => Some((
- place.as_local()?,
- *variant_index
- )),
+ StatementKind::SetDiscriminant { place, variant_index } => {
+ Some((place.as_local()?, *variant_index))
+ }
_ => None,
}
}
fn match_variant_field_place<'tcx>(place: &Place<'tcx>) -> Option<(Local, VarField<'tcx>)> {
match place.as_ref() {
PlaceRef {
- base: &PlaceBase::Local(local),
+ local,
projection: &[ProjectionElem::Downcast(_, var_idx), ProjectionElem::Field(field, ty)],
- } => Some((local, VarField { field, field_ty: ty, var_idx })),
+ } => Some((*local, VarField { field, field_ty: ty, var_idx })),
_ => None,
}
}
pub struct SimplifyBranchSame;
impl<'tcx> MirPass<'tcx> for SimplifyBranchSame {
- fn run_pass(&self, _: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut BodyCache<'tcx>) {
+ fn run_pass(&self, _: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
let mut did_remove_blocks = false;
let bbs = body.basic_blocks_mut();
for bb_idx in bbs.indices() {
.peekable();
// We want to `goto -> bb_first`.
- let bb_first = iter_bbs_reachable
- .peek()
- .map(|(idx, _)| *idx)
- .unwrap_or(targets[0]);
+ let bb_first = iter_bbs_reachable.peek().map(|(idx, _)| *idx).unwrap_or(targets[0]);
// All successor basic blocks should have the exact same form.
- let all_successors_equivalent = iter_bbs_reachable
- .map(|(_, bb)| bb)
- .tuple_windows()
- .all(|(bb_l, bb_r)| {
+ let all_successors_equivalent =
+ iter_bbs_reachable.map(|(_, bb)| bb).tuple_windows().all(|(bb_l, bb_r)| {
bb_l.is_cleanup == bb_r.is_cleanup
- && bb_l.terminator().kind == bb_r.terminator().kind
- && bb_l.statements.iter().eq_by(&bb_r.statements, |x, y| x.kind == y.kind)
+ && bb_l.terminator().kind == bb_r.terminator().kind
+ && bb_l.statements.iter().eq_by(&bb_r.statements, |x, y| x.kind == y.kind)
});
if all_successors_equivalent {