diff --git a/src/librustc/mir/cache.rs b/src/librustc/mir/cache.rs index 9b4136674187..52848cc435a6 100644 --- a/src/librustc/mir/cache.rs +++ b/src/librustc/mir/cache.rs @@ -1,5 +1,4 @@ use rustc_index::vec::IndexVec; -use rustc_data_structures::sync::{RwLock, MappedReadGuard, ReadGuard}; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_serialize::{Encodable, Encoder, Decodable, Decoder}; use crate::ich::StableHashingContext; @@ -7,7 +6,7 @@ use crate::mir::{Body, BasicBlock}; #[derive(Clone, Debug)] pub struct Cache { - predecessors: RwLock>>> + predecessors: Option>> } @@ -32,24 +31,29 @@ impl<'a> HashStable> for Cache { impl Cache { pub fn new() -> Self { Cache { - predecessors: RwLock::new(None) + predecessors: None } } - pub fn invalidate(&self) { + pub fn invalidate(&mut self) { // FIXME: consider being more fine-grained - *self.predecessors.borrow_mut() = None; + self.predecessors = None; } - pub fn predecessors( - &self, + pub fn predecessors_ref(&self) -> &IndexVec> { + assert!(self.predecessors.is_some()); + self.predecessors.as_ref().unwrap() + } + + pub fn predecessors_mut( + &mut self, body: &Body<'_> - ) -> MappedReadGuard<'_, IndexVec>> { - if self.predecessors.borrow().is_none() { - *self.predecessors.borrow_mut() = Some(calculate_predecessors(body)); + ) -> &mut IndexVec> { + if self.predecessors.is_none() { + self.predecessors = Some(calculate_predecessors(body)); } - ReadGuard::map(self.predecessors.borrow(), |p| p.as_ref().unwrap()) + self.predecessors.as_mut().unwrap() } } diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index 300b0363e2d3..396953aa4120 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -25,7 +25,6 @@ use rustc_data_structures::graph::dominators::{dominators, Dominators}; use rustc_data_structures::graph::{self, GraphPredecessors, GraphSuccessors}; use rustc_index::vec::{Idx, IndexVec}; use rustc_data_structures::sync::Lrc; -use rustc_data_structures::sync::MappedReadGuard; use rustc_macros::HashStable; use rustc_serialize::{Encodable, Decodable}; use smallvec::SmallVec; @@ -218,13 +217,19 @@ impl<'tcx> Body<'tcx> { } #[inline] - pub fn predecessors(&self) -> MappedReadGuard<'_, IndexVec>> { - self.cache.predecessors(self) + pub fn predecessors_ref(&self) -> &IndexVec> { + self.cache.predecessors_ref() } #[inline] - pub fn predecessors_for(&self, bb: BasicBlock) -> MappedReadGuard<'_, Vec> { - MappedReadGuard::map(self.predecessors(), |p| &p[bb]) + pub fn predecessors_mut(&mut self) -> &mut IndexVec> { + // TODO(nashenas88) figure out a way to get rid of this clone + self.cache.predecessors_mut(&self.clone()) + } + + #[inline] + pub fn predecessors_for(&self, bb: BasicBlock) -> &Vec { + &self.predecessors_ref()[bb] } #[inline] diff --git a/src/librustc_mir/transform/add_call_guards.rs b/src/librustc_mir/transform/add_call_guards.rs index bf3df1ae2fd8..bc54f48e578e 100644 --- a/src/librustc_mir/transform/add_call_guards.rs +++ b/src/librustc_mir/transform/add_call_guards.rs @@ -39,7 +39,7 @@ impl<'tcx> MirPass<'tcx> for AddCallGuards { impl AddCallGuards { pub fn add_call_guards(&self, body: &mut Body<'_>) { let pred_count: IndexVec<_, _> = - body.predecessors().iter().map(|ps| ps.len()).collect(); + body.predecessors_mut().iter().map(|ps| ps.len()).collect(); // We need a place to store the new blocks generated let mut new_blocks = Vec::new(); diff --git a/src/librustc_mir/util/liveness.rs b/src/librustc_mir/util/liveness.rs index 63e4af0a56a7..4b67abca0f06 100644 --- a/src/librustc_mir/util/liveness.rs +++ b/src/librustc_mir/util/liveness.rs @@ -94,7 +94,7 @@ pub fn liveness_of_locals( dirty_queue.insert(bb); } - let predecessors = body.predecessors(); + let predecessors = body.predecessors_ref(); while let Some(bb) = dirty_queue.pop() { // bits = use ∪ (bits - def)