diff options
| author | bors <bors@rust-lang.org> | 2018-01-22 23:32:16 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-01-22 23:32:16 +0000 |
| commit | 47a8eb7c4e24b61a8a9ab4eaff60ef65291aaa56 (patch) | |
| tree | 01a2b05ca93b192f40ba062200494ee237ddf7ef /src | |
| parent | ae920dcc98c9b18b38aac03367f7f1cd6dce7d2d (diff) | |
| parent | 45bd091e76db5a743a2f251612408e77a2610099 (diff) | |
| download | rust-47a8eb7c4e24b61a8a9ab4eaff60ef65291aaa56.tar.gz rust-47a8eb7c4e24b61a8a9ab4eaff60ef65291aaa56.zip | |
Auto merge of #47373 - wesleywiser:incr_cache_hashing, r=michaelwoerister
[Incremental] Cache hashes for AdDef and ty::Slice<T> r? @michaelwoerister
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/ich/impls_ty.rs | 25 | ||||
| -rw-r--r-- | src/librustc/ty/mod.rs | 39 |
2 files changed, 51 insertions, 13 deletions
diff --git a/src/librustc/ich/impls_ty.rs b/src/librustc/ich/impls_ty.rs index ea3a1074aa2..4ae114c4e69 100644 --- a/src/librustc/ich/impls_ty.rs +++ b/src/librustc/ich/impls_ty.rs @@ -11,9 +11,11 @@ //! This module contains `HashStable` implementations for various data types //! from rustc::ty in no particular order. -use ich::{StableHashingContext, NodeIdHashingMode}; +use ich::{Fingerprint, StableHashingContext, NodeIdHashingMode}; +use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stable_hasher::{HashStable, ToStableHashKey, StableHasher, StableHasherResult}; +use std::cell::RefCell; use std::hash as std_hash; use std::mem; use middle::region; @@ -26,7 +28,26 @@ for &'gcx ty::Slice<T> fn hash_stable<W: StableHasherResult>(&self, hcx: &mut StableHashingContext<'gcx>, hasher: &mut StableHasher<W>) { - (&self[..]).hash_stable(hcx, hasher); + thread_local! { + static CACHE: RefCell<FxHashMap<(usize, usize), Fingerprint>> = + RefCell::new(FxHashMap()); + } + + let hash = CACHE.with(|cache| { + let key = (self.as_ptr() as usize, self.len()); + if let Some(&hash) = cache.borrow().get(&key) { + return hash; + } + + let mut hasher = StableHasher::new(); + (&self[..]).hash_stable(hcx, &mut hasher); + + let hash: Fingerprint = hasher.finish(); + cache.borrow_mut().insert(key, hash); + hash + }); + + hash.hash_stable(hcx, hasher); } } diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index deaea70f760..12343207476 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -20,6 +20,7 @@ use hir::def::{Def, CtorKind, ExportMap}; use hir::def_id::{CrateNum, DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use hir::map::DefPathData; use hir::svh::Svh; +use ich::Fingerprint; use ich::StableHashingContext; use middle::const_val::ConstVal; use middle::lang_items::{FnTraitLangItem, FnMutTraitLangItem, FnOnceTraitLangItem}; @@ -37,6 +38,7 @@ use util::common::ErrorReported; use util::nodemap::{NodeSet, DefIdMap, FxHashMap, FxHashSet}; use serialize::{self, Encodable, Encoder}; +use std::cell::RefCell; use std::collections::BTreeMap; use std::cmp; use std::fmt; @@ -1476,17 +1478,32 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for AdtDef { fn hash_stable<W: StableHasherResult>(&self, hcx: &mut StableHashingContext<'gcx>, hasher: &mut StableHasher<W>) { - let ty::AdtDef { - did, - ref variants, - ref flags, - ref repr, - } = *self; - - did.hash_stable(hcx, hasher); - variants.hash_stable(hcx, hasher); - flags.hash_stable(hcx, hasher); - repr.hash_stable(hcx, hasher); + thread_local! { + static CACHE: RefCell<FxHashMap<usize, Fingerprint>> = + RefCell::new(FxHashMap()); + } + + let hash: Fingerprint = CACHE.with(|cache| { + let addr = self as *const AdtDef as usize; + *cache.borrow_mut().entry(addr).or_insert_with(|| { + let ty::AdtDef { + did, + ref variants, + ref flags, + ref repr, + } = *self; + + let mut hasher = StableHasher::new(); + did.hash_stable(hcx, &mut hasher); + variants.hash_stable(hcx, &mut hasher); + flags.hash_stable(hcx, &mut hasher); + repr.hash_stable(hcx, &mut hasher); + + hasher.finish() + }) + }); + + hash.hash_stable(hcx, hasher); } } |
