Skip to content

Commit 6117c06

Browse files
incr.comp.: Make sure dependencies are recorded when feeding queries during eval-always queries.
1 parent 932c173 commit 6117c06

File tree

3 files changed

+71
-33
lines changed

3 files changed

+71
-33
lines changed

compiler/rustc_passes/src/hir_id_validator.rs

+22-22
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,34 @@ use rustc_middle::hir::nested_filter;
88
use rustc_middle::ty::TyCtxt;
99

1010
pub fn check_crate(tcx: TyCtxt<'_>) {
11-
tcx.dep_graph.assert_ignored();
12-
13-
if tcx.sess.opts.unstable_opts.hir_stats {
14-
crate::hir_stats::print_hir_stats(tcx);
15-
}
11+
tcx.dep_graph.with_ignore(|| {
12+
if tcx.sess.opts.unstable_opts.hir_stats {
13+
crate::hir_stats::print_hir_stats(tcx);
14+
}
1615

17-
#[cfg(debug_assertions)]
18-
{
19-
let errors = Lock::new(Vec::new());
16+
#[cfg(debug_assertions)]
17+
{
18+
let errors = Lock::new(Vec::new());
2019

21-
tcx.hir().par_for_each_module(|module_id| {
22-
let mut v = HirIdValidator {
23-
tcx,
24-
owner: None,
25-
hir_ids_seen: Default::default(),
26-
errors: &errors,
27-
};
20+
tcx.hir().par_for_each_module(|module_id| {
21+
let mut v = HirIdValidator {
22+
tcx,
23+
owner: None,
24+
hir_ids_seen: Default::default(),
25+
errors: &errors,
26+
};
2827

29-
tcx.hir().visit_item_likes_in_module(module_id, &mut v);
30-
});
28+
tcx.hir().visit_item_likes_in_module(module_id, &mut v);
29+
});
3130

32-
let errors = errors.into_inner();
31+
let errors = errors.into_inner();
3332

34-
if !errors.is_empty() {
35-
let message = errors.iter().fold(String::new(), |s1, s2| s1 + "\n" + s2);
36-
tcx.sess.delay_span_bug(rustc_span::DUMMY_SP, &message);
33+
if !errors.is_empty() {
34+
let message = errors.iter().fold(String::new(), |s1, s2| s1 + "\n" + s2);
35+
tcx.sess.delay_span_bug(rustc_span::DUMMY_SP, &message);
36+
}
3737
}
38-
}
38+
})
3939
}
4040

4141
struct HirIdValidator<'a, 'hir> {

compiler/rustc_query_system/src/dep_graph/graph.rs

+33-11
Original file line numberDiff line numberDiff line change
@@ -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,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// revisions: cpass1 cpass2
2+
3+
#![crate_type = "rlib"]
4+
5+
use std::fmt::Debug;
6+
7+
// MCVE kindly provided by Nilstrieb at
8+
// https://github.com/rust-lang/rust/issues/108481#issuecomment-1493080185
9+
10+
#[derive(Debug)]
11+
pub struct ConstGeneric<const CHUNK_SIZE: usize> {
12+
_p: [(); CHUNK_SIZE],
13+
}
14+
15+
#[cfg(cpass1)]
16+
impl<const CHUNK_SIZE: usize> ConstGeneric<CHUNK_SIZE> {}

0 commit comments

Comments
 (0)