1 //! This module provides a pass that removes parts of MIR that are no longer relevant after
2 //! analysis phase and borrowck. In particular, it removes false edges, user type annotations and
3 //! replaces following statements with [`Nop`]s:
5 //! - [`AscribeUserType`]
7 //! - [`Assign`] statements with a [`Shallow`] borrow
9 //! [`AscribeUserType`]: rustc_middle::mir::StatementKind::AscribeUserType
10 //! [`Assign`]: rustc_middle::mir::StatementKind::Assign
11 //! [`FakeRead`]: rustc_middle::mir::StatementKind::FakeRead
12 //! [`Nop`]: rustc_middle::mir::StatementKind::Nop
13 //! [`Shallow`]: rustc_middle::mir::BorrowKind::Shallow
16 use rustc_middle::mir::{Body, BorrowKind, Rvalue, StatementKind, TerminatorKind};
17 use rustc_middle::ty::TyCtxt;
19 pub struct CleanupPostBorrowck;
21 impl<'tcx> MirPass<'tcx> for CleanupPostBorrowck {
22 fn run_pass(&self, _tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
23 for basic_block in body.basic_blocks.as_mut() {
24 for statement in basic_block.statements.iter_mut() {
25 match statement.kind {
26 StatementKind::AscribeUserType(..)
27 | StatementKind::Assign(box (_, Rvalue::Ref(_, BorrowKind::Shallow, _)))
28 | StatementKind::FakeRead(..) => statement.make_nop(),
32 let terminator = basic_block.terminator_mut();
33 match terminator.kind {
34 TerminatorKind::FalseEdge { real_target, .. }
35 | TerminatorKind::FalseUnwind { real_target, .. } => {
36 terminator.kind = TerminatorKind::Goto { target: real_target };
42 body.user_type_annotations.raw.clear();
44 for decl in &mut body.local_decls {