Auto merge of #113772 - nnethercote:streamline-size-estimates-2, r=wesleywiser
Streamline size estimates (take 2) This was merged in #113684 but then [something happened](https://github.com/rust-lang/rust/pull/113684#issuecomment-1636811985): > There has been a bors issue that lead to the merge commit of this PR getting purged from master. > You'll have to make a new PR to reapply it. So this is exactly the same changes. `@bors` r=wesleywiser
This commit is contained in:
commit
299179e694
8 changed files with 85 additions and 97 deletions
|
@ -59,12 +59,19 @@ impl<'tcx> MonoItem<'tcx> {
|
|||
pub fn size_estimate(&self, tcx: TyCtxt<'tcx>) -> usize {
|
||||
match *self {
|
||||
MonoItem::Fn(instance) => {
|
||||
// Estimate the size of a function based on how many statements
|
||||
// it contains.
|
||||
tcx.instance_def_size_estimate(instance.def)
|
||||
match instance.def {
|
||||
// "Normal" functions size estimate: the number of
|
||||
// statements, plus one for the terminator.
|
||||
InstanceDef::Item(..) | InstanceDef::DropGlue(..) => {
|
||||
let mir = tcx.instance_mir(instance.def);
|
||||
mir.basic_blocks.iter().map(|bb| bb.statements.len() + 1).sum()
|
||||
}
|
||||
// Other compiler-generated shims size estimate: 1
|
||||
_ => 1,
|
||||
}
|
||||
}
|
||||
// Conservatively estimate the size of a static declaration
|
||||
// or assembly to be 1.
|
||||
// Conservatively estimate the size of a static declaration or
|
||||
// assembly item to be 1.
|
||||
MonoItem::Static(_) | MonoItem::GlobalAsm(_) => 1,
|
||||
}
|
||||
}
|
||||
|
@ -230,7 +237,7 @@ pub struct CodegenUnit<'tcx> {
|
|||
/// contain something unique to this crate (e.g., a module path)
|
||||
/// as well as the crate name and disambiguator.
|
||||
name: Symbol,
|
||||
items: FxHashMap<MonoItem<'tcx>, (Linkage, Visibility)>,
|
||||
items: FxHashMap<MonoItem<'tcx>, MonoItemData>,
|
||||
size_estimate: usize,
|
||||
primary: bool,
|
||||
/// True if this is CGU is used to hold code coverage information for dead code,
|
||||
|
@ -238,6 +245,14 @@ pub struct CodegenUnit<'tcx> {
|
|||
is_code_coverage_dead_code_cgu: bool,
|
||||
}
|
||||
|
||||
/// Auxiliary info about a `MonoItem`.
|
||||
#[derive(Copy, Clone, PartialEq, Debug, HashStable)]
|
||||
pub struct MonoItemData {
|
||||
pub linkage: Linkage,
|
||||
pub visibility: Visibility,
|
||||
pub size_estimate: usize,
|
||||
}
|
||||
|
||||
/// Specifies the linkage type for a `MonoItem`.
|
||||
///
|
||||
/// See <https://llvm.org/docs/LangRef.html#linkage-types> for more details about these variants.
|
||||
|
@ -292,12 +307,12 @@ impl<'tcx> CodegenUnit<'tcx> {
|
|||
}
|
||||
|
||||
/// The order of these items is non-determinstic.
|
||||
pub fn items(&self) -> &FxHashMap<MonoItem<'tcx>, (Linkage, Visibility)> {
|
||||
pub fn items(&self) -> &FxHashMap<MonoItem<'tcx>, MonoItemData> {
|
||||
&self.items
|
||||
}
|
||||
|
||||
/// The order of these items is non-determinstic.
|
||||
pub fn items_mut(&mut self) -> &mut FxHashMap<MonoItem<'tcx>, (Linkage, Visibility)> {
|
||||
pub fn items_mut(&mut self) -> &mut FxHashMap<MonoItem<'tcx>, MonoItemData> {
|
||||
&mut self.items
|
||||
}
|
||||
|
||||
|
@ -320,16 +335,16 @@ impl<'tcx> CodegenUnit<'tcx> {
|
|||
base_n::encode(hash, base_n::CASE_INSENSITIVE)
|
||||
}
|
||||
|
||||
pub fn compute_size_estimate(&mut self, tcx: TyCtxt<'tcx>) {
|
||||
// Estimate the size of a codegen unit as (approximately) the number of MIR
|
||||
// statements it corresponds to.
|
||||
self.size_estimate = self.items.keys().map(|mi| mi.size_estimate(tcx)).sum();
|
||||
pub fn compute_size_estimate(&mut self) {
|
||||
// The size of a codegen unit as the sum of the sizes of the items
|
||||
// within it.
|
||||
self.size_estimate = self.items.values().map(|data| data.size_estimate).sum();
|
||||
}
|
||||
|
||||
#[inline]
|
||||
/// Should only be called if [`compute_size_estimate`] has previously been called.
|
||||
///
|
||||
/// [`compute_size_estimate`]: Self::compute_size_estimate
|
||||
#[inline]
|
||||
pub fn size_estimate(&self) -> usize {
|
||||
// Items are never zero-sized, so if we have items the estimate must be
|
||||
// non-zero, unless we forgot to call `compute_size_estimate` first.
|
||||
|
@ -355,7 +370,7 @@ impl<'tcx> CodegenUnit<'tcx> {
|
|||
pub fn items_in_deterministic_order(
|
||||
&self,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
) -> Vec<(MonoItem<'tcx>, (Linkage, Visibility))> {
|
||||
) -> Vec<(MonoItem<'tcx>, MonoItemData)> {
|
||||
// The codegen tests rely on items being process in the same order as
|
||||
// they appear in the file, so for local items, we sort by node_id first
|
||||
#[derive(PartialEq, Eq, PartialOrd, Ord)]
|
||||
|
@ -390,7 +405,7 @@ impl<'tcx> CodegenUnit<'tcx> {
|
|||
)
|
||||
}
|
||||
|
||||
let mut items: Vec<_> = self.items().iter().map(|(&i, &l)| (i, l)).collect();
|
||||
let mut items: Vec<_> = self.items().iter().map(|(&i, &data)| (i, data)).collect();
|
||||
items.sort_by_cached_key(|&(i, _)| item_sort_key(tcx, i));
|
||||
items
|
||||
}
|
||||
|
|
|
@ -2080,12 +2080,6 @@ rustc_queries! {
|
|||
desc { "looking up supported target features" }
|
||||
}
|
||||
|
||||
/// Get an estimate of the size of an InstanceDef based on its MIR for CGU partitioning.
|
||||
query instance_def_size_estimate(def: ty::InstanceDef<'tcx>)
|
||||
-> usize {
|
||||
desc { |tcx| "estimating size for `{}`", tcx.def_path_str(def.def_id()) }
|
||||
}
|
||||
|
||||
query features_query(_: ()) -> &'tcx rustc_feature::Features {
|
||||
feedable
|
||||
desc { "looking up enabled feature gates" }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue