]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_mir_transform/src/cleanup_post_borrowck.rs
New upstream version 1.71.1+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(..)
27 | StatementKind::Assign(box (_, Rvalue::Ref(_, BorrowKind::Shallow, _)))
28 | StatementKind::FakeRead(..) => statement.make_nop(),
29 _ => (),
30 }
31 }
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 };
37 }
38 _ => {}
39 }
40 }
0531ce1d 41
ba9703b0 42 body.user_type_annotations.raw.clear();
f9f354fc
XL
43
44 for decl in &mut body.local_decls {
45 decl.user_ty = None;
46 }
0531ce1d
XL
47 }
48}