@@ -4,6 +4,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
44use rustc_data_structures:: indexed_vec:: { Idx , IndexVec } ;
55use smallvec:: SmallVec ;
66use rustc_data_structures:: sync:: { Lrc , Lock , AtomicU32 , AtomicU64 , Ordering } ;
7+ use rustc_data_structures:: sharded:: { self , Sharded } ;
78use std:: sync:: atomic:: Ordering :: { Acquire , SeqCst } ;
89use std:: env;
910use std:: hash:: Hash ;
@@ -395,7 +396,7 @@ impl DepGraph {
395396 #[ inline]
396397 pub fn read ( & self , v : DepNode ) {
397398 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 ( ) ;
399400 if let Some ( dep_node_index) = map. get ( & v) . copied ( ) {
400401 std:: mem:: drop ( map) ;
401402 data. read_index ( dep_node_index) ;
@@ -419,6 +420,7 @@ impl DepGraph {
419420 . unwrap ( )
420421 . current
421422 . node_to_node_index
423+ . get_shard_by_value ( dep_node)
422424 . lock ( )
423425 . get ( dep_node)
424426 . cloned ( )
@@ -428,7 +430,11 @@ impl DepGraph {
428430 #[ inline]
429431 pub fn dep_node_exists ( & self , dep_node : & DepNode ) -> bool {
430432 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)
432438 } else {
433439 false
434440 }
@@ -609,7 +615,11 @@ impl DepGraph {
609615
610616 #[ cfg( not( parallel_compiler) ) ]
611617 {
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) ) ;
613623 debug_assert ! ( data. colors. get( prev_dep_node_index) . is_none( ) ) ;
614624 }
615625
@@ -955,7 +965,7 @@ struct DepNodeData {
955965
956966pub ( super ) struct CurrentDepGraph {
957967 data : Lock < IndexVec < DepNodeIndex , DepNodeData > > ,
958- node_to_node_index : Lock < FxHashMap < DepNode , DepNodeIndex > > ,
968+ node_to_node_index : Sharded < FxHashMap < DepNode , DepNodeIndex > > ,
959969 #[ allow( dead_code) ]
960970 forbidden_edge : Option < EdgeFilter > ,
961971
@@ -1008,8 +1018,8 @@ impl CurrentDepGraph {
10081018
10091019 CurrentDepGraph {
10101020 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 ,
10131023 Default :: default ( ) ,
10141024 ) ) ,
10151025 anon_id_seed : stable_hasher. finish ( ) ,
@@ -1058,7 +1068,10 @@ impl CurrentDepGraph {
10581068 edges : SmallVec < [ DepNodeIndex ; 8 ] > ,
10591069 fingerprint : Fingerprint
10601070 ) -> 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) ) ;
10621075 self . intern_node ( dep_node, edges, fingerprint)
10631076 }
10641077
@@ -1068,7 +1081,7 @@ impl CurrentDepGraph {
10681081 edges : SmallVec < [ DepNodeIndex ; 8 ] > ,
10691082 fingerprint : Fingerprint
10701083 ) -> 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) {
10721085 Entry :: Occupied ( entry) => * entry. get ( ) ,
10731086 Entry :: Vacant ( entry) => {
10741087 let mut data = self . data . lock ( ) ;
0 commit comments