]>
Commit | Line | Data |
---|---|---|
9c376795 FG |
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: | |
041b39d2 | 4 | //! |
9fa01778 XL |
5 | //! - [`AscribeUserType`] |
6 | //! - [`FakeRead`] | |
7 | //! - [`Assign`] statements with a [`Shallow`] borrow | |
0531ce1d | 8 | //! |
ba9703b0 | 9 | //! [`AscribeUserType`]: rustc_middle::mir::StatementKind::AscribeUserType |
f9f354fc | 10 | //! [`Assign`]: rustc_middle::mir::StatementKind::Assign |
9c376795 | 11 | //! [`FakeRead`]: rustc_middle::mir::StatementKind::FakeRead |
ba9703b0 | 12 | //! [`Nop`]: rustc_middle::mir::StatementKind::Nop |
9c376795 | 13 | //! [`Shallow`]: rustc_middle::mir::BorrowKind::Shallow |
041b39d2 | 14 | |
c295e0f8 | 15 | use crate::MirPass; |
9c376795 | 16 | use rustc_middle::mir::{Body, BorrowKind, Rvalue, StatementKind, TerminatorKind}; |
ba9703b0 | 17 | use rustc_middle::ty::TyCtxt; |
041b39d2 | 18 | |
9c376795 | 19 | pub struct CleanupPostBorrowck; |
0531ce1d | 20 | |
9c376795 FG |
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(..) | |
353b0b11 | 27 | | StatementKind::PlaceMention(..) |
9c376795 FG |
28 | | StatementKind::Assign(box (_, Rvalue::Ref(_, BorrowKind::Shallow, _))) |
29 | | StatementKind::FakeRead(..) => statement.make_nop(), | |
30 | _ => (), | |
31 | } | |
32 | } | |
33 | let terminator = basic_block.terminator_mut(); | |
34 | match terminator.kind { | |
35 | TerminatorKind::FalseEdge { real_target, .. } | |
36 | | TerminatorKind::FalseUnwind { real_target, .. } => { | |
37 | terminator.kind = TerminatorKind::Goto { target: real_target }; | |
38 | } | |
39 | _ => {} | |
40 | } | |
41 | } | |
0531ce1d | 42 | |
ba9703b0 | 43 | body.user_type_annotations.raw.clear(); |
f9f354fc XL |
44 | |
45 | for decl in &mut body.local_decls { | |
46 | decl.user_ty = None; | |
47 | } | |
0531ce1d XL |
48 | } |
49 | } |