Skip to content

Commit 6bbf7b8

Browse files
authored
Rollup merge of #61641 - spastorino:revert-to-recursion-on-local-analyzer, r=oli-obk
Revert "Make LocalAnalizer visitor iterate instead of recurse" This reverts commit 0cfaa28. r? @oli-obk
2 parents 5327eae + 4c32617 commit 6bbf7b8

File tree

1 file changed

+37
-48
lines changed

1 file changed

+37
-48
lines changed

src/librustc_codegen_ssa/mir/analyze.rs

+37-48
Original file line numberDiff line numberDiff line change
@@ -154,62 +154,51 @@ impl<'mir, 'a: 'mir, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>> Visitor<'tcx>
154154
context: PlaceContext,
155155
location: Location) {
156156
debug!("visit_place(place={:?}, context={:?})", place, context);
157-
let mut context = context;
158157
let cx = self.fx.cx;
159158

160-
place.iterate(|place_base, place_projections| {
161-
for proj in place_projections {
162-
// Allow uses of projections that are ZSTs or from scalar fields.
163-
let is_consume = match context {
164-
PlaceContext::NonMutatingUse(NonMutatingUseContext::Copy) |
165-
PlaceContext::NonMutatingUse(NonMutatingUseContext::Move) => true,
166-
_ => false
167-
};
168-
if is_consume {
169-
let base_ty = proj.base.ty(self.fx.mir, cx.tcx());
170-
let base_ty = self.fx.monomorphize(&base_ty);
171-
172-
// ZSTs don't require any actual memory access.
173-
let elem_ty = base_ty
174-
.projection_ty(cx.tcx(), &proj.elem)
175-
.ty;
176-
let elem_ty = self.fx.monomorphize(&elem_ty);
177-
if cx.layout_of(elem_ty).is_zst() {
178-
return;
179-
}
180-
181-
if let mir::ProjectionElem::Field(..) = proj.elem {
182-
let layout = cx.layout_of(base_ty.ty);
183-
if cx.is_backend_immediate(layout) || cx.is_backend_scalar_pair(layout) {
184-
// Recurse with the same context, instead of `Projection`,
185-
// potentially stopping at non-operand projections,
186-
// which would trigger `not_ssa` on locals.
187-
continue;
188-
}
189-
}
159+
if let mir::Place::Projection(ref proj) = *place {
160+
// Allow uses of projections that are ZSTs or from scalar fields.
161+
let is_consume = match context {
162+
PlaceContext::NonMutatingUse(NonMutatingUseContext::Copy) |
163+
PlaceContext::NonMutatingUse(NonMutatingUseContext::Move) => true,
164+
_ => false
165+
};
166+
if is_consume {
167+
let base_ty = proj.base.ty(self.fx.mir, cx.tcx());
168+
let base_ty = self.fx.monomorphize(&base_ty);
169+
170+
// ZSTs don't require any actual memory access.
171+
let elem_ty = base_ty
172+
.projection_ty(cx.tcx(), &proj.elem)
173+
.ty;
174+
let elem_ty = self.fx.monomorphize(&elem_ty);
175+
if cx.layout_of(elem_ty).is_zst() {
176+
return;
190177
}
191178

192-
// A deref projection only reads the pointer, never needs the place.
193-
if let mir::ProjectionElem::Deref = proj.elem {
194-
return self.visit_place(
195-
&proj.base,
196-
PlaceContext::NonMutatingUse(NonMutatingUseContext::Copy),
197-
location
198-
);
179+
if let mir::ProjectionElem::Field(..) = proj.elem {
180+
let layout = cx.layout_of(base_ty.ty);
181+
if cx.is_backend_immediate(layout) || cx.is_backend_scalar_pair(layout) {
182+
// Recurse with the same context, instead of `Projection`,
183+
// potentially stopping at non-operand projections,
184+
// which would trigger `not_ssa` on locals.
185+
self.visit_place(&proj.base, context, location);
186+
return;
187+
}
199188
}
200-
201-
context = if context.is_mutating_use() {
202-
PlaceContext::MutatingUse(MutatingUseContext::Projection)
203-
} else {
204-
PlaceContext::NonMutatingUse(NonMutatingUseContext::Projection)
205-
};
206189
}
207190

208-
// Default base visit behavior
209-
if let mir::PlaceBase::Local(local) = place_base {
210-
self.visit_local(local, context, location);
191+
// A deref projection only reads the pointer, never needs the place.
192+
if let mir::ProjectionElem::Deref = proj.elem {
193+
return self.visit_place(
194+
&proj.base,
195+
PlaceContext::NonMutatingUse(NonMutatingUseContext::Copy),
196+
location
197+
);
211198
}
212-
});
199+
}
200+
201+
self.super_place(place, context, location);
213202
}
214203

215204
fn visit_local(&mut self,

0 commit comments

Comments
 (0)