Skip to content

Commit a0e229a

Browse files
committed
Auto merge of rust-lang#83649 - bjorn3:dedup_providers, r=petrochenkov
Don't duplicate the extern providers once for each crate This should give a small perf improvement for small crates by avoiding a memcpy of a pretty big struct for each loaded crate. In addition would be useful for replacing the sequential `CrateNum` everywhere with the hash based `StableCrateId` introduced in rust-lang#81635, which would allow avoiding remapping of `CrateNum`'s when loading crate metadata. While this PR is not strictly needed for that, it is necessary to prevent a performance loss due to it. I think this duplication was done in rust-lang#40008 (which introduced the query system) to make it possible to compile multiple crates in a single session in the future. I think this is unlikely to be implemented any time soon. In addition this PR can easily be reverted if necessary to implement this.
2 parents 32d3276 + cd7a011 commit a0e229a

File tree

3 files changed

+14
-23
lines changed

3 files changed

+14
-23
lines changed

compiler/rustc_interface/src/passes.rs

+1-8
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use rustc_expand::base::ExtCtxt;
1515
use rustc_hir::def_id::{CrateNum, LOCAL_CRATE};
1616
use rustc_hir::definitions::Definitions;
1717
use rustc_hir::Crate;
18-
use rustc_index::vec::IndexVec;
1918
use rustc_lint::LintStore;
2019
use rustc_middle::arena::Arena;
2120
use rustc_middle::dep_graph::DepGraph;
@@ -788,13 +787,7 @@ pub fn create_global_ctxt<'tcx>(
788787
callback(sess, &mut local_providers, &mut extern_providers);
789788
}
790789

791-
let queries = {
792-
let crates = resolver_outputs.cstore.crates_untracked();
793-
let max_cnum = crates.iter().map(|c| c.as_usize()).max().unwrap_or(0);
794-
let mut providers = IndexVec::from_elem_n(extern_providers, max_cnum + 1);
795-
providers[LOCAL_CRATE] = local_providers;
796-
queries.get_or_init(|| TcxQueries::new(providers, extern_providers))
797-
};
790+
let queries = queries.get_or_init(|| TcxQueries::new(local_providers, extern_providers));
798791

799792
let gcx = sess.time("setup_global_ctxt", || {
800793
global_ctxt.get_or_init(|| {

compiler/rustc_query_impl/src/lib.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ extern crate tracing;
1919
use rustc_data_structures::fingerprint::Fingerprint;
2020
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
2121
use rustc_errors::{DiagnosticBuilder, Handler};
22-
use rustc_hir::def_id::CrateNum;
23-
use rustc_index::vec::IndexVec;
22+
use rustc_hir::def_id::LOCAL_CRATE;
2423
use rustc_middle::dep_graph;
2524
use rustc_middle::ich::StableHashingContext;
2625
use rustc_middle::ty::query::{query_keys, query_storage, query_stored, query_values};

compiler/rustc_query_impl/src/plumbing.rs

+12-13
Original file line numberDiff line numberDiff line change
@@ -390,13 +390,12 @@ macro_rules! define_queries {
390390

391391
#[inline]
392392
fn compute(tcx: QueryCtxt<'tcx>, key: Self::Key) -> Self::Value {
393-
let provider = tcx.queries.providers.get(key.query_crate())
394-
// HACK(eddyb) it's possible crates may be loaded after
395-
// the query engine is created, and because crate loading
396-
// is not yet integrated with the query engine, such crates
397-
// would be missing appropriate entries in `providers`.
398-
.unwrap_or(&tcx.queries.fallback_extern_providers)
399-
.$name;
393+
let is_local = key.query_crate() == LOCAL_CRATE;
394+
let provider = if is_local {
395+
tcx.queries.local_providers.$name
396+
} else {
397+
tcx.queries.extern_providers.$name
398+
};
400399
provider(*tcx, key)
401400
}
402401

@@ -507,8 +506,8 @@ macro_rules! define_queries_struct {
507506
(tcx: $tcx:tt,
508507
input: ($(([$($modifiers:tt)*] [$($attr:tt)*] [$name:ident]))*)) => {
509508
pub struct Queries<$tcx> {
510-
providers: IndexVec<CrateNum, Providers>,
511-
fallback_extern_providers: Box<Providers>,
509+
local_providers: Box<Providers>,
510+
extern_providers: Box<Providers>,
512511

513512
$($(#[$attr])* $name: QueryState<
514513
crate::dep_graph::DepKind,
@@ -518,12 +517,12 @@ macro_rules! define_queries_struct {
518517

519518
impl<$tcx> Queries<$tcx> {
520519
pub fn new(
521-
providers: IndexVec<CrateNum, Providers>,
522-
fallback_extern_providers: Providers,
520+
local_providers: Providers,
521+
extern_providers: Providers,
523522
) -> Self {
524523
Queries {
525-
providers,
526-
fallback_extern_providers: Box::new(fallback_extern_providers),
524+
local_providers: Box::new(local_providers),
525+
extern_providers: Box::new(extern_providers),
527526
$($name: Default::default()),*
528527
}
529528
}

0 commit comments

Comments
 (0)