]> git.lizzy.rs Git - rust.git/commitdiff
Simplify the cleanup_post_borrowck passes
authorMatthew Jasper <mjjasper1@gmail.com>
Sat, 19 Jan 2019 19:13:34 +0000 (19:13 +0000)
committerMatthew Jasper <mjjasper1@gmail.com>
Thu, 21 Feb 2019 19:03:34 +0000 (19:03 +0000)
src/librustc_mir/transform/cleanup_post_borrowck.rs
src/librustc_mir/transform/mod.rs
src/test/mir-opt/remove_fake_borrows.rs

index 890d2c56f42b24933bbe40f5939de808af317e13..349b27523a0a10ecce6fd1a21f8d51c5a5200955 100644 (file)
@@ -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,
 //! 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);
     }
index 28b9e082851c09cf1900ed0f279ead94e106f0a5..48884872a01ed0220ffeb2d2d69ede05749560c8 100644 (file)
@@ -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"),
 
index fab4d28a936cac558c32fc6872829090a27aecae..ebb1ef2f430b595722a74cce3b85b7da4cfc0bec 100644 (file)
@@ -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