Remove false edges in CleanupPostBorrowck
This commit is contained in:
parent
4c3efc7f1b
commit
62f9084dfa
3 changed files with 16 additions and 46 deletions
|
@ -1,32 +1,26 @@
|
|||
//! This module provides a pass to replacing the following statements with
|
||||
//! [`Nop`]s
|
||||
//! This module provides a pass that removes parts of MIR that are no longer relevant after
|
||||
//! analysis phase and borrowck. In particular, it removes false edges, user type annotations and
|
||||
//! replaces following statements with [`Nop`]s:
|
||||
//!
|
||||
//! - [`AscribeUserType`]
|
||||
//! - [`FakeRead`]
|
||||
//! - [`Assign`] statements with a [`Shallow`] borrow
|
||||
//!
|
||||
//! The `CleanFakeReadsAndBorrows` "pass" is actually implemented as two
|
||||
//! traversals (aka visits) of the input MIR. The first traversal,
|
||||
//! `DeleteAndRecordFakeReads`, deletes the fake reads and finds the
|
||||
//! temporaries read by [`ForMatchGuard`] reads, and `DeleteFakeBorrows`
|
||||
//! deletes the initialization of those temporaries.
|
||||
//!
|
||||
//! [`AscribeUserType`]: rustc_middle::mir::StatementKind::AscribeUserType
|
||||
//! [`Shallow`]: rustc_middle::mir::BorrowKind::Shallow
|
||||
//! [`FakeRead`]: rustc_middle::mir::StatementKind::FakeRead
|
||||
//! [`Assign`]: rustc_middle::mir::StatementKind::Assign
|
||||
//! [`ForMatchGuard`]: rustc_middle::mir::FakeReadCause::ForMatchGuard
|
||||
//! [`FakeRead`]: rustc_middle::mir::StatementKind::FakeRead
|
||||
//! [`Nop`]: rustc_middle::mir::StatementKind::Nop
|
||||
//! [`Shallow`]: rustc_middle::mir::BorrowKind::Shallow
|
||||
|
||||
use crate::MirPass;
|
||||
use rustc_middle::mir::{Body, BorrowKind, Rvalue, StatementKind};
|
||||
use rustc_middle::mir::{Body, BorrowKind, Rvalue, StatementKind, TerminatorKind};
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
|
||||
pub struct CleanupPostBorrowck;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for CleanupPostBorrowck {
|
||||
fn run_pass(&self, _tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
for basic_block in body.basic_blocks.as_mut_preserves_cfg() {
|
||||
for basic_block in body.basic_blocks.as_mut() {
|
||||
for statement in basic_block.statements.iter_mut() {
|
||||
match statement.kind {
|
||||
StatementKind::AscribeUserType(..)
|
||||
|
@ -35,6 +29,14 @@ impl<'tcx> MirPass<'tcx> for CleanupPostBorrowck {
|
|||
_ => (),
|
||||
}
|
||||
}
|
||||
let terminator = basic_block.terminator_mut();
|
||||
match terminator.kind {
|
||||
TerminatorKind::FalseEdge { real_target, .. }
|
||||
| TerminatorKind::FalseUnwind { real_target, .. } => {
|
||||
terminator.kind = TerminatorKind::Goto { target: real_target };
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
body.user_type_annotations.raw.clear();
|
||||
|
|
|
@ -77,8 +77,6 @@ mod match_branches;
|
|||
mod multiple_return_terminators;
|
||||
mod normalize_array_len;
|
||||
mod nrvo;
|
||||
// This pass is public to allow external drivers to perform MIR cleanup
|
||||
pub mod remove_false_edges;
|
||||
mod remove_noop_landing_pads;
|
||||
mod remove_storage_markers;
|
||||
mod remove_uninit_drops;
|
||||
|
@ -494,10 +492,9 @@ fn run_analysis_to_runtime_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>
|
|||
/// After this series of passes, no lifetime analysis based on borrowing can be done.
|
||||
fn run_analysis_cleanup_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
let passes: &[&dyn MirPass<'tcx>] = &[
|
||||
&remove_false_edges::RemoveFalseEdges,
|
||||
&cleanup_post_borrowck::CleanupPostBorrowck,
|
||||
&simplify_branches::SimplifyConstCondition::new("initial"),
|
||||
&remove_noop_landing_pads::RemoveNoopLandingPads,
|
||||
&cleanup_post_borrowck::CleanupPostBorrowck,
|
||||
&simplify::SimplifyCfg::new("early-opt"),
|
||||
&deref_separator::Derefer,
|
||||
];
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
use rustc_middle::mir::{Body, TerminatorKind};
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
|
||||
use crate::MirPass;
|
||||
|
||||
/// Removes `FalseEdge` and `FalseUnwind` terminators from the MIR.
|
||||
///
|
||||
/// These are only needed for borrow checking, and can be removed afterwards.
|
||||
///
|
||||
/// FIXME: This should probably have its own MIR phase.
|
||||
pub struct RemoveFalseEdges;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for RemoveFalseEdges {
|
||||
fn run_pass(&self, _: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
for block in body.basic_blocks_mut() {
|
||||
let terminator = block.terminator_mut();
|
||||
terminator.kind = match terminator.kind {
|
||||
TerminatorKind::FalseEdge { real_target, .. } => {
|
||||
TerminatorKind::Goto { target: real_target }
|
||||
}
|
||||
TerminatorKind::FalseUnwind { real_target, .. } => {
|
||||
TerminatorKind::Goto { target: real_target }
|
||||
}
|
||||
|
||||
_ => continue,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue