Stop collecting unmentioned constants

This avoids generating useless dead LLVM IR.
This commit is contained in:
Mark Rousskov
2025-06-22 17:51:56 -04:00
parent d4e1159b8c
commit 928564c7bf
2 changed files with 8 additions and 11 deletions
+8 -6
View File
@@ -1481,12 +1481,14 @@ fn process_item(&mut self, id: hir::ItemId) {
// Const items only generate mono items if they are actually used somewhere.
// Just declaring them is insufficient.
// But even just declaring them must collect the items they refer to
// unless their generics require monomorphization.
if !self.tcx.generics_of(id.owner_id).own_requires_monomorphization()
&& let Ok(val) = self.tcx.const_eval_poly(id.owner_id.to_def_id())
{
collect_const_value(self.tcx, val, self.output);
// If we're collecting items eagerly, then recurse into all constants.
// Otherwise the value is only collected when explicitly mentioned in other items.
if self.strategy == MonoItemCollectionStrategy::Eager {
if !self.tcx.generics_of(id.owner_id).own_requires_monomorphization()
&& let Ok(val) = self.tcx.const_eval_poly(id.owner_id.to_def_id())
{
collect_const_value(self.tcx, val, self.output);
}
}
}
DefKind::Impl { .. } => {
@@ -35,7 +35,6 @@ fn do_something_else(&self, x: T) -> T {
}
}
//~ MONO_ITEM fn mod1::id::<i64> @@ vtable_through_const-mod1.volatile[Internal]
fn id<T>(x: T) -> T {
x
}
@@ -50,8 +49,6 @@ fn do_something(&self) {}
fn do_something_else(&self) {}
}
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait2>::do_something @@ vtable_through_const-mod1.volatile[External]
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait2>::do_something_else @@ vtable_through_const-mod1.volatile[External]
impl Trait2 for NeedsDrop {}
pub trait Trait2Gen<T> {
@@ -93,8 +90,6 @@ pub fn main() {
// Same as above
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait1Gen<u8>>::do_something @@ vtable_through_const-mod1.volatile[External]
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait1Gen<u8>>::do_something_else @@ vtable_through_const-mod1.volatile[External]
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait2Gen<u8>>::do_something @@ vtable_through_const-mod1.volatile[External]
//~ MONO_ITEM fn <mod1::NeedsDrop as mod1::Trait2Gen<u8>>::do_something_else @@ vtable_through_const-mod1.volatile[External]
mod1::TRAIT1_GEN_REF.do_something(0u8);
//~ MONO_ITEM fn mod1::id::<char> @@ vtable_through_const-mod1.volatile[External]