Skip to content

Commit

Permalink
Remove metadata decoding DefPathHash cache
Browse files Browse the repository at this point in the history
This cache is largely useless. Decoding a DefPathHash from metadata is
essentially a pair of memory loads - there's no heavyweight processing
involved. Caching it behind a HashMap just adds extra cost and incurs
hashing overheads.
  • Loading branch information
Mark-Simulacrum committed Dec 23, 2023
1 parent 6630d69 commit f098f34
Showing 1 changed file with 8 additions and 22 deletions.
30 changes: 8 additions & 22 deletions compiler/rustc_metadata/src/rmeta/decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,6 @@ pub(crate) struct CrateMetadata {
alloc_decoding_state: AllocDecodingState,
/// Caches decoded `DefKey`s.
def_key_cache: Lock<FxHashMap<DefIndex, DefKey>>,
/// Caches decoded `DefPathHash`es.
def_path_hash_cache: Lock<FxHashMap<DefIndex, DefPathHash>>,

// --- Other significant crate properties ---
/// ID of this crate, from the current compilation session's point of view.
Expand Down Expand Up @@ -1485,27 +1483,16 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
DefPath::make(self.cnum, id, |parent| self.def_key(parent))
}

fn def_path_hash_unlocked(
self,
index: DefIndex,
def_path_hashes: &mut FxHashMap<DefIndex, DefPathHash>,
) -> DefPathHash {
*def_path_hashes.entry(index).or_insert_with(|| {
// This is a hack to workaround the fact that we can't easily encode/decode a Hash64
// into the FixedSizeEncoding, as Hash64 lacks a Default impl. A future refactor to
// relax the Default restriction will likely fix this.
let fingerprint = Fingerprint::new(
self.root.stable_crate_id.as_u64(),
self.root.tables.def_path_hashes.get(self, index),
);
DefPathHash::new(self.root.stable_crate_id, fingerprint.split().1)
})
}

#[inline]
fn def_path_hash(self, index: DefIndex) -> DefPathHash {
let mut def_path_hashes = self.def_path_hash_cache.lock();
self.def_path_hash_unlocked(index, &mut def_path_hashes)
// This is a hack to workaround the fact that we can't easily encode/decode a Hash64
// into the FixedSizeEncoding, as Hash64 lacks a Default impl. A future refactor to
// relax the Default restriction will likely fix this.
let fingerprint = Fingerprint::new(
self.root.stable_crate_id.as_u64(),
self.root.tables.def_path_hashes.get(self, index),
);
DefPathHash::new(self.root.stable_crate_id, fingerprint.split().1)
}

#[inline]
Expand Down Expand Up @@ -1832,7 +1819,6 @@ impl CrateMetadata {
extern_crate: Lock::new(None),
hygiene_context: Default::default(),
def_key_cache: Default::default(),
def_path_hash_cache: Default::default(),
};

// Need `CrateMetadataRef` to decode `DefId`s in simplified types.
Expand Down

0 comments on commit f098f34

Please sign in to comment.