Skip to content

Commit 3df1fed

Browse files
committed
Auto merge of #158845 - LorrensP-2158466:parallel-import-resolution, r=<try>
Resolver: Parallelize the import resolution loop
2 parents 3c00c96 + a45ba86 commit 3df1fed

14 files changed

Lines changed: 403 additions & 299 deletions

File tree

compiler/rustc_data_structures/src/sync.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pub use self::mode::{
3838
FromDyn, check_dyn_thread_safe, is_dyn_thread_safe, set_dyn_thread_safe_mode,
3939
};
4040
pub use self::parallel::{
41-
broadcast, par_fns, par_for_each_in, par_join, par_map, parallel_guard, spawn,
41+
broadcast, par_filter_map, par_fns, par_for_each_in, par_join, par_map, parallel_guard, spawn,
4242
try_par_for_each_in,
4343
};
4444
pub use self::vec::{AppendOnlyIndexVec, AppendOnlyVec};
@@ -189,6 +189,7 @@ impl<T> RwLock<T> {
189189
}
190190

191191
#[inline(always)]
192+
#[track_caller]
192193
pub fn read(&self) -> ReadGuard<'_, T> {
193194
if ERROR_CHECKING {
194195
self.0.try_read().expect("lock was already held")
@@ -203,6 +204,7 @@ impl<T> RwLock<T> {
203204
}
204205

205206
#[inline(always)]
207+
#[track_caller]
206208
pub fn write(&self) -> WriteGuard<'_, T> {
207209
if ERROR_CHECKING {
208210
self.0.try_write().expect("lock was already held")

compiler/rustc_data_structures/src/sync/parallel.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,33 @@ pub fn par_map<I: DynSend, T: IntoIterator<Item = I>, R: DynSend, C: FromIterato
247247
})
248248
}
249249

250+
pub fn par_filter_map<I: DynSend, T: IntoIterator<Item = I>, R: DynSend, C: FromIterator<R>>(
251+
t: T,
252+
map: impl Fn(I) -> Option<R> + DynSync + DynSend,
253+
) -> C {
254+
parallel_guard(|guard| {
255+
if let Some(proof) = mode::check_dyn_thread_safe() {
256+
let map = proof.derive(map);
257+
258+
let mut items: Vec<(Option<I>, Option<Option<R>>)> =
259+
t.into_iter().map(|i| (Some(i), None)).collect();
260+
261+
par_slice(
262+
&mut items,
263+
guard,
264+
|i| {
265+
i.1 = Some(map(i.0.take().unwrap()));
266+
},
267+
proof,
268+
);
269+
270+
items.into_iter().filter_map(|(_, r)| r.flatten()).collect()
271+
} else {
272+
t.into_iter().filter_map(|i| guard.run(|| map(i)).flatten()).collect()
273+
}
274+
})
275+
}
276+
250277
pub fn broadcast<R: DynSend>(op: impl Fn(usize) -> R + DynSync) -> Vec<R> {
251278
if let Some(proof) = mode::check_dyn_thread_safe() {
252279
let op = proof.derive(op);

compiler/rustc_interface/src/passes.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,8 @@ fn resolver_for_lowering_raw<'tcx>(
791791
&'tcx Steal<ast::Crate>,
792792
&'tcx ty::ResolverGlobalCtxt,
793793
) {
794-
let arenas = Resolver::arenas();
794+
let arenas = Resolver::new_arenas();
795+
let extern_arenas = Resolver::new_arenas();
795796
let _ = tcx.registered_tools(()); // Uses `crate_for_resolver`.
796797
let (krate, pre_configured_attrs) = tcx.crate_for_resolver(()).steal();
797798
let mut resolver = Resolver::new(
@@ -800,6 +801,7 @@ fn resolver_for_lowering_raw<'tcx>(
800801
krate.spans.inner_span,
801802
krate.spans.inject_use_span,
802803
&arenas,
804+
&extern_arenas,
803805
);
804806
let krate = configure_and_expand(krate, &pre_configured_attrs, &mut resolver);
805807

0 commit comments

Comments
 (0)