Preserve DebugInfo in DeadStoreElimination.
This commit is contained in:
parent
1bc0463b18
commit
27d6a57e58
30 changed files with 773 additions and 807 deletions
|
@ -13,10 +13,10 @@
|
|||
//!
|
||||
|
||||
use crate::util::is_within_packed;
|
||||
use rustc_index::bit_set::BitSet;
|
||||
use rustc_middle::mir::visit::Visitor;
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_mir_dataflow::debuginfo::debuginfo_locals;
|
||||
use rustc_mir_dataflow::impls::{
|
||||
borrowed_locals, LivenessTransferFunction, MaybeTransitiveLiveLocals,
|
||||
};
|
||||
|
@ -26,8 +26,15 @@ use rustc_mir_dataflow::Analysis;
|
|||
///
|
||||
/// The `borrowed` set must be a `BitSet` of all the locals that are ever borrowed in this body. It
|
||||
/// can be generated via the [`borrowed_locals`] function.
|
||||
pub fn eliminate<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>, borrowed: &BitSet<Local>) {
|
||||
let mut live = MaybeTransitiveLiveLocals::new(borrowed)
|
||||
pub fn eliminate<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
let borrowed_locals = borrowed_locals(body);
|
||||
|
||||
// If the user requests complete debuginfo, mark the locals that appear in it as live, so
|
||||
// we don't remove assignements to them.
|
||||
let mut always_live = debuginfo_locals(body);
|
||||
always_live.union(&borrowed_locals);
|
||||
|
||||
let mut live = MaybeTransitiveLiveLocals::new(&always_live)
|
||||
.into_engine(tcx, body)
|
||||
.iterate_to_fixpoint()
|
||||
.into_results_cursor(body);
|
||||
|
@ -48,7 +55,9 @@ pub fn eliminate<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>, borrowed: &BitS
|
|||
for (index, arg) in args.iter().enumerate().rev() {
|
||||
if let Operand::Copy(place) = *arg
|
||||
&& !place.is_indirect()
|
||||
&& !borrowed.contains(place.local)
|
||||
// Do not skip the transformation if the local is in debuginfo, as we do
|
||||
// not really lose any information for this purpose.
|
||||
&& !borrowed_locals.contains(place.local)
|
||||
&& !state.contains(place.local)
|
||||
// If `place` is a projection of a disaligned field in a packed ADT,
|
||||
// the move may be codegened as a pointer to that field.
|
||||
|
@ -75,7 +84,7 @@ pub fn eliminate<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>, borrowed: &BitS
|
|||
StatementKind::Assign(box (place, _))
|
||||
| StatementKind::SetDiscriminant { place: box place, .. }
|
||||
| StatementKind::Deinit(box place) => {
|
||||
if !place.is_indirect() && !borrowed.contains(place.local) {
|
||||
if !place.is_indirect() && !always_live.contains(place.local) {
|
||||
live.seek_before_primary_effect(loc);
|
||||
if !live.get().contains(place.local) {
|
||||
patch.push(loc);
|
||||
|
@ -126,7 +135,6 @@ impl<'tcx> MirPass<'tcx> for DeadStoreElimination {
|
|||
}
|
||||
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
let borrowed = borrowed_locals(body);
|
||||
eliminate(tcx, body, &borrowed);
|
||||
eliminate(tcx, body);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue