Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0c33fe2

Browse files
committed
Auto merge of #121909 - Zoxc:drop-ast-task, r=petrochenkov
Drop AST on a separate thread and prefetch `hir_crate` This drop AST on a separate thread and prefetches `hir_crate`. A `spawn` function is added to the `parallel` module which spawn some work on the Rayon thread pool.
2 parents b45dd71 + ef94033 commit 0c33fe2

File tree

4 files changed

+26
-3
lines changed

4 files changed

+26
-3
lines changed

‎compiler/rustc_ast_lowering/src/lib.rs‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ use rustc_attr_parsing::{AttributeParser, OmitDoc};
4949
use rustc_data_structures::fingerprint::Fingerprint;
5050
use rustc_data_structures::sorted_map::SortedMap;
5151
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
52+
use rustc_data_structures::sync::spawn;
5253
use rustc_data_structures::tagged_ptr::TaggedRef;
5354
use rustc_errors::{DiagArgFromDisplay, DiagCtxtHandle, StashKey};
5455
use rustc_hir::def::{DefKind, LifetimeRes, Namespace, PartialRes, PerNS, Res};
@@ -454,9 +455,14 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
454455
.lower_node(def_id);
455456
}
456457

457-
// Drop AST to free memory
458458
drop(ast_index);
459-
sess.time("drop_ast", || drop(krate));
459+
460+
// Drop AST to free memory. It can be expensive so try to drop it on a separate thread.
461+
let prof = sess.prof.clone();
462+
spawn(move || {
463+
let _timer = prof.verbose_generic_activity("drop_ast");
464+
drop(krate);
465+
});
460466

461467
// Don't hash unless necessary, because it's expensive.
462468
let opt_hir_hash =

‎compiler/rustc_data_structures/src/sync.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub use self::freeze::{FreezeLock, FreezeReadGuard, FreezeWriteGuard};
4343
pub use self::lock::{Lock, LockGuard, Mode};
4444
pub use self::mode::{is_dyn_thread_safe, set_dyn_thread_safe_mode};
4545
pub use self::parallel::{
46-
join, par_for_each_in, par_map, parallel_guard, scope, try_par_for_each_in,
46+
join, par_for_each_in, par_map, parallel_guard, scope, spawn,try_par_for_each_in,
4747
};
4848
pub use self::vec::{AppendOnlyIndexVec, AppendOnlyVec};
4949
pub use self::worker_local::{Registry, WorkerLocal};

‎compiler/rustc_data_structures/src/sync/parallel.rs‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,17 @@ macro_rules! parallel {
9393
};
9494
}
9595

96+
pub fn spawn(func: impl FnOnce() + DynSend + 'static) {
97+
if mode::is_dyn_thread_safe() {
98+
let func = FromDyn::from(func);
99+
rayon_core::spawn(|| {
100+
(func.into_inner())();
101+
});
102+
} else {
103+
func()
104+
}
105+
}
106+
96107
// This function only works when `mode::is_dyn_thread_safe()`.
97108
pub fn scope<'scope, OP, R>(op: OP) -> R
98109
where

‎compiler/rustc_interface/src/passes.rs‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,12 @@ fn run_required_analyses(tcx: TyCtxt<'_>) {
900900
// is not defined. So we need to cfg it out.
901901
#[cfg(all(not(doc), debug_assertions))]
902902
rustc_passes::hir_id_validator::check_crate(tcx);
903+
904+
// Prefetch this to prevent multiple threads from blocking on it later.
905+
// This is needed since the `hir_id_validator::check_crate` call above is not guaranteed
906+
// to use `hir_crate`.
907+
tcx.ensure_done().hir_crate(());
908+
903909
let sess = tcx.sess;
904910
sess.time("misc_checking_1", || {
905911
parallel!(

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /