Skip to content

Commit cd47af1

Browse files
authored
Rollup merge of rust-lang#67756 - Zoxc:collector-tweaks, r=Mark-Simulacrum
Collector tweaks r? @Mark-Simulacrum
2 parents 543b7d9 + 4a64716 commit cd47af1

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

src/librustc_mir/monomorphize/collector.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ use rustc_hir as hir;
194194
use rustc_hir::def_id::{DefId, DefIdMap, LOCAL_CRATE};
195195
use rustc_hir::itemlikevisit::ItemLikeVisitor;
196196
use rustc_index::bit_set::GrowableBitSet;
197-
197+
use smallvec::SmallVec;
198198
use std::iter;
199199

200200
#[derive(PartialEq)]
@@ -227,28 +227,23 @@ impl<'tcx> InliningMap<'tcx> {
227227
}
228228
}
229229

230-
fn record_accesses<I>(&mut self, source: MonoItem<'tcx>, new_targets: I)
231-
where
232-
I: Iterator<Item = (MonoItem<'tcx>, bool)> + ExactSizeIterator,
233-
{
234-
assert!(!self.index.contains_key(&source));
235-
230+
fn record_accesses(&mut self, source: MonoItem<'tcx>, new_targets: &[(MonoItem<'tcx>, bool)]) {
236231
let start_index = self.targets.len();
237232
let new_items_count = new_targets.len();
238233
let new_items_count_total = new_items_count + self.targets.len();
239234

240235
self.targets.reserve(new_items_count);
241236
self.inlines.ensure(new_items_count_total);
242237

243-
for (i, (target, inline)) in new_targets.enumerate() {
244-
self.targets.push(target);
245-
if inline {
238+
for (i, (target, inline)) in new_targets.iter().enumerate() {
239+
self.targets.push(*target);
240+
if *inline {
246241
self.inlines.insert(i + start_index);
247242
}
248243
}
249244

250245
let end_index = self.targets.len();
251-
self.index.insert(source, (start_index, end_index));
246+
assert!(self.index.insert(source, (start_index, end_index)).is_none());
252247
}
253248

254249
// Internally iterate over all items referenced by `source` which will be
@@ -403,10 +398,15 @@ fn record_accesses<'tcx>(
403398
mono_item.instantiation_mode(tcx) == InstantiationMode::LocalCopy
404399
};
405400

406-
let accesses =
407-
callees.into_iter().map(|mono_item| (*mono_item, is_inlining_candidate(mono_item)));
401+
// We collect this into a `SmallVec` to avoid calling `is_inlining_candidate` in the lock.
402+
// FIXME: Call `is_inlining_candidate` when pushing to `neighbors` in `collect_items_rec`
403+
// instead to avoid creating this `SmallVec`.
404+
let accesses: SmallVec<[_; 128]> = callees
405+
.into_iter()
406+
.map(|mono_item| (*mono_item, is_inlining_candidate(mono_item)))
407+
.collect();
408408

409-
inlining_map.lock_mut().record_accesses(caller, accesses);
409+
inlining_map.lock_mut().record_accesses(caller, &accesses);
410410
}
411411

412412
fn check_recursion_limit<'tcx>(

src/librustc_mir/monomorphize/partitioning.rs

+20-12
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ use rustc::ty::print::characteristic_def_id_of_type;
104104
use rustc::ty::query::Providers;
105105
use rustc::ty::{self, DefIdTree, InstanceDef, TyCtxt};
106106
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
107+
use rustc_data_structures::sync;
107108
use rustc_hir::def::DefKind;
108109
use rustc_hir::def_id::{CrateNum, DefId, DefIdSet, CRATE_DEF_INDEX, LOCAL_CRATE};
109110
use rustc_span::symbol::Symbol;
@@ -796,6 +797,8 @@ where
796797
I: Iterator<Item = &'a MonoItem<'tcx>>,
797798
'tcx: 'a,
798799
{
800+
let _prof_timer = tcx.prof.generic_activity("assert_symbols_are_distinct");
801+
799802
let mut symbols: Vec<_> =
800803
mono_items.map(|mono_item| (mono_item, mono_item.symbol_name(tcx))).collect();
801804

@@ -869,18 +872,23 @@ fn collect_and_partition_mono_items(
869872

870873
tcx.sess.abort_if_errors();
871874

872-
assert_symbols_are_distinct(tcx, items.iter());
873-
874-
let strategy = if tcx.sess.opts.incremental.is_some() {
875-
PartitioningStrategy::PerModule
876-
} else {
877-
PartitioningStrategy::FixedUnitCount(tcx.sess.codegen_units())
878-
};
879-
880-
let codegen_units = partition(tcx, items.iter().cloned(), strategy, &inlining_map)
881-
.into_iter()
882-
.map(Arc::new)
883-
.collect::<Vec<_>>();
875+
let (codegen_units, _) = tcx.sess.time("partition_and_assert_distinct_symbols", || {
876+
sync::join(
877+
|| {
878+
let strategy = if tcx.sess.opts.incremental.is_some() {
879+
PartitioningStrategy::PerModule
880+
} else {
881+
PartitioningStrategy::FixedUnitCount(tcx.sess.codegen_units())
882+
};
883+
884+
partition(tcx, items.iter().cloned(), strategy, &inlining_map)
885+
.into_iter()
886+
.map(Arc::new)
887+
.collect::<Vec<_>>()
888+
},
889+
|| assert_symbols_are_distinct(tcx, items.iter()),
890+
)
891+
});
884892

885893
let mono_items: DefIdSet = items
886894
.iter()

0 commit comments

Comments
 (0)