From 9bfbbd2a786b7d69908f25e5d1f4170316f38726 Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Sat, 25 May 2019 10:59:05 -0400 Subject: [PATCH] Add additional trace statements to the const propagator This makes it easier to figure out when const propagation fails. --- src/librustc_mir/transform/const_prop.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/librustc_mir/transform/const_prop.rs b/src/librustc_mir/transform/const_prop.rs index 8f3dd72c4f245..718cb5ce527ec 100644 --- a/src/librustc_mir/transform/const_prop.rs +++ b/src/librustc_mir/transform/const_prop.rs @@ -295,6 +295,7 @@ impl<'a, 'mir, 'tcx> ConstPropagator<'a, 'mir, 'tcx> { } fn eval_place(&mut self, place: &Place<'tcx>, source_info: SourceInfo) -> Option> { + trace!("eval_place(place={:?})", place); match *place { Place::Base(PlaceBase::Local(loc)) => self.places[loc].clone(), Place::Projection(ref proj) => match proj.elem { @@ -515,6 +516,7 @@ impl<'a, 'mir, 'tcx> ConstPropagator<'a, 'mir, 'tcx> { } fn replace_with_const(&self, rval: &mut Rvalue<'tcx>, value: Const<'tcx>, span: Span) { + trace!("attepting to replace {:?} with {:?}", rval, value); self.ecx.validate_operand( value, vec![], @@ -578,6 +580,10 @@ impl CanConstProp { // FIXME(oli-obk): lint variables until they are used in a condition // FIXME(oli-obk): lint if return value is constant *val = mir.local_kind(local) == LocalKind::Temp; + + if !*val { + trace!("local {:?} can't be propagated because it's not a temporary", local); + } } cpv.visit_mir(mir); cpv.can_const_prop @@ -597,6 +603,7 @@ impl<'tcx> Visitor<'tcx> for CanConstProp { // FIXME(oli-obk): we could be more powerful here, if the multiple writes // only occur in independent execution paths MutatingUse(MutatingUseContext::Store) => if self.found_assignment[local] { + trace!("local {:?} can't be propagated because of multiple assignments", local); self.can_const_prop[local] = false; } else { self.found_assignment[local] = true @@ -608,7 +615,10 @@ impl<'tcx> Visitor<'tcx> for CanConstProp { NonMutatingUse(NonMutatingUseContext::Projection) | MutatingUse(MutatingUseContext::Projection) | NonUse(_) => {}, - _ => self.can_const_prop[local] = false, + _ => { + trace!("local {:?} can't be propagaged because it's used: {:?}", local, context); + self.can_const_prop[local] = false; + }, } } }