@@ -143,16 +143,29 @@ impl<K: DepKind> DepGraph<K> {
143143 assert_eq ! ( _green_node_index, DepNodeIndex :: SINGLETON_DEPENDENCYLESS_ANON_NODE ) ;
144144
145145 // Instantiate a dependy-less red node only once for anonymous queries.
146- let ( _red_node_index , _prev_and_index ) = current. intern_node (
146+ let ( red_node_index , red_node_prev_index_and_color ) = current. intern_node (
147147 profiler,
148148 & prev_graph,
149149 DepNode { kind : DepKind :: RED , hash : Fingerprint :: ZERO . into ( ) } ,
150150 smallvec ! [ ] ,
151151 None ,
152152 false ,
153153 ) ;
154- assert_eq ! ( _red_node_index, DepNodeIndex :: FOREVER_RED_NODE ) ;
155- assert ! ( matches!( _prev_and_index, None | Some ( ( _, DepNodeColor :: Red ) ) ) ) ;
154+ assert_eq ! ( red_node_index, DepNodeIndex :: FOREVER_RED_NODE ) ;
155+ match red_node_prev_index_and_color {
156+ None => {
157+ // This is expected when we have no previous compilation session.
158+ assert ! ( prev_graph_node_count == 0 ) ;
159+ }
160+ Some ( ( prev_red_node_index, DepNodeColor :: Red ) ) => {
161+ assert_eq ! ( prev_red_node_index. as_usize( ) , red_node_index. as_usize( ) ) ;
162+ colors. insert ( prev_red_node_index, DepNodeColor :: Red ) ;
163+ }
164+ Some ( ( _, DepNodeColor :: Green ( _) ) ) => {
165+ // There must be a logic error somewhere if we hit this branch.
166+ panic ! ( "DepNodeIndex::FOREVER_RED_NODE evaluated to DepNodeColor::Green" )
167+ }
168+ }
156169
157170 DepGraph {
158171 data : Some ( Lrc :: new ( DepGraphData {
@@ -353,10 +366,8 @@ impl<K: DepKind> DepGraphData<K> {
353366 } ) )
354367 } ;
355368
356- let task_deps_ref = match & task_deps {
357- Some ( deps) => TaskDepsRef :: Allow ( deps) ,
358- None => TaskDepsRef :: Ignore ,
359- } ;
369+ let task_deps_ref =
370+ task_deps. as_ref ( ) . map ( TaskDepsRef :: Allow ) . unwrap_or ( TaskDepsRef :: EvalAlways ) ;
360371
361372 let result = K :: with_deps ( task_deps_ref, || task ( cx, arg) ) ;
362373 let edges = task_deps. map_or_else ( || smallvec ! [ ] , |lock| lock. into_inner ( ) . reads ) ;
@@ -461,6 +472,11 @@ impl<K: DepKind> DepGraph<K> {
461472 K :: read_deps ( |task_deps| {
462473 let mut task_deps = match task_deps {
463474 TaskDepsRef :: Allow ( deps) => deps. lock ( ) ,
475+ TaskDepsRef :: EvalAlways => {
476+ // We don't need to record dependencies of eval_always
477+ // queries. They are re-evaluated unconditionally anyway.
478+ return ;
479+ }
464480 TaskDepsRef :: Ignore => return ,
465481 TaskDepsRef :: Forbid => {
466482 panic ! ( "Illegal read of: {dep_node_index:?}" )
@@ -556,7 +572,10 @@ impl<K: DepKind> DepGraph<K> {
556572 let mut edges = SmallVec :: new ( ) ;
557573 K :: read_deps ( |task_deps| match task_deps {
558574 TaskDepsRef :: Allow ( deps) => edges. extend ( deps. lock ( ) . reads . iter ( ) . copied ( ) ) ,
559- TaskDepsRef :: Ignore => { } // During HIR lowering, we have no dependencies.
575+ TaskDepsRef :: EvalAlways => {
576+ edges. push ( DepNodeIndex :: FOREVER_RED_NODE ) ;
577+ }
578+ TaskDepsRef :: Ignore => { }
560579 TaskDepsRef :: Forbid => {
561580 panic ! ( "Cannot summarize when dependencies are not recorded." )
562581 }
@@ -1349,10 +1368,13 @@ pub enum TaskDepsRef<'a, K: DepKind> {
13491368 /// `TaskDeps`. This is used when executing a 'normal' query
13501369 /// (no `eval_always` modifier)
13511370 Allow ( & ' a Lock < TaskDeps < K > > ) ,
1352- /// New dependencies are ignored. This is used when
1353- /// executing an `eval_always` query, since there's no
1371+ /// This is used when executing an `eval_always` query. We don't
13541372 /// need to track dependencies for a query that's always
1355- /// re-executed. This is also used for `dep_graph.with_ignore`
1373+ /// re-executed -- but we need to know that this is an `eval_always`
1374+ /// query in order to emit dependencies to `DepNodeIndex::FOREVER_RED_NODE`
1375+ /// when directly feeding other queries.
1376+ EvalAlways ,
1377+ /// New dependencies are ignored. This is also used for `dep_graph.with_ignore`.
13561378 Ignore ,
13571379 /// Any attempt to add new dependencies will cause a panic.
13581380 /// This is used when decoding a query result from disk,
0 commit comments