@@ -4,6 +4,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
4
4
use rustc_data_structures:: indexed_vec:: { Idx , IndexVec } ;
5
5
use smallvec:: SmallVec ;
6
6
use rustc_data_structures:: sync:: { Lrc , Lock , AtomicU32 , AtomicU64 , Ordering } ;
7
+ use rustc_data_structures:: sharded:: { self , Sharded } ;
7
8
use std:: sync:: atomic:: Ordering :: { Acquire , SeqCst } ;
8
9
use std:: env;
9
10
use std:: hash:: Hash ;
@@ -395,7 +396,7 @@ impl DepGraph {
395
396
#[ inline]
396
397
pub fn read ( & self , v : DepNode ) {
397
398
if let Some ( ref data) = self . data {
398
- let map = data. current . node_to_node_index . lock ( ) ;
399
+ let map = data. current . node_to_node_index . get_shard_by_value ( & v ) . lock ( ) ;
399
400
if let Some ( dep_node_index) = map. get ( & v) . copied ( ) {
400
401
std:: mem:: drop ( map) ;
401
402
data. read_index ( dep_node_index) ;
@@ -419,6 +420,7 @@ impl DepGraph {
419
420
. unwrap ( )
420
421
. current
421
422
. node_to_node_index
423
+ . get_shard_by_value ( dep_node)
422
424
. lock ( )
423
425
. get ( dep_node)
424
426
. cloned ( )
@@ -428,7 +430,11 @@ impl DepGraph {
428
430
#[ inline]
429
431
pub fn dep_node_exists ( & self , dep_node : & DepNode ) -> bool {
430
432
if let Some ( ref data) = self . data {
431
- data. current . node_to_node_index . lock ( ) . contains_key ( dep_node)
433
+ data. current
434
+ . node_to_node_index
435
+ . get_shard_by_value ( & dep_node)
436
+ . lock ( )
437
+ . contains_key ( dep_node)
432
438
} else {
433
439
false
434
440
}
@@ -609,7 +615,11 @@ impl DepGraph {
609
615
610
616
#[ cfg( not( parallel_compiler) ) ]
611
617
{
612
- debug_assert ! ( !data. current. borrow( ) . node_to_node_index. contains_key( dep_node) ) ;
618
+ debug_assert ! ( !data. current
619
+ . node_to_node_index
620
+ . get_shard_by_value( dep_node)
621
+ . lock( )
622
+ . contains_key( dep_node) ) ;
613
623
debug_assert ! ( data. colors. get( prev_dep_node_index) . is_none( ) ) ;
614
624
}
615
625
@@ -955,7 +965,7 @@ struct DepNodeData {
955
965
956
966
pub ( super ) struct CurrentDepGraph {
957
967
data : Lock < IndexVec < DepNodeIndex , DepNodeData > > ,
958
- node_to_node_index : Lock < FxHashMap < DepNode , DepNodeIndex > > ,
968
+ node_to_node_index : Sharded < FxHashMap < DepNode , DepNodeIndex > > ,
959
969
#[ allow( dead_code) ]
960
970
forbidden_edge : Option < EdgeFilter > ,
961
971
@@ -1008,8 +1018,8 @@ impl CurrentDepGraph {
1008
1018
1009
1019
CurrentDepGraph {
1010
1020
data : Lock :: new ( IndexVec :: with_capacity ( new_node_count_estimate) ) ,
1011
- node_to_node_index : Lock :: new ( FxHashMap :: with_capacity_and_hasher (
1012
- new_node_count_estimate,
1021
+ node_to_node_index : Sharded :: new ( || FxHashMap :: with_capacity_and_hasher (
1022
+ new_node_count_estimate / sharded :: SHARDS ,
1013
1023
Default :: default ( ) ,
1014
1024
) ) ,
1015
1025
anon_id_seed : stable_hasher. finish ( ) ,
@@ -1058,7 +1068,10 @@ impl CurrentDepGraph {
1058
1068
edges : SmallVec < [ DepNodeIndex ; 8 ] > ,
1059
1069
fingerprint : Fingerprint
1060
1070
) -> DepNodeIndex {
1061
- debug_assert ! ( !self . node_to_node_index. lock( ) . contains_key( & dep_node) ) ;
1071
+ debug_assert ! ( !self . node_to_node_index
1072
+ . get_shard_by_value( & dep_node)
1073
+ . lock( )
1074
+ . contains_key( & dep_node) ) ;
1062
1075
self . intern_node ( dep_node, edges, fingerprint)
1063
1076
}
1064
1077
@@ -1068,7 +1081,7 @@ impl CurrentDepGraph {
1068
1081
edges : SmallVec < [ DepNodeIndex ; 8 ] > ,
1069
1082
fingerprint : Fingerprint
1070
1083
) -> DepNodeIndex {
1071
- match self . node_to_node_index . lock ( ) . entry ( dep_node) {
1084
+ match self . node_to_node_index . get_shard_by_value ( & dep_node ) . lock ( ) . entry ( dep_node) {
1072
1085
Entry :: Occupied ( entry) => * entry. get ( ) ,
1073
1086
Entry :: Vacant ( entry) => {
1074
1087
let mut data = self . data . lock ( ) ;
0 commit comments