Skip to content

Commit a8791be

Browse files
committed
Auto merge of #141730 - osiewicz:collect-crate-deps-postorder-use-indexset, r=<try>
cstore: Use IndexSet as backing store for postorder dependencies <rustc_metadata::creader::CStore>::push_dependencies_in_postorder showed up in new benchmarks from rust-lang/rustc-perf#2143, hence I gave it a shot to remove an obvious O(n) there. r? nnethercote
2 parents 8afd710 + 9b3be25 commit a8791be

File tree

2 files changed

+9
-7
lines changed

2 files changed

+9
-7
lines changed

compiler/rustc_metadata/src/creader.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use rustc_hir::def_id::{CrateNum, LOCAL_CRATE, LocalDefId, StableCrateId};
2222
use rustc_hir::definitions::Definitions;
2323
use rustc_index::IndexVec;
2424
use rustc_middle::bug;
25+
use rustc_middle::ty::data_structures::IndexSet;
2526
use rustc_middle::ty::{TyCtxt, TyCtxtFeed};
2627
use rustc_session::config::{
2728
self, CrateType, ExtendedTargetModifierInfo, ExternLocation, OptionsTargetModifiers,
@@ -281,7 +282,7 @@ impl CStore {
281282
.filter_map(|(cnum, data)| data.as_deref_mut().map(|data| (cnum, data)))
282283
}
283284

284-
fn push_dependencies_in_postorder(&self, deps: &mut Vec<CrateNum>, cnum: CrateNum) {
285+
fn push_dependencies_in_postorder(&self, deps: &mut IndexSet<CrateNum>, cnum: CrateNum) {
285286
if !deps.contains(&cnum) {
286287
let data = self.get_crate_data(cnum);
287288
for dep in data.dependencies() {
@@ -290,12 +291,12 @@ impl CStore {
290291
}
291292
}
292293

293-
deps.push(cnum);
294+
deps.insert(cnum);
294295
}
295296
}
296297

297-
pub(crate) fn crate_dependencies_in_postorder(&self, cnum: CrateNum) -> Vec<CrateNum> {
298-
let mut deps = Vec::new();
298+
pub(crate) fn crate_dependencies_in_postorder(&self, cnum: CrateNum) -> IndexSet<CrateNum> {
299+
let mut deps = IndexSet::default();
299300
if cnum == LOCAL_CRATE {
300301
for (cnum, _) in self.iter_crate_data() {
301302
self.push_dependencies_in_postorder(&mut deps, cnum);
@@ -306,7 +307,7 @@ impl CStore {
306307
deps
307308
}
308309

309-
fn crate_dependencies_in_reverse_postorder(&self, cnum: CrateNum) -> Vec<CrateNum> {
310+
fn crate_dependencies_in_reverse_postorder(&self, cnum: CrateNum) -> IndexSet<CrateNum> {
310311
let mut deps = self.crate_dependencies_in_postorder(cnum);
311312
deps.reverse();
312313
deps

compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -549,8 +549,9 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
549549
has_global_allocator: |tcx, LocalCrate| CStore::from_tcx(tcx).has_global_allocator(),
550550
has_alloc_error_handler: |tcx, LocalCrate| CStore::from_tcx(tcx).has_alloc_error_handler(),
551551
postorder_cnums: |tcx, ()| {
552-
tcx.arena
553-
.alloc_slice(&CStore::from_tcx(tcx).crate_dependencies_in_postorder(LOCAL_CRATE))
552+
tcx.arena.alloc_from_iter(
553+
CStore::from_tcx(tcx).crate_dependencies_in_postorder(LOCAL_CRATE).into_iter(),
554+
)
554555
},
555556
crates: |tcx, ()| {
556557
// The list of loaded crates is now frozen in query cache,

0 commit comments

Comments
 (0)