From 9c601611a02bd2026065a50ba640697488f064b6 Mon Sep 17 00:00:00 2001 From: Matthew Jasper Date: Sat, 19 Jan 2019 19:13:34 +0000 Subject: [PATCH] Simplify the cleanup_post_borrowck passes --- .../transform/cleanup_post_borrowck.rs | 97 ++++--------------- src/librustc_mir/transform/mod.rs | 8 +- src/test/mir-opt/remove_fake_borrows.rs | 10 +- 3 files changed, 25 insertions(+), 90 deletions(-) diff --git a/src/librustc_mir/transform/cleanup_post_borrowck.rs b/src/librustc_mir/transform/cleanup_post_borrowck.rs index 890d2c56f42..349b27523a0 100644 --- a/src/librustc_mir/transform/cleanup_post_borrowck.rs +++ b/src/librustc_mir/transform/cleanup_post_borrowck.rs @@ -1,9 +1,9 @@ -//! This module provides two passes: +//! This module provides a pass to replacing the following statements with +//! [`Nop`]s //! -//! - [`CleanAscribeUserType`], that replaces all [`AscribeUserType`] -//! statements with [`Nop`]. -//! - [`CleanFakeReadsAndBorrows`], that replaces all [`FakeRead`] statements -//! and borrows that are read by [`ForMatchGuard`] fake reads with [`Nop`]. +//! - [`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, @@ -11,102 +11,41 @@ //! temporaries read by [`ForMatchGuard`] reads, and [`DeleteFakeBorrows`] //! deletes the initialization of those temporaries. //! -//! [`CleanAscribeUserType`]: cleanup_post_borrowck::CleanAscribeUserType -//! [`CleanFakeReadsAndBorrows`]: cleanup_post_borrowck::CleanFakeReadsAndBorrows -//! [`DeleteAndRecordFakeReads`]: cleanup_post_borrowck::DeleteAndRecordFakeReads -//! [`DeleteFakeBorrows`]: cleanup_post_borrowck::DeleteFakeBorrows //! [`AscribeUserType`]: rustc::mir::StatementKind::AscribeUserType -//! [`Nop`]: rustc::mir::StatementKind::Nop +//! [`Shallow`]: rustc::mir::BorrowKind::Shallow //! [`FakeRead`]: rustc::mir::StatementKind::FakeRead -//! [`ForMatchGuard`]: rustc::mir::FakeReadCause::ForMatchGuard - -use rustc_data_structures::fx::FxHashSet; +//! [`Nop`]: rustc::mir::StatementKind::Nop -use rustc::mir::{BasicBlock, FakeReadCause, Local, Location, Mir, Place}; +use rustc::mir::{BasicBlock, BorrowKind, Rvalue, Location, Mir}; use rustc::mir::{Statement, StatementKind}; use rustc::mir::visit::MutVisitor; use rustc::ty::TyCtxt; use crate::transform::{MirPass, MirSource}; -pub struct CleanAscribeUserType; +pub struct CleanupNonCodegenStatements; -pub struct DeleteAscribeUserType; +pub struct DeleteNonCodegenStatements; -impl MirPass for CleanAscribeUserType { +impl MirPass for CleanupNonCodegenStatements { fn run_pass<'a, 'tcx>(&self, _tcx: TyCtxt<'a, 'tcx, 'tcx>, _source: MirSource<'tcx>, mir: &mut Mir<'tcx>) { - let mut delete = DeleteAscribeUserType; + let mut delete = DeleteNonCodegenStatements; delete.visit_mir(mir); } } -impl<'tcx> MutVisitor<'tcx> for DeleteAscribeUserType { - fn visit_statement(&mut self, - block: BasicBlock, - statement: &mut Statement<'tcx>, - location: Location) { - if let StatementKind::AscribeUserType(..) = statement.kind { - statement.make_nop(); - } - self.super_statement(block, statement, location); - } -} - -pub struct CleanFakeReadsAndBorrows; - -#[derive(Default)] -pub struct DeleteAndRecordFakeReads { - fake_borrow_temporaries: FxHashSet, -} - -pub struct DeleteFakeBorrows { - fake_borrow_temporaries: FxHashSet, -} - -// Removes any FakeReads from the MIR -impl MirPass for CleanFakeReadsAndBorrows { - fn run_pass<'a, 'tcx>(&self, - _tcx: TyCtxt<'a, 'tcx, 'tcx>, - _source: MirSource<'tcx>, - mir: &mut Mir<'tcx>) { - let mut delete_reads = DeleteAndRecordFakeReads::default(); - delete_reads.visit_mir(mir); - let mut delete_borrows = DeleteFakeBorrows { - fake_borrow_temporaries: delete_reads.fake_borrow_temporaries, - }; - delete_borrows.visit_mir(mir); - } -} - -impl<'tcx> MutVisitor<'tcx> for DeleteAndRecordFakeReads { - fn visit_statement(&mut self, - block: BasicBlock, - statement: &mut Statement<'tcx>, - location: Location) { - if let StatementKind::FakeRead(cause, ref place) = statement.kind { - if let FakeReadCause::ForMatchGuard = cause { - match *place { - Place::Local(local) => self.fake_borrow_temporaries.insert(local), - _ => bug!("Fake match guard read of non-local: {:?}", place), - }; - } - statement.make_nop(); - } - self.super_statement(block, statement, location); - } -} - -impl<'tcx> MutVisitor<'tcx> for DeleteFakeBorrows { +impl<'tcx> MutVisitor<'tcx> for DeleteNonCodegenStatements { fn visit_statement(&mut self, block: BasicBlock, statement: &mut Statement<'tcx>, location: Location) { - if let StatementKind::Assign(Place::Local(local), _) = statement.kind { - if self.fake_borrow_temporaries.contains(&local) { - statement.make_nop(); - } + match statement.kind { + StatementKind::AscribeUserType(..) + | StatementKind::Assign(_, box Rvalue::Ref(_, BorrowKind::Shallow, _)) + | StatementKind::FakeRead(..) => statement.make_nop(), + _ => (), } self.super_statement(block, statement, location); } diff --git a/src/librustc_mir/transform/mod.rs b/src/librustc_mir/transform/mod.rs index 28b9e082851..48884872a01 100644 --- a/src/librustc_mir/transform/mod.rs +++ b/src/librustc_mir/transform/mod.rs @@ -241,15 +241,11 @@ fn optimized_mir<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx let mut mir = tcx.mir_validated(def_id).steal(); run_passes(tcx, &mut mir, InstanceDef::Item(def_id), MirPhase::Optimized, &[ - // Remove all things not needed by analysis + // Remove all things only needed by analysis &no_landing_pads::NoLandingPads, &simplify_branches::SimplifyBranches::new("initial"), &remove_noop_landing_pads::RemoveNoopLandingPads, - // Remove all `AscribeUserType` statements. - &cleanup_post_borrowck::CleanAscribeUserType, - // Remove all `FakeRead` statements and the borrows that are only - // used for checking matches - &cleanup_post_borrowck::CleanFakeReadsAndBorrows, + &cleanup_post_borrowck::CleanupNonCodegenStatements, &simplify::SimplifyCfg::new("early-opt"), diff --git a/src/test/mir-opt/remove_fake_borrows.rs b/src/test/mir-opt/remove_fake_borrows.rs index fab4d28a936..ebb1ef2f430 100644 --- a/src/test/mir-opt/remove_fake_borrows.rs +++ b/src/test/mir-opt/remove_fake_borrows.rs @@ -17,7 +17,7 @@ fn main() { // END RUST SOURCE -// START rustc.match_guard.CleanFakeReadsAndBorrows.before.mir +// START rustc.match_guard.CleanupNonCodegenStatements.before.mir // bb0: { // FakeRead(ForMatchedPlace, _1); // _3 = discriminant(_1); @@ -66,9 +66,9 @@ fn main() { // bb10: { // resume; // } -// END rustc.match_guard.CleanFakeReadsAndBorrows.before.mir +// END rustc.match_guard.CleanupNonCodegenStatements.before.mir -// START rustc.match_guard.CleanFakeReadsAndBorrows.after.mir +// START rustc.match_guard.CleanupNonCodegenStatements.after.mir // bb0: { // nop; // _3 = discriminant(_1); @@ -116,5 +116,5 @@ fn main() { // } // bb10: { // resume; -// } -// END rustc.match_guard.CleanFakeReadsAndBorrows.after.mir +// } +// END rustc.match_guard.CleanupNonCodegenStatements.after.mir -- 2.44.0