Auto merge of #106977 - michaelwoerister:unord_id_collections, r=oli-obk
Use UnordMap and UnordSet for id collections (DefIdMap, LocalDefIdMap, etc) This PR changes the `rustc_data_structures::define_id_collections!` macro to use `UnordMap` and `UnordSet` instead of `FxHashMap` and `FxHashSet`. This should account for a large portion of hash-maps being used in places where they can cause trouble. The changes required are moderate but non-zero: - In some places the collections are extracted into sorted vecs. - There are a few instances where for-loops have been changed to extends. ~~Let's see what the performance impact is. With a bit more refactoring, we might be able to get rid of some of the additional sorting -- but the change set is already big enough. Unless there's a performance impact, I'd like to do further changes in subsequent PRs.~~ Performance does not seem to be negatively affected ([perf-run here](https://github.com/rust-lang/rust/pull/106977#issuecomment-1396776699)). Part of [MCP 533](https://github.com/rust-lang/compiler-team/issues/533). r? `@ghost`
This commit is contained in:
commit
005fc0f00f
18 changed files with 393 additions and 118 deletions
|
@ -391,7 +391,7 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
|
|||
// keys from the former.
|
||||
// This is a rudimentary check that does not catch all cases,
|
||||
// just the easiest.
|
||||
let mut fallback_map: DefIdMap<DefId> = Default::default();
|
||||
let mut fallback_map: Vec<(DefId, DefId)> = Default::default();
|
||||
|
||||
// Issue 46112: We want the map to prefer the shortest
|
||||
// paths when reporting the path to an item. Therefore we
|
||||
|
@ -421,12 +421,12 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
|
|||
|
||||
if let Some(def_id) = child.res.opt_def_id() {
|
||||
if child.ident.name == kw::Underscore {
|
||||
fallback_map.insert(def_id, parent);
|
||||
fallback_map.push((def_id, parent));
|
||||
return;
|
||||
}
|
||||
|
||||
if ty::util::is_doc_hidden(tcx, parent) {
|
||||
fallback_map.insert(def_id, parent);
|
||||
fallback_map.push((def_id, parent));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -460,6 +460,7 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
|
|||
// Fill in any missing entries with the less preferable path.
|
||||
// If this path re-exports the child as `_`, we still use this
|
||||
// path in a diagnostic that suggests importing `::*`.
|
||||
|
||||
for (child, parent) in fallback_map {
|
||||
visible_parent_map.entry(child).or_insert(parent);
|
||||
}
|
||||
|
|
|
@ -1187,8 +1187,11 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
record!(self.tables.trait_impl_trait_tys[def_id] <- table);
|
||||
}
|
||||
}
|
||||
let inherent_impls = tcx.crate_inherent_impls(());
|
||||
for (def_id, implementations) in inherent_impls.inherent_impls.iter() {
|
||||
let inherent_impls = tcx.with_stable_hashing_context(|hcx| {
|
||||
tcx.crate_inherent_impls(()).inherent_impls.to_sorted(&hcx, true)
|
||||
});
|
||||
|
||||
for (def_id, implementations) in inherent_impls {
|
||||
if implementations.is_empty() {
|
||||
continue;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue