| 
1 | 1 | use std::assert_matches::assert_matches;  | 
 | 2 | +use std::collections::hash_map::Entry;  | 
2 | 3 | use std::fmt::Debug;  | 
3 | 4 | use std::hash::Hash;  | 
4 | 5 | use std::marker::PhantomData;  | 
5 | 6 | use std::sync::Arc;  | 
6 | 7 | use std::sync::atomic::Ordering;  | 
7 | 8 | 
 
  | 
8 | 9 | use rustc_data_structures::fingerprint::Fingerprint;  | 
9 |  | -use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap, IndexEntry};  | 
 | 10 | +use rustc_data_structures::fx::{FxHashMap, FxHashSet};  | 
10 | 11 | use rustc_data_structures::profiling::{QueryInvocationId, SelfProfilerRef};  | 
11 | 12 | use rustc_data_structures::sharded::{self, Sharded};  | 
12 | 13 | use rustc_data_structures::stable_hasher::{HashStable, StableHasher};  | 
@@ -1053,7 +1054,7 @@ rustc_index::newtype_index! {  | 
1053 | 1054 | /// first, and `data` second.  | 
1054 | 1055 | pub(super) struct CurrentDepGraph<D: Deps> {  | 
1055 | 1056 |     encoder: GraphEncoder<D>,  | 
1056 |  | -    new_node_to_index: Sharded<FxIndexMap<DepNode, DepNodeIndex>>,  | 
 | 1057 | +    new_node_to_index: Sharded<FxHashMap<DepNode, DepNodeIndex>>,  | 
1057 | 1058 |     prev_index_to_index: Lock<IndexVec<SerializedDepNodeIndex, Option<DepNodeIndex>>>,  | 
1058 | 1059 | 
 
  | 
1059 | 1060 |     /// This is used to verify that fingerprints do not change between the creation of a node  | 
@@ -1123,7 +1124,7 @@ impl<D: Deps> CurrentDepGraph<D> {  | 
1123 | 1124 |                 previous,  | 
1124 | 1125 |             ),  | 
1125 | 1126 |             new_node_to_index: Sharded::new(|| {  | 
1126 |  | -                FxIndexMap::with_capacity_and_hasher(  | 
 | 1127 | +                FxHashMap::with_capacity_and_hasher(  | 
1127 | 1128 |                     new_node_count_estimate / sharded::shards(),  | 
1128 | 1129 |                     Default::default(),  | 
1129 | 1130 |                 )  | 
@@ -1158,8 +1159,8 @@ impl<D: Deps> CurrentDepGraph<D> {  | 
1158 | 1159 |         current_fingerprint: Fingerprint,  | 
1159 | 1160 |     ) -> DepNodeIndex {  | 
1160 | 1161 |         let dep_node_index = match self.new_node_to_index.lock_shard_by_value(&key).entry(key) {  | 
1161 |  | -            IndexEntry::Occupied(entry) => *entry.get(),  | 
1162 |  | -            IndexEntry::Vacant(entry) => {  | 
 | 1162 | +            Entry::Occupied(entry) => *entry.get(),  | 
 | 1163 | +            Entry::Vacant(entry) => {  | 
1163 | 1164 |                 let dep_node_index = self.encoder.send(key, current_fingerprint, edges);  | 
1164 | 1165 |                 entry.insert(dep_node_index);  | 
1165 | 1166 |                 dep_node_index  | 
@@ -1388,6 +1389,8 @@ fn panic_on_forbidden_read<D: Deps>(data: &DepGraphData<D>, dep_node_index: DepN  | 
1388 | 1389 |     if dep_node.is_none() {  | 
1389 | 1390 |         // Try to find it among the new nodes  | 
1390 | 1391 |         for shard in data.current.new_node_to_index.lock_shards() {  | 
 | 1392 | +            // This is OK, as there can be at most one `dep_node` with the given `dep_node_index`  | 
 | 1393 | +            #[allow(rustc::potential_query_instability)]  | 
1391 | 1394 |             if let Some((node, _)) = shard.iter().find(|(_, index)| **index == dep_node_index) {  | 
1392 | 1395 |                 dep_node = Some(*node);  | 
1393 | 1396 |                 break;  | 
 | 
0 commit comments