]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_mir_transform/src/cleanup_post_borrowck.rs
New upstream version 1.70.0+dfsg1
[rustc.git] / compiler / rustc_mir_transform / src / cleanup_post_borrowck.rs
CommitLineData
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 15use crate::MirPass;
9c376795 16use rustc_middle::mir::{Body, BorrowKind, Rvalue, StatementKind, TerminatorKind};
ba9703b0 17use rustc_middle::ty::TyCtxt;
041b39d2 18
9c376795 19pub struct CleanupPostBorrowck;
0531ce1d 20
9c376795
FG
21impl<'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}