diff options
| author | Oli Scherer <git-spam-no-reply9815368754983@oli-obk.de> | 2023-09-27 11:23:39 +0000 |
|---|---|---|
| committer | Oli Scherer <git-spam-no-reply9815368754983@oli-obk.de> | 2023-09-28 16:13:38 +0000 |
| commit | 2d4201f7c65b223967bb12aed2a790f85e457969 (patch) | |
| tree | 9b25bd9b6f9129ed74415eaf69559bac174a9ba3 | |
| parent | 6ea2db7c2d78182fabf66a8c6ffc856446e1cf81 (diff) | |
| download | rust-2d4201f7c65b223967bb12aed2a790f85e457969.tar.gz rust-2d4201f7c65b223967bb12aed2a790f85e457969.zip | |
Skip reinterning if nothing changed
| -rw-r--r-- | compiler/rustc_codegen_cranelift/src/value_and_place.rs | 8 | ||||
| -rw-r--r-- | compiler/rustc_const_eval/src/interpret/projection.rs | 4 | ||||
| -rw-r--r-- | compiler/rustc_mir_transform/src/reveal_all.rs | 4 |
3 files changed, 7 insertions, 9 deletions
diff --git a/compiler/rustc_codegen_cranelift/src/value_and_place.rs b/compiler/rustc_codegen_cranelift/src/value_and_place.rs index ff95141ce90..d4273c0b593 100644 --- a/compiler/rustc_codegen_cranelift/src/value_and_place.rs +++ b/compiler/rustc_codegen_cranelift/src/value_and_place.rs @@ -674,14 +674,6 @@ impl<'tcx> CPlace<'tcx> { } } - pub(crate) fn place_opaque_cast( - self, - fx: &mut FunctionCx<'_, '_, 'tcx>, - ty: Ty<'tcx>, - ) -> CPlace<'tcx> { - CPlace { inner: self.inner, layout: fx.layout_of(ty) } - } - pub(crate) fn place_field( self, fx: &mut FunctionCx<'_, '_, 'tcx>, diff --git a/compiler/rustc_const_eval/src/interpret/projection.rs b/compiler/rustc_const_eval/src/interpret/projection.rs index ca5e19ac1fa..f462c13816e 100644 --- a/compiler/rustc_const_eval/src/interpret/projection.rs +++ b/compiler/rustc_const_eval/src/interpret/projection.rs @@ -316,7 +316,9 @@ where { use rustc_middle::mir::ProjectionElem::*; Ok(match proj_elem { - OpaqueCast(ty) => bug!("OpaqueCast({ty}) encountered after borrowck"), + OpaqueCast(ty) => { + span_bug!(self.cur_span(), "OpaqueCast({ty}) encountered after borrowck") + } Field(field, _) => self.project_field(base, field.index())?, Downcast(_, variant) => self.project_downcast(base, variant)?, Deref => self.deref_pointer(&base.to_op(self)?)?.into(), diff --git a/compiler/rustc_mir_transform/src/reveal_all.rs b/compiler/rustc_mir_transform/src/reveal_all.rs index 6cc0d383119..55f1eac6f84 100644 --- a/compiler/rustc_mir_transform/src/reveal_all.rs +++ b/compiler/rustc_mir_transform/src/reveal_all.rs @@ -32,6 +32,10 @@ impl<'tcx> MutVisitor<'tcx> for RevealAllVisitor<'tcx> { _context: PlaceContext, _location: Location, ) { + // Performance optimization: don't reintern if there is no `OpaqueCast` to remove. + if place.projection.iter().all(|elem| !matches!(elem, ProjectionElem::OpaqueCast(_))) { + return; + } // `OpaqueCast` projections are only needed if there are opaque types on which projections are performed. // After the `RevealAll` pass, all opaque types are replaced with their hidden types, so we don't need these // projections anymore. |
