don't collect #[rustc_force_inline]
in eager mode
This commit is contained in:
parent
dbec6bedf4
commit
3169a4493f
4 changed files with 65 additions and 4 deletions
|
@ -225,8 +225,8 @@ use rustc_middle::ty::adjustment::{CustomCoerceUnsized, PointerCoercion};
|
||||||
use rustc_middle::ty::layout::ValidityRequirement;
|
use rustc_middle::ty::layout::ValidityRequirement;
|
||||||
use rustc_middle::ty::print::{shrunk_instance_name, with_no_trimmed_paths};
|
use rustc_middle::ty::print::{shrunk_instance_name, with_no_trimmed_paths};
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self, GenericArgs, GenericParamDefKind, Instance, InstanceKind, Ty, TyCtxt, TypeFoldable,
|
self, GenericArgs, GenericParamDefKind, Instance, InstanceKind, Interner, Ty, TyCtxt,
|
||||||
TypeVisitableExt, VtblEntry,
|
TypeFoldable, TypeVisitableExt, VtblEntry,
|
||||||
};
|
};
|
||||||
use rustc_middle::util::Providers;
|
use rustc_middle::util::Providers;
|
||||||
use rustc_middle::{bug, span_bug};
|
use rustc_middle::{bug, span_bug};
|
||||||
|
@ -965,7 +965,7 @@ fn should_codegen_locally<'tcx>(tcx: TyCtxtAt<'tcx>, instance: Instance<'tcx>) -
|
||||||
{
|
{
|
||||||
// `#[rustc_force_inline]` items should never be codegened. This should be caught by
|
// `#[rustc_force_inline]` items should never be codegened. This should be caught by
|
||||||
// the MIR validator.
|
// the MIR validator.
|
||||||
return false;
|
tcx.delay_bug("attempt to codegen `#[rustc_force_inline]` item");
|
||||||
}
|
}
|
||||||
|
|
||||||
if def_id.is_local() {
|
if def_id.is_local() {
|
||||||
|
@ -1462,7 +1462,9 @@ impl<'v> RootCollector<'_, 'v> {
|
||||||
fn is_root(&self, def_id: LocalDefId) -> bool {
|
fn is_root(&self, def_id: LocalDefId) -> bool {
|
||||||
!self.tcx.generics_of(def_id).requires_monomorphization(self.tcx)
|
!self.tcx.generics_of(def_id).requires_monomorphization(self.tcx)
|
||||||
&& match self.strategy {
|
&& match self.strategy {
|
||||||
MonoItemCollectionStrategy::Eager => true,
|
MonoItemCollectionStrategy::Eager => {
|
||||||
|
!matches!(self.tcx.codegen_fn_attrs(def_id).inline, InlineAttr::Force { .. })
|
||||||
|
}
|
||||||
MonoItemCollectionStrategy::Lazy => {
|
MonoItemCollectionStrategy::Lazy => {
|
||||||
self.entry_fn.and_then(|(id, _)| id.as_local()) == Some(def_id)
|
self.entry_fn.and_then(|(id, _)| id.as_local()) == Some(def_id)
|
||||||
|| self.tcx.is_reachable_non_generic(def_id)
|
|| self.tcx.is_reachable_non_generic(def_id)
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
- // MIR for `caller` before ForceInline
|
||||||
|
+ // MIR for `caller` after ForceInline
|
||||||
|
|
||||||
|
fn caller() -> () {
|
||||||
|
let mut _0: ();
|
||||||
|
let _1: ();
|
||||||
|
+ scope 1 (inlined callee_forced) {
|
||||||
|
+ }
|
||||||
|
|
||||||
|
bb0: {
|
||||||
|
StorageLive(_1);
|
||||||
|
- _1 = callee_forced() -> [return: bb1, unwind unreachable];
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- bb1: {
|
||||||
|
StorageDead(_1);
|
||||||
|
_0 = const ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
- // MIR for `caller` before ForceInline
|
||||||
|
+ // MIR for `caller` after ForceInline
|
||||||
|
|
||||||
|
fn caller() -> () {
|
||||||
|
let mut _0: ();
|
||||||
|
let _1: ();
|
||||||
|
+ scope 1 (inlined callee_forced) {
|
||||||
|
+ }
|
||||||
|
|
||||||
|
bb0: {
|
||||||
|
StorageLive(_1);
|
||||||
|
- _1 = callee_forced() -> [return: bb1, unwind continue];
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- bb1: {
|
||||||
|
StorageDead(_1);
|
||||||
|
_0 = const ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
17
tests/mir-opt/inline/forced_dead_code.rs
Normal file
17
tests/mir-opt/inline/forced_dead_code.rs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
|
||||||
|
//@ compile-flags: -Copt-level=0 -Clink-dead-code
|
||||||
|
#![feature(rustc_attrs)]
|
||||||
|
|
||||||
|
#[rustc_force_inline]
|
||||||
|
pub fn callee_forced() {}
|
||||||
|
|
||||||
|
// EMIT_MIR forced_dead_code.caller.ForceInline.diff
|
||||||
|
pub fn caller() {
|
||||||
|
callee_forced();
|
||||||
|
// CHECK-LABEL: fn caller(
|
||||||
|
// CHECK: (inlined callee_forced)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
caller();
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue