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.
|
||||
[] fn Red() -> (),
|
||||
[] fn SideEffect() -> (),
|
||||
[] fn AnonZeroDeps() -> (),
|
||||
[] fn TraitSelect() -> (),
|
||||
[] fn CompileCodegenUnit() -> (),
|
||||
[] fn CompileMonoItem() -> (),
|
||||
|
|
|
@ -53,6 +53,7 @@ impl Deps for DepsType {
|
|||
const DEP_KIND_NULL: DepKind = dep_kinds::Null;
|
||||
const DEP_KIND_RED: DepKind = dep_kinds::Red;
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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> {
|
||||
DepKindStruct {
|
||||
is_anon: true,
|
||||
|
|
|
@ -50,7 +50,7 @@ rustc_index::newtype_index! {
|
|||
rustc_data_structures::static_assert_size!(Option<DepNodeIndex>, 4);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -140,13 +140,13 @@ impl<D: Deps> DepGraph<D> {
|
|||
|
||||
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(
|
||||
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(),
|
||||
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.
|
||||
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
|
||||
// `SINGLETON_DEPENDENCYLESS_ANON_NODE`). As a consequence we can skip creating
|
||||
// a `StableHasher` and sending the node through interning.
|
||||
DepNodeIndex::SINGLETON_DEPENDENCYLESS_ANON_NODE
|
||||
DepNodeIndex::SINGLETON_ZERO_DEPS_ANON_NODE
|
||||
}
|
||||
1 => {
|
||||
// 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.
|
||||
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
|
||||
/// pack information into the unused bits.
|
||||
const DEP_KIND_MAX: u16;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue