diff options
| author | Camille GILLOT <gillot.camille@gmail.com> | 2023-04-25 19:25:28 +0000 |
|---|---|---|
| committer | Camille GILLOT <gillot.camille@gmail.com> | 2023-05-07 11:10:52 +0000 |
| commit | a8988519d508cf89b96d18aaa9ace4e0bcd67621 (patch) | |
| tree | ff854719143e8c62e93848e9de4c004bb910b661 /compiler/rustc_mir_transform/src | |
| parent | 8cc75b56a67ab33407b43faa0efc0f6483ff5664 (diff) | |
| download | rust-a8988519d508cf89b96d18aaa9ace4e0bcd67621.tar.gz rust-a8988519d508cf89b96d18aaa9ace4e0bcd67621.zip | |
Propagate PlaceElem::Index.
Diffstat (limited to 'compiler/rustc_mir_transform/src')
| -rw-r--r-- | compiler/rustc_mir_transform/src/const_prop.rs | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/compiler/rustc_mir_transform/src/const_prop.rs b/compiler/rustc_mir_transform/src/const_prop.rs index 7f995c69a48..a5d18fff89b 100644 --- a/compiler/rustc_mir_transform/src/const_prop.rs +++ b/compiler/rustc_mir_transform/src/const_prop.rs @@ -806,6 +806,24 @@ impl<'tcx> MutVisitor<'tcx> for ConstPropagator<'_, 'tcx> { } } + fn process_projection_elem( + &mut self, + elem: PlaceElem<'tcx>, + _: Location, + ) -> Option<PlaceElem<'tcx>> { + if let PlaceElem::Index(local) = elem + && let Some(value) = self.get_const(local.into()) + && self.should_const_prop(&value) + && let interpret::Operand::Immediate(interpret::Immediate::Scalar(scalar)) = *value + && let Ok(offset) = scalar.to_target_usize(&self.tcx) + && let Some(min_length) = offset.checked_add(1) + { + Some(PlaceElem::ConstantIndex { offset, min_length, from_end: false }) + } else { + None + } + } + fn visit_assign( &mut self, place: &mut Place<'tcx>, |
