about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMatthew Jasper <mjjasper1@gmail.com>2019-01-19 19:13:34 +0000
committerMatthew Jasper <mjjasper1@gmail.com>2019-02-21 19:03:34 +0000
commit9c601611a02bd2026065a50ba640697488f064b6 (patch)
tree2c478e2f7e92342f015e2c871f1f2e6471d07a87 /src
parentbf446c80c2792c7ec234ecf4107d75c80826a5f5 (diff)
downloadrust-9c601611a02bd2026065a50ba640697488f064b6.tar.gz
rust-9c601611a02bd2026065a50ba640697488f064b6.zip
Simplify the cleanup_post_borrowck passes
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/transform/cleanup_post_borrowck.rs97
-rw-r--r--src/librustc_mir/transform/mod.rs8
-rw-r--r--src/test/mir-opt/remove_fake_borrows.rs10
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<Local>,
-}
-
-pub struct DeleteFakeBorrows {
-    fake_borrow_temporaries: FxHashSet<Local>,
-}
-
-// 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