From 0c2525b29d1f82c815d8ba1b7ec3c0a1564e93cf Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sun, 8 Oct 2023 10:03:56 +0000 Subject: [PATCH] Also address in debuginfo. --- compiler/rustc_mir_transform/src/gvn.rs | 55 ++++++++++++++++++------- 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/compiler/rustc_mir_transform/src/gvn.rs b/compiler/rustc_mir_transform/src/gvn.rs index 12010d4d25c79..eab87f8f18260 100644 --- a/compiler/rustc_mir_transform/src/gvn.rs +++ b/compiler/rustc_mir_transform/src/gvn.rs @@ -1327,25 +1327,48 @@ impl<'tcx> VnState<'_, 'tcx> { return None; } - let Value::Projection(base, elem) = *self.get(value) else { - break; - }; - - let elem = match elem { - ProjectionElem::Deref => ProjectionElem::Deref, - ProjectionElem::Downcast(name, read_variant) => { - ProjectionElem::Downcast(name, read_variant) + match *self.get(value) { + Value::Projection(base, elem) => { + let elem = match elem { + ProjectionElem::Deref => ProjectionElem::Deref, + ProjectionElem::Downcast(name, read_variant) => { + ProjectionElem::Downcast(name, read_variant) + } + ProjectionElem::Field(f, ty) => ProjectionElem::Field(f, ty), + ProjectionElem::ConstantIndex { + offset, + min_length, + from_end: false, + } => ProjectionElem::ConstantIndex { + offset, + min_length, + from_end: false, + }, + // Not allowed in debuginfo. + _ => return None, + }; + projections.push(elem); + value = base; } - ProjectionElem::Field(f, ty) => ProjectionElem::Field(f, ty), - ProjectionElem::ConstantIndex { offset, min_length, from_end: false } => { - ProjectionElem::ConstantIndex { offset, min_length, from_end: false } + Value::Address { place: target, kind: _, provenance: _ } + if projections.is_empty() + && target.projection.iter().all(|e| e.can_use_in_debuginfo()) => + { + var_debug_info + .composite + .get_or_insert_with(|| { + Box::new(VarDebugInfoFragment { + ty: self.local_decls[place.local].ty, + projection: Vec::new(), + }) + }) + .projection + .push(PlaceElem::Deref); + *place = target; + break; } - // Not allowed in debuginfo. _ => return None, - }; - - projections.push(elem); - value = base; + } } return None;