We don't need NonNull::as_ptr
debuginfo
Stop pessimizing the use of local variables in core by skipping debug info for MIR temporaries in tiny (single-BB) functions. For functions as simple as this -- `Pin::new`, etc -- nobody every actually wants debuginfo for them in the first place. They're more like intrinsics than real functions, and stepping over them is good.
This commit is contained in:
parent
96e51d9482
commit
a7fc76a3ab
11 changed files with 174 additions and 110 deletions
|
@ -189,6 +189,7 @@ declare_passes! {
|
|||
mod simplify_comparison_integral : SimplifyComparisonIntegral;
|
||||
mod single_use_consts : SingleUseConsts;
|
||||
mod sroa : ScalarReplacementOfAggregates;
|
||||
mod strip_debuginfo : StripDebugInfo;
|
||||
mod unreachable_enum_branching : UnreachableEnumBranching;
|
||||
mod unreachable_prop : UnreachablePropagation;
|
||||
mod validate : Validator;
|
||||
|
@ -699,6 +700,8 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
|||
&o1(simplify_branches::SimplifyConstCondition::Final),
|
||||
&o1(remove_noop_landing_pads::RemoveNoopLandingPads),
|
||||
&o1(simplify::SimplifyCfg::Final),
|
||||
// After the last SimplifyCfg, because this wants one-block functions.
|
||||
&strip_debuginfo::StripDebugInfo,
|
||||
©_prop::CopyProp,
|
||||
&dead_store_elimination::DeadStoreElimination::Final,
|
||||
&nrvo::RenameReturnPlace,
|
||||
|
|
34
compiler/rustc_mir_transform/src/strip_debuginfo.rs
Normal file
34
compiler/rustc_mir_transform/src/strip_debuginfo.rs
Normal file
|
@ -0,0 +1,34 @@
|
|||
use rustc_middle::mir::*;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_session::config::MirStripDebugInfo;
|
||||
|
||||
/// Conditionally remove some of the VarDebugInfo in MIR.
|
||||
///
|
||||
/// In particular, stripping non-parameter debug info for tiny, primitive-like
|
||||
/// methods in core saves work later, and nobody ever wanted to use it anyway.
|
||||
pub(super) struct StripDebugInfo;
|
||||
|
||||
impl<'tcx> crate::MirPass<'tcx> for StripDebugInfo {
|
||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||
sess.opts.unstable_opts.mir_strip_debuginfo != MirStripDebugInfo::None
|
||||
}
|
||||
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
match tcx.sess.opts.unstable_opts.mir_strip_debuginfo {
|
||||
MirStripDebugInfo::None => return,
|
||||
MirStripDebugInfo::AllLocals => {}
|
||||
MirStripDebugInfo::LocalsInTinyFunctions
|
||||
if let TerminatorKind::Return { .. } =
|
||||
body.basic_blocks[START_BLOCK].terminator().kind => {}
|
||||
MirStripDebugInfo::LocalsInTinyFunctions => return,
|
||||
}
|
||||
|
||||
body.var_debug_info.retain(|vdi| {
|
||||
matches!(
|
||||
vdi.value,
|
||||
VarDebugInfoContents::Place(place)
|
||||
if place.local.as_usize() <= body.arg_count && place.local != RETURN_PLACE,
|
||||
)
|
||||
});
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue