1
Fork 0

Killing UserAssertTy in CleanupPostBorrowck pass.

This commit is contained in:
David Wood 2018-02-23 20:54:18 +00:00
parent 17b285d203
commit 1331cd4a8c
No known key found for this signature in database
GPG key ID: 01760B4F9F53F154
2 changed files with 46 additions and 17 deletions

View file

@ -8,16 +8,27 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
//! This module provides one pass, `CleanEndRegions`, that reduces the //! This module provides two passes:
//! set of `EndRegion` statements in the MIR.
//! //!
//! The "pass" is actually implemented as two traversals (aka visits) //! - `CleanEndRegions`, that reduces the set of `EndRegion` statements
//! of the input MIR. The first traversal, `GatherBorrowedRegions`, //! in the MIR.
//! finds all of the regions in the MIR that are involved in a borrow. //! - `CleanUserAssertTy`, that replaces all `UserAssertTy` statements
//! with `Nop`.
//!
//! The `CleanEndRegions` "pass" is actually implemented as two
//! traversals (aka visits) of the input MIR. The first traversal,
//! `GatherBorrowedRegions`, finds all of the regions in the MIR
//! that are involved in a borrow.
//! //!
//! The second traversal, `DeleteTrivialEndRegions`, walks over the //! The second traversal, `DeleteTrivialEndRegions`, walks over the
//! MIR and removes any `EndRegion` that is applied to a region that //! MIR and removes any `EndRegion` that is applied to a region that
//! was not seen in the previous pass. //! was not seen in the previous pass.
//!
//! The `CleanUserAssertTy` pass runs at a distinct time from the
//! `CleanEndRegions` pass. It is important that the `CleanUserAssertTy`
//! pass runs after the MIR borrowck so that the NLL type checker can
//! perform the type assertion when it encounters the `UserAssertTy`
//! statements.
use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
@ -27,7 +38,7 @@ use rustc::mir::visit::{MutVisitor, Visitor, TyContext};
use rustc::ty::{Ty, RegionKind, TyCtxt}; use rustc::ty::{Ty, RegionKind, TyCtxt};
use transform::{MirPass, MirSource}; use transform::{MirPass, MirSource};
pub struct CleanEndRegions; pub struct CleanupPostBorrowck;
struct GatherBorrowedRegions { struct GatherBorrowedRegions {
seen_regions: FxHashSet<region::Scope>, seen_regions: FxHashSet<region::Scope>,
@ -37,19 +48,24 @@ struct DeleteTrivialEndRegions<'a> {
seen_regions: &'a FxHashSet<region::Scope>, seen_regions: &'a FxHashSet<region::Scope>,
} }
impl MirPass for CleanEndRegions { pub struct DeleteUserAssertTy;
impl MirPass for CleanupPostBorrowck {
fn run_pass<'a, 'tcx>(&self, fn run_pass<'a, 'tcx>(&self,
tcx: TyCtxt<'a, 'tcx, 'tcx>, tcx: TyCtxt<'a, 'tcx, 'tcx>,
_source: MirSource, _source: MirSource,
mir: &mut Mir<'tcx>) { mir: &mut Mir<'tcx>) {
if !tcx.emit_end_regions() { return; } if tcx.emit_end_regions() {
let mut gather = GatherBorrowedRegions {
seen_regions: FxHashSet()
};
gather.visit_mir(mir);
let mut gather = GatherBorrowedRegions { let mut delete = DeleteTrivialEndRegions { seen_regions: &mut gather.seen_regions };
seen_regions: FxHashSet() delete.visit_mir(mir);
}; }
gather.visit_mir(mir);
let mut delete = DeleteTrivialEndRegions { seen_regions: &mut gather.seen_regions }; let mut delete = DeleteUserAssertTy;
delete.visit_mir(mir); delete.visit_mir(mir);
} }
} }
@ -93,7 +109,19 @@ impl<'a, 'tcx> MutVisitor<'tcx> for DeleteTrivialEndRegions<'a> {
} }
if delete_it { if delete_it {
statement.kind = StatementKind::Nop; statement.make_nop();
}
self.super_statement(block, statement, location);
}
}
impl<'tcx> MutVisitor<'tcx> for DeleteUserAssertTy {
fn visit_statement(&mut self,
block: BasicBlock,
statement: &mut Statement<'tcx>,
location: Location) {
if let StatementKind::UserAssertTy(..) = statement.kind {
statement.make_nop();
} }
self.super_statement(block, statement, location); self.super_statement(block, statement, location);
} }

View file

@ -25,7 +25,7 @@ use syntax_pos::Span;
pub mod add_validation; pub mod add_validation;
pub mod add_moves_for_packed_drops; pub mod add_moves_for_packed_drops;
pub mod clean_end_regions; pub mod cleanup_post_borrowck;
pub mod check_unsafety; pub mod check_unsafety;
pub mod simplify_branches; pub mod simplify_branches;
pub mod simplify; pub mod simplify;
@ -192,8 +192,9 @@ fn mir_const<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx Stea
let mut mir = tcx.mir_built(def_id).steal(); let mut mir = tcx.mir_built(def_id).steal();
run_passes![tcx, mir, def_id, 0; run_passes![tcx, mir, def_id, 0;
// Remove all `EndRegion` statements that are not involved in borrows. // Remove all `UserAssertTy` statements and all `EndRegion` statements that are not
clean_end_regions::CleanEndRegions, // involved in borrows.
cleanup_post_borrowck::CleanupPostBorrowck,
// What we need to do constant evaluation. // What we need to do constant evaluation.
simplify::SimplifyCfg::new("initial"), simplify::SimplifyCfg::new("initial"),