mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
Stop collecting unmentioned constants
This avoids generating useless dead LLVM IR.
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user