Add a dep kind for use of the anon node with zero dependencies
This commit is contained in:
parent
70dab5a27c
commit
927ad1659a
5 changed files with 21 additions and 5 deletions
|
@ -89,6 +89,7 @@ rustc_query_append!(define_dep_nodes![
|
||||||
/// We use this to create a forever-red node.
|
/// We use this to create a forever-red node.
|
||||||
[] fn Red() -> (),
|
[] fn Red() -> (),
|
||||||
[] fn SideEffect() -> (),
|
[] fn SideEffect() -> (),
|
||||||
|
[] fn AnonZeroDeps() -> (),
|
||||||
[] fn TraitSelect() -> (),
|
[] fn TraitSelect() -> (),
|
||||||
[] fn CompileCodegenUnit() -> (),
|
[] fn CompileCodegenUnit() -> (),
|
||||||
[] fn CompileMonoItem() -> (),
|
[] fn CompileMonoItem() -> (),
|
||||||
|
|
|
@ -53,6 +53,7 @@ impl Deps for DepsType {
|
||||||
const DEP_KIND_NULL: DepKind = dep_kinds::Null;
|
const DEP_KIND_NULL: DepKind = dep_kinds::Null;
|
||||||
const DEP_KIND_RED: DepKind = dep_kinds::Red;
|
const DEP_KIND_RED: DepKind = dep_kinds::Red;
|
||||||
const DEP_KIND_SIDE_EFFECT: DepKind = dep_kinds::SideEffect;
|
const DEP_KIND_SIDE_EFFECT: DepKind = dep_kinds::SideEffect;
|
||||||
|
const DEP_KIND_ANON_ZERO_DEPS: DepKind = dep_kinds::AnonZeroDeps;
|
||||||
const DEP_KIND_MAX: u16 = dep_node::DEP_KIND_VARIANTS - 1;
|
const DEP_KIND_MAX: u16 = dep_node::DEP_KIND_VARIANTS - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -870,6 +870,17 @@ macro_rules! define_queries {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn AnonZeroDeps<'tcx>() -> DepKindStruct<'tcx> {
|
||||||
|
DepKindStruct {
|
||||||
|
is_anon: true,
|
||||||
|
is_eval_always: false,
|
||||||
|
fingerprint_style: FingerprintStyle::Opaque,
|
||||||
|
force_from_dep_node: Some(|_, _, _| bug!("cannot force an anon node")),
|
||||||
|
try_load_from_on_disk_cache: None,
|
||||||
|
name: &"AnonZeroDeps",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn TraitSelect<'tcx>() -> DepKindStruct<'tcx> {
|
pub(crate) fn TraitSelect<'tcx>() -> DepKindStruct<'tcx> {
|
||||||
DepKindStruct {
|
DepKindStruct {
|
||||||
is_anon: true,
|
is_anon: true,
|
||||||
|
|
|
@ -50,7 +50,7 @@ rustc_index::newtype_index! {
|
||||||
rustc_data_structures::static_assert_size!(Option<DepNodeIndex>, 4);
|
rustc_data_structures::static_assert_size!(Option<DepNodeIndex>, 4);
|
||||||
|
|
||||||
impl DepNodeIndex {
|
impl DepNodeIndex {
|
||||||
const SINGLETON_DEPENDENCYLESS_ANON_NODE: DepNodeIndex = DepNodeIndex::ZERO;
|
const SINGLETON_ZERO_DEPS_ANON_NODE: DepNodeIndex = DepNodeIndex::ZERO;
|
||||||
pub const FOREVER_RED_NODE: DepNodeIndex = DepNodeIndex::from_u32(1);
|
pub const FOREVER_RED_NODE: DepNodeIndex = DepNodeIndex::from_u32(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,13 +140,13 @@ impl<D: Deps> DepGraph<D> {
|
||||||
|
|
||||||
let colors = DepNodeColorMap::new(prev_graph_node_count);
|
let colors = DepNodeColorMap::new(prev_graph_node_count);
|
||||||
|
|
||||||
// Instantiate a dependy-less node only once for anonymous queries.
|
// Instantiate a node with zero dependencies only once for anonymous queries.
|
||||||
let _green_node_index = current.alloc_node(
|
let _green_node_index = current.alloc_node(
|
||||||
DepNode { kind: D::DEP_KIND_NULL, hash: current.anon_id_seed.into() },
|
DepNode { kind: D::DEP_KIND_ANON_ZERO_DEPS, hash: current.anon_id_seed.into() },
|
||||||
EdgesVec::new(),
|
EdgesVec::new(),
|
||||||
Fingerprint::ZERO,
|
Fingerprint::ZERO,
|
||||||
);
|
);
|
||||||
assert_eq!(_green_node_index, DepNodeIndex::SINGLETON_DEPENDENCYLESS_ANON_NODE);
|
assert_eq!(_green_node_index, DepNodeIndex::SINGLETON_ZERO_DEPS_ANON_NODE);
|
||||||
|
|
||||||
// Instantiate a dependy-less red node only once for anonymous queries.
|
// Instantiate a dependy-less red node only once for anonymous queries.
|
||||||
let red_node_index = current.alloc_node(
|
let red_node_index = current.alloc_node(
|
||||||
|
@ -407,7 +407,7 @@ impl<D: Deps> DepGraphData<D> {
|
||||||
// going to be (i.e. equal to the precomputed
|
// going to be (i.e. equal to the precomputed
|
||||||
// `SINGLETON_DEPENDENCYLESS_ANON_NODE`). As a consequence we can skip creating
|
// `SINGLETON_DEPENDENCYLESS_ANON_NODE`). As a consequence we can skip creating
|
||||||
// a `StableHasher` and sending the node through interning.
|
// a `StableHasher` and sending the node through interning.
|
||||||
DepNodeIndex::SINGLETON_DEPENDENCYLESS_ANON_NODE
|
DepNodeIndex::SINGLETON_ZERO_DEPS_ANON_NODE
|
||||||
}
|
}
|
||||||
1 => {
|
1 => {
|
||||||
// When there is only one dependency, don't bother creating a node.
|
// When there is only one dependency, don't bother creating a node.
|
||||||
|
|
|
@ -111,6 +111,9 @@ pub trait Deps {
|
||||||
/// We use this to create a side effect node.
|
/// We use this to create a side effect node.
|
||||||
const DEP_KIND_SIDE_EFFECT: DepKind;
|
const DEP_KIND_SIDE_EFFECT: DepKind;
|
||||||
|
|
||||||
|
/// We use this to create the anon node with zero dependencies.
|
||||||
|
const DEP_KIND_ANON_ZERO_DEPS: DepKind;
|
||||||
|
|
||||||
/// This is the highest value a `DepKind` can have. It's used during encoding to
|
/// This is the highest value a `DepKind` can have. It's used during encoding to
|
||||||
/// pack information into the unused bits.
|
/// pack information into the unused bits.
|
||||||
const DEP_KIND_MAX: u16;
|
const DEP_KIND_MAX: u16;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue