Skip to content

Commit

Permalink
Implement ConstantIndex handling and use that instead using our own P…
Browse files Browse the repository at this point in the history
…rojectionElem variant
  • Loading branch information
oli-obk committed Jan 15, 2024
1 parent 7ad6b33 commit b31ab07
Showing 1 changed file with 15 additions and 26 deletions.
41 changes: 15 additions & 26 deletions compiler/rustc_mir_transform/src/const_prop_lint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,19 +101,19 @@ impl<'tcx> From<ImmTy<'tcx>> for Value<'tcx> {
}

impl<'tcx> Value<'tcx> {
fn project(
&self,
proj: impl Iterator<Item = Option<ProjectionElem<FieldIdx, Ty<'tcx>>>>,
) -> Option<&Value<'tcx>> {
fn project(&self, proj: impl Iterator<Item = Option<PlaceElem<'tcx>>>) -> Option<&Value<'tcx>> {
let mut this = self;
for proj in proj {
this = match (proj?, this) {
(ProjectionElem::Field(idx, _), Value::Aggregate { fields, .. }) => {
fields.get(idx).unwrap_or(&Value::Uninit)
}
(ProjectionElem::Index(idx), Value::Aggregate { fields, .. }) => {
fields.get(idx).unwrap_or(&Value::Uninit)
}
(
ProjectionElem::ConstantIndex { offset, min_length: 1, from_end: false },
Value::Aggregate { fields, .. },
) => fields
.get(FieldIdx::from_u32(offset.try_into().ok()?))
.unwrap_or(&Value::Uninit),
_ => return None,
};
}
Expand Down Expand Up @@ -205,7 +205,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {

fn get_const(&self, place: Place<'tcx>) -> Option<&Value<'tcx>> {
self.locals[place.local]
.project(place.projection.iter().map(|proj| self.simple_projection(proj)))
.project(place.projection.iter().map(|proj| self.try_eval_index_offset(proj)))
}

/// Remove `local` from the pool of `Locals`. Allows writing to them,
Expand Down Expand Up @@ -719,29 +719,18 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
Some(())
}

fn simple_projection(
&self,
proj: ProjectionElem<Local, Ty<'tcx>>,
) -> Option<ProjectionElem<FieldIdx, Ty<'tcx>>> {
fn try_eval_index_offset(&self, proj: PlaceElem<'tcx>) -> Option<PlaceElem<'tcx>> {
Some(match proj {
ProjectionElem::Deref => ProjectionElem::Deref,
ProjectionElem::Field(idx, ty) => ProjectionElem::Field(idx, ty),
ProjectionElem::Index(local) => {
let val = self.get_const(local.into())?;
let op = val.immediate()?;
ProjectionElem::Index(FieldIdx::from_u32(
self.ecx.read_target_usize(op).ok()?.try_into().ok()?,
))
}
ProjectionElem::ConstantIndex { offset, min_length, from_end } => {
ProjectionElem::ConstantIndex { offset, min_length, from_end }
}
ProjectionElem::Subslice { from, to, from_end } => {
ProjectionElem::Subslice { from, to, from_end }
ProjectionElem::ConstantIndex {
offset: self.ecx.read_target_usize(op).ok()?,
min_length: 1,
from_end: false,
}
}
ProjectionElem::Downcast(a, b) => ProjectionElem::Downcast(a, b),
ProjectionElem::OpaqueCast(ty) => ProjectionElem::OpaqueCast(ty),
ProjectionElem::Subtype(ty) => ProjectionElem::Subtype(ty),
other => other,
})
}
}
Expand Down

0 comments on commit b31ab07

Please sign in to comment.