@@ -143,16 +143,29 @@ impl<K: DepKind> DepGraph<K> {
143
143
assert_eq ! ( _green_node_index, DepNodeIndex :: SINGLETON_DEPENDENCYLESS_ANON_NODE ) ;
144
144
145
145
// 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 (
147
147
profiler,
148
148
& prev_graph,
149
149
DepNode { kind : DepKind :: RED , hash : Fingerprint :: ZERO . into ( ) } ,
150
150
smallvec ! [ ] ,
151
151
None ,
152
152
false ,
153
153
) ;
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
+ }
156
169
157
170
DepGraph {
158
171
data : Some ( Lrc :: new ( DepGraphData {
@@ -353,10 +366,8 @@ impl<K: DepKind> DepGraphData<K> {
353
366
} ) )
354
367
} ;
355
368
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 ) ;
360
371
361
372
let result = K :: with_deps ( task_deps_ref, || task ( cx, arg) ) ;
362
373
let edges = task_deps. map_or_else ( || smallvec ! [ ] , |lock| lock. into_inner ( ) . reads ) ;
@@ -461,6 +472,11 @@ impl<K: DepKind> DepGraph<K> {
461
472
K :: read_deps ( |task_deps| {
462
473
let mut task_deps = match task_deps {
463
474
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
+ }
464
480
TaskDepsRef :: Ignore => return ,
465
481
TaskDepsRef :: Forbid => {
466
482
panic ! ( "Illegal read of: {dep_node_index:?}" )
@@ -556,7 +572,10 @@ impl<K: DepKind> DepGraph<K> {
556
572
let mut edges = SmallVec :: new ( ) ;
557
573
K :: read_deps ( |task_deps| match task_deps {
558
574
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 => { }
560
579
TaskDepsRef :: Forbid => {
561
580
panic ! ( "Cannot summarize when dependencies are not recorded." )
562
581
}
@@ -1349,10 +1368,13 @@ pub enum TaskDepsRef<'a, K: DepKind> {
1349
1368
/// `TaskDeps`. This is used when executing a 'normal' query
1350
1369
/// (no `eval_always` modifier)
1351
1370
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
1354
1372
/// 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`.
1356
1378
Ignore ,
1357
1379
/// Any attempt to add new dependencies will cause a panic.
1358
1380
/// This is used when decoding a query result from disk,
0 commit comments