diff options
| author | Paul Daniel Faria <Nashenas88@users.noreply.github.com> | 2019-09-24 09:09:15 -0400 |
|---|---|---|
| committer | Paul Daniel Faria <Nashenas88@users.noreply.github.com> | 2019-12-02 08:30:29 -0500 |
| commit | c16ef6b21de93de3ebf6cf7bbb3484719427a4e7 (patch) | |
| tree | 3af6e19b85de35dd54cf160cf3070131571684d9 | |
| parent | 4af3ee8ee2a2bc1286b021db7600ba990359cf3f (diff) | |
| download | rust-c16ef6b21de93de3ebf6cf7bbb3484719427a4e7.tar.gz rust-c16ef6b21de93de3ebf6cf7bbb3484719427a4e7.zip | |
Remove interior mutability in mir predecessors cache
| -rw-r--r-- | src/librustc/mir/cache.rs | 26 | ||||
| -rw-r--r-- | src/librustc/mir/mod.rs | 15 | ||||
| -rw-r--r-- | src/librustc_mir/transform/add_call_guards.rs | 2 | ||||
| -rw-r--r-- | src/librustc_mir/util/liveness.rs | 2 |
4 files changed, 27 insertions, 18 deletions
diff --git a/src/librustc/mir/cache.rs b/src/librustc/mir/cache.rs index 9b413667418..52848cc435a 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<Option<IndexVec<BasicBlock, Vec<BasicBlock>>>> + predecessors: Option<IndexVec<BasicBlock, Vec<BasicBlock>>> } @@ -32,24 +31,29 @@ impl<'a> HashStable<StableHashingContext<'a>> 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<BasicBlock, Vec<BasicBlock>> { + assert!(self.predecessors.is_some()); + self.predecessors.as_ref().unwrap() + } + + pub fn predecessors_mut( + &mut self, body: &Body<'_> - ) -> MappedReadGuard<'_, IndexVec<BasicBlock, Vec<BasicBlock>>> { - if self.predecessors.borrow().is_none() { - *self.predecessors.borrow_mut() = Some(calculate_predecessors(body)); + ) -> &mut IndexVec<BasicBlock, Vec<BasicBlock>> { + 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 300b0363e2d..396953aa412 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<BasicBlock, Vec<BasicBlock>>> { - self.cache.predecessors(self) + pub fn predecessors_ref(&self) -> &IndexVec<BasicBlock, Vec<BasicBlock>> { + self.cache.predecessors_ref() } #[inline] - pub fn predecessors_for(&self, bb: BasicBlock) -> MappedReadGuard<'_, Vec<BasicBlock>> { - MappedReadGuard::map(self.predecessors(), |p| &p[bb]) + pub fn predecessors_mut(&mut self) -> &mut IndexVec<BasicBlock, Vec<BasicBlock>> { + // 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<BasicBlock> { + &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 bf3df1ae2fd..bc54f48e578 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 63e4af0a56a..4b67abca0f0 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) |
