1
Fork 0

Auto merge of #70449 - ecstatic-morse:visit-body, r=oli-obk

Make `Visitor::visit_body` take a plain `&Body`

`ReadOnlyBodyAndCache` has replaced `&Body` in many parts of the code base that don't care about basic block predecessors. This includes the MIR `Visitor` trait, which I suspect resulted in many unnecessary changes in #64736. This reverts part of that PR to reduce the number of places where we need to pass a `ReadOnlyBodyAndCache`.

In the long term, we should either give `ReadOnlyBodyAndCache` more ergonomic name and replace all uses of `&mir::Body` with it at the cost of carrying an extra pointer everywhere, or use it only in places that actually need access to the predecessor cache. Perhaps there is an even nicer alternative.

r? @Nashenas88
This commit is contained in:
bors 2020-03-30 02:04:00 +00:00
commit 0afdf43dc1
21 changed files with 33 additions and 34 deletions

View file

@ -65,12 +65,12 @@ use rustc_span::Span;
// variant argument) that does not require visiting, as in // variant argument) that does not require visiting, as in
// `is_cleanup` above. // `is_cleanup` above.
macro_rules! body_cache_type { macro_rules! body_type {
(mut $a:lifetime, $tcx:lifetime) => { (mut $tcx:lifetime) => {
&mut BodyAndCache<$tcx> &mut BodyAndCache<$tcx>
}; };
($a:lifetime, $tcx:lifetime) => { ($tcx:lifetime) => {
ReadOnlyBodyAndCache<$a, $tcx> &Body<$tcx>
}; };
} }
@ -82,7 +82,7 @@ macro_rules! make_mir_visitor {
fn visit_body( fn visit_body(
&mut self, &mut self,
body: body_cache_type!($($mutability)? '_, 'tcx) body: body_type!($($mutability)? 'tcx)
) { ) {
self.super_body(body); self.super_body(body);
} }
@ -254,7 +254,7 @@ macro_rules! make_mir_visitor {
fn super_body( fn super_body(
&mut self, &mut self,
$($mutability)? body: body_cache_type!($($mutability)? '_, 'tcx) $($mutability)? body: body_type!($($mutability)? 'tcx)
) { ) {
let span = body.span; let span = body.span;
if let Some(yield_ty) = &$($mutability)? body.yield_ty { if let Some(yield_ty) = &$($mutability)? body.yield_ty {
@ -819,7 +819,7 @@ macro_rules! make_mir_visitor {
fn visit_location( fn visit_location(
&mut self, &mut self,
body: body_cache_type!($($mutability)? '_, 'tcx), body: body_type!($($mutability)? 'tcx),
location: Location location: Location
) { ) {
let basic_block = & $($mutability)? body[location.block]; let basic_block = & $($mutability)? body[location.block];

View file

@ -20,7 +20,7 @@ pub fn non_ssa_locals<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
let mir = fx.mir; let mir = fx.mir;
let mut analyzer = LocalAnalyzer::new(fx); let mut analyzer = LocalAnalyzer::new(fx);
analyzer.visit_body(mir); analyzer.visit_body(&mir);
for (local, decl) in mir.local_decls.iter_enumerated() { for (local, decl) in mir.local_decls.iter_enumerated() {
let ty = fx.monomorphize(&decl.ty); let ty = fx.monomorphize(&decl.ty);

View file

@ -107,7 +107,7 @@ impl LocalsStateAtExit {
LocalsStateAtExit::AllAreInvalidated LocalsStateAtExit::AllAreInvalidated
} else { } else {
let mut has_storage_dead = HasStorageDead(BitSet::new_empty(body.local_decls.len())); let mut has_storage_dead = HasStorageDead(BitSet::new_empty(body.local_decls.len()));
has_storage_dead.visit_body(body); has_storage_dead.visit_body(&body);
let mut has_storage_dead_or_moved = has_storage_dead.0; let mut has_storage_dead_or_moved = has_storage_dead.0;
for move_out in &move_data.moves { for move_out in &move_data.moves {
if let Some(index) = move_data.base_local(move_out.path) { if let Some(index) = move_data.base_local(move_out.path) {

View file

@ -1559,7 +1559,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
} }
} }
let mut visitor = FakeReadCauseFinder { place, cause: None }; let mut visitor = FakeReadCauseFinder { place, cause: None };
visitor.visit_body(self.body); visitor.visit_body(&self.body);
match visitor.cause { match visitor.cause {
Some(FakeReadCause::ForMatchGuard) => Some("match guard"), Some(FakeReadCause::ForMatchGuard) => Some("match guard"),
Some(FakeReadCause::ForIndex) => Some("indexing expression"), Some(FakeReadCause::ForIndex) => Some("indexing expression"),

View file

@ -37,7 +37,7 @@ pub(super) fn generate_invalidates<'tcx>(
body: &body, body: &body,
dominators, dominators,
}; };
ig.visit_body(body); ig.visit_body(&body);
} }
} }

View file

@ -299,8 +299,8 @@ fn do_mir_borrowck<'a, 'tcx>(
} }
dataflow::visit_results( dataflow::visit_results(
&*body, &body,
traversal::reverse_postorder(&*body).map(|(bb, _)| bb), traversal::reverse_postorder(&body).map(|(bb, _)| bb),
&results, &results,
&mut mbcx, &mut mbcx,
); );

View file

@ -81,7 +81,7 @@ impl LocalUseMap {
live_locals.iter().for_each(|&local| locals_with_use_data[local] = true); live_locals.iter().for_each(|&local| locals_with_use_data[local] = true);
LocalUseMapBuild { local_use_map: &mut local_use_map, elements, locals_with_use_data } LocalUseMapBuild { local_use_map: &mut local_use_map, elements, locals_with_use_data }
.visit_body(body); .visit_body(&body);
local_use_map local_use_map
} }

View file

@ -101,7 +101,7 @@ pub(super) fn populate_access_facts(
location_table, location_table,
move_data, move_data,
}; };
extractor.visit_body(body); extractor.visit_body(&body);
facts.var_dropped_at.extend( facts.var_dropped_at.extend(
dropped_at.iter().map(|&(local, location)| (local, location_table.mid_index(location))), dropped_at.iter().map(|&(local, location)| (local, location_table.mid_index(location))),

View file

@ -210,7 +210,7 @@ fn type_check_internal<'a, 'tcx, R>(
); );
let errors_reported = { let errors_reported = {
let mut verifier = TypeVerifier::new(&mut checker, *body, promoted); let mut verifier = TypeVerifier::new(&mut checker, *body, promoted);
verifier.visit_body(body); verifier.visit_body(&body);
verifier.errors_reported verifier.errors_reported
}; };
@ -435,7 +435,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> {
} }
} }
fn visit_body(&mut self, body: ReadOnlyBodyAndCache<'_, 'tcx>) { fn visit_body(&mut self, body: &Body<'tcx>) {
self.sanitize_type(&"return type", body.return_ty()); self.sanitize_type(&"return type", body.return_ty());
for local_decl in &body.local_decls { for local_decl in &body.local_decls {
self.sanitize_type(local_decl, local_decl.ty); self.sanitize_type(local_decl, local_decl.ty);
@ -563,7 +563,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
swap_constraints(self); swap_constraints(self);
self.visit_body(promoted_body); self.visit_body(&promoted_body);
if !self.errors_reported { if !self.errors_reported {
// if verifier failed, don't do further checks to avoid ICEs // if verifier failed, don't do further checks to avoid ICEs

View file

@ -32,7 +32,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
never_initialized_mut_locals: &mut never_initialized_mut_locals, never_initialized_mut_locals: &mut never_initialized_mut_locals,
mbcx: self, mbcx: self,
}; };
visitor.visit_body(visitor.mbcx.body); visitor.visit_body(&visitor.mbcx.body);
} }
// Take the union of the existed `used_mut` set with those variables we've found were // Take the union of the existed `used_mut` set with those variables we've found were

View file

@ -307,7 +307,7 @@ pub fn const_eval_raw_provider<'tcx>(
); );
let res = ecx.load_mir(cid.instance.def, cid.promoted); let res = ecx.load_mir(cid.instance.def, cid.promoted);
res.and_then(|body| eval_body_using_ecx(&mut ecx, cid, *body)) res.and_then(|body| eval_body_using_ecx(&mut ecx, cid, &body))
.and_then(|place| { .and_then(|place| {
Ok(RawConst { alloc_id: place.ptr.assert_ptr().alloc_id, ty: place.layout.ty }) Ok(RawConst { alloc_id: place.ptr.assert_ptr().alloc_id, ty: place.layout.ty })
}) })

View file

@ -83,7 +83,7 @@ impl<'mir, 'tcx> MaybeRequiresStorage<'mir, 'tcx> {
) -> Self { ) -> Self {
MaybeRequiresStorage { MaybeRequiresStorage {
body, body,
borrowed_locals: RefCell::new(ResultsRefCursor::new(*body, borrowed_locals)), borrowed_locals: RefCell::new(ResultsRefCursor::new(&body, borrowed_locals)),
} }
} }
} }
@ -250,7 +250,7 @@ impl<'mir, 'tcx> MaybeRequiresStorage<'mir, 'tcx> {
/// Kill locals that are fully moved and have not been borrowed. /// Kill locals that are fully moved and have not been borrowed.
fn check_for_move(&self, trans: &mut impl GenKill<Local>, loc: Location) { fn check_for_move(&self, trans: &mut impl GenKill<Local>, loc: Location) {
let mut visitor = MoveVisitor { trans, borrowed_locals: &self.borrowed_locals }; let mut visitor = MoveVisitor { trans, borrowed_locals: &self.borrowed_locals };
visitor.visit_location(self.body, loc); visitor.visit_location(&self.body, loc);
} }
} }

View file

@ -1162,7 +1162,7 @@ fn collect_neighbours<'tcx>(
debug!("collect_neighbours: {:?}", instance.def_id()); debug!("collect_neighbours: {:?}", instance.def_id());
let body = tcx.instance_mir(instance.def); let body = tcx.instance_mir(instance.def);
MirNeighborCollector { tcx, body: &body, output, instance }.visit_body(body); MirNeighborCollector { tcx, body: &body, output, instance }.visit_body(&body);
} }
fn def_id_to_string(tcx: TyCtxt<'_>, def_id: DefId) -> String { fn def_id_to_string(tcx: TyCtxt<'_>, def_id: DefId) -> String {

View file

@ -183,7 +183,7 @@ impl Validator<'a, 'mir, 'tcx> {
self.check_op_spanned(ops::Loop, body.span); self.check_op_spanned(ops::Loop, body.span);
} }
self.visit_body(body); self.visit_body(&body);
// Ensure that the end result is `Sync` in a non-thread local `static`. // Ensure that the end result is `Sync` in a non-thread local `static`.
let should_check_for_sync = let should_check_for_sync =

View file

@ -507,7 +507,7 @@ fn unsafety_check_result(tcx: TyCtxt<'_>, def_id: DefId) -> UnsafetyCheckResult
// mir_built ensures that body has a computed cache, so we don't (and can't) attempt to // mir_built ensures that body has a computed cache, so we don't (and can't) attempt to
// recompute it here. // recompute it here.
let body = body.unwrap_read_only(); let body = body.unwrap_read_only();
checker.visit_body(body); checker.visit_body(&body);
check_unused_unsafe(tcx, def_id, &checker.used_unsafe, &mut checker.inherited_blocks); check_unused_unsafe(tcx, def_id, &checker.used_unsafe, &mut checker.inherited_blocks);
UnsafetyCheckResult { UnsafetyCheckResult {

View file

@ -778,7 +778,7 @@ impl CanConstProp {
trace!("local {:?} can't be const propagated because it's not a temporary", local); trace!("local {:?} can't be const propagated because it's not a temporary", local);
} }
} }
cpv.visit_body(body); cpv.visit_body(&body);
cpv.can_const_prop cpv.can_const_prop
} }
} }

View file

@ -469,7 +469,7 @@ fn locals_live_across_suspend_points(
// Find the MIR locals which do not use StorageLive/StorageDead statements. // Find the MIR locals which do not use StorageLive/StorageDead statements.
// The storage of these locals are always live. // The storage of these locals are always live.
let mut ignored = StorageIgnored(BitSet::new_filled(body.local_decls.len())); let mut ignored = StorageIgnored(BitSet::new_filled(body.local_decls.len()));
ignored.visit_body(body); ignored.visit_body(&body);
// Calculate the MIR locals which have been previously // Calculate the MIR locals which have been previously
// borrowed (even if they are still active). // borrowed (even if they are still active).

View file

@ -26,7 +26,7 @@ impl<'tcx> MirPass<'tcx> for InstCombine {
let optimizations = { let optimizations = {
let read_only_cache = read_only!(body); let read_only_cache = read_only!(body);
let mut optimization_finder = OptimizationFinder::new(body, tcx); let mut optimization_finder = OptimizationFinder::new(body, tcx);
optimization_finder.visit_body(read_only_cache); optimization_finder.visit_body(&read_only_cache);
optimization_finder.optimizations optimization_finder.optimizations
}; };

View file

@ -309,7 +309,7 @@ impl<'tcx> MirPass<'tcx> for SimplifyLocals {
let locals = { let locals = {
let read_only_cache = read_only!(body); let read_only_cache = read_only!(body);
let mut marker = DeclMarker { locals: BitSet::new_empty(body.local_decls.len()), body }; let mut marker = DeclMarker { locals: BitSet::new_empty(body.local_decls.len()), body };
marker.visit_body(read_only_cache); marker.visit_body(&read_only_cache);
// Return pointer and arguments are always live // Return pointer and arguments are always live
marker.locals.insert(RETURN_PLACE); marker.locals.insert(RETURN_PLACE);
for arg in body.args_iter() { for arg in body.args_iter() {

View file

@ -1,7 +1,6 @@
use rustc::mir::visit::PlaceContext; use rustc::mir::visit::PlaceContext;
use rustc::mir::visit::Visitor; use rustc::mir::visit::Visitor;
use rustc::mir::ReadOnlyBodyAndCache; use rustc::mir::{Body, Local, Location};
use rustc::mir::{Local, Location};
crate trait FindAssignments { crate trait FindAssignments {
// Finds all statements that assign directly to local (i.e., X = ...) // Finds all statements that assign directly to local (i.e., X = ...)
@ -9,10 +8,10 @@ crate trait FindAssignments {
fn find_assignments(&self, local: Local) -> Vec<Location>; fn find_assignments(&self, local: Local) -> Vec<Location>;
} }
impl<'a, 'tcx> FindAssignments for ReadOnlyBodyAndCache<'a, 'tcx> { impl<'tcx> FindAssignments for Body<'tcx> {
fn find_assignments(&self, local: Local) -> Vec<Location> { fn find_assignments(&self, local: Local) -> Vec<Location> {
let mut visitor = FindLocalAssignmentVisitor { needle: local, locations: vec![] }; let mut visitor = FindLocalAssignmentVisitor { needle: local, locations: vec![] };
visitor.visit_body(*self); visitor.visit_body(self);
visitor.locations visitor.locations
} }
} }

View file

@ -38,7 +38,7 @@ impl DefUseAnalysis {
var_debug_info_index: 0, var_debug_info_index: 0,
in_var_debug_info: false, in_var_debug_info: false,
}; };
finder.visit_body(body); finder.visit_body(&body);
self.info = finder.info self.info = finder.info
} }