-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[incremental] Add support for eval always queries #45353
Conversation
r? @eddyb (rust_highfive has picked a reviewer for you, use r? to override) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looking good, except for the result fingerprinting being missing. Since we essentially disable dependency tracking for this tasks its even more important for them to be fingerprinted.
If you add the fingerprint, however, I guess there'll be a lot of code duplication between with_untracked_task
and with_task
. Maybe one can be implemented in the terms of the other.
I'm also a bit skeptical about the term untracked
since it rather suggests the functionality that we already have with ignore
.
src/librustc/dep_graph/graph.rs
Outdated
@@ -782,6 +812,24 @@ impl CurrentDepGraph { | |||
} | |||
} | |||
|
|||
pub(super) fn push_untracked_task(&mut self, key: DepNode) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You should be able to make the push
and the pop
methods here private.
src/librustc/dep_graph/graph.rs
Outdated
@@ -812,7 +860,7 @@ impl CurrentDepGraph { | |||
reads.push(source); | |||
} | |||
} | |||
Some(&mut OpenTask::Ignore) | None => { | |||
Some(&mut OpenTask::Ignore) | Some(&mut OpenTask::Untracked { .. }) | None => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since this line is getting a little long, it would be more readable to have each arm on its own line.
Hm, it looks like implementing pub fn with_xxx_task<C, A, R, HCX>(&self,
key: DepNode,
cx: C,
arg: A,
task: fn(C, A) -> R)
-> (R, DepNodeIndex)
{
self.with_task(key, cx, arg, |cx, arg| {
// Explicitly add the read to the Krate node
self.read(DepNode::Krate);
// Execute the task without recording any other reads
self.with_ignore(|| {
task(cx, arg)
})
})
} But |
Thanks for the review! What about something like "crate-wide query"? I'm also fine just changing it to "eval-always". |
Yeah, let's stick to "eval-always". It's not a pretty name but it conveys the underlying concept well enough. |
38b3aa5
to
9794bb5
Compare
@michaelwoerister I fixed up the commit per your feedback. |
@wesleywiser Yes, that looks very good now! If you want to continue working on this, I suggest just appending to this PR. |
@michaelwoerister Thanks! Pushed three new commits. |
Looks very good! I'm seeing this error on travis:
This suggests that we are re-running queries although they've already been marked as green. This is because we are not doing the whole Thinking about it some more, there should really be no reason to treat an eval-always query different from a regular one, except for the changes you already implemented in rust/src/librustc/ty/maps/plumbing.rs Lines 433 to 442 in b247805
That should also not introduce any code duplication. Let me know if you have any questions about this change of strategy. |
Hmmm... I can't seem to repro that. Regardless, I can certainly revert the changes to |
You are probably building with debug assertions disabled. I generally recommend setting I imagine the updated profq_msg!(tcx, ProfileQueriesMsg::ProviderBegin);
let res = tcx.cycle_check(span, Query::$name(key), || {
tcx.sess.diagnostic().track_diagnostics(|| {
if dep_node.is_eval_always() {
tcx.dep_graph.with_eval_always_task(dep_node,
tcx,
key,
Self::compute_result)
} else {
tcx.dep_graph.with_task(dep_node,
tcx,
key,
Self::compute_result)
}
})
})?;
profq_msg!(tcx, ProfileQueriesMsg::ProviderEnd); This way eval-always tasks are treated the same as regular with the only exception of what reads are recorded from them. |
Oh got it. That makes sense.
Thanks! I'll do that. |
9e3be26
to
8281e88
Compare
@michaelwoerister Done |
Awesome, thank you so much @wesleywiser! @bors r+ |
📌 Commit 8281e88 has been approved by |
[incremental] Add support for eval always queries Part of #45238
☀️ Test successful - status-appveyor, status-travis |
Thanks for all the help @michaelwoerister!! |
You're welcome! |
…=michaelwoerister remove outdated comment rust-lang#44234 was closed, apparently solved by rust-lang#45353 r? @michaelwoerister
…eyouxu remove outdated comment rust-lang#44234 was closed, apparently solved by rust-lang#45353
Rollup merge of rust-lang#131965 - ChrisDenton:outdated-comment, r=jieyouxu remove outdated comment rust-lang#44234 was closed, apparently solved by rust-lang#45353
Part of #45238