about summary refs log tree commit diff
path: root/compiler/rustc_mir_transform/src
diff options
context:
space:
mode:
authorCamille GILLOT <gillot.camille@gmail.com>2023-09-23 14:55:28 +0000
committerCamille GILLOT <gillot.camille@gmail.com>2023-10-25 06:46:47 +0000
commitdb9bd9bd8c42aa06d5d822a1f04bc2007601ca43 (patch)
treefc6094266abe3ab3ccdcbd3dedaec4183ad84bab /compiler/rustc_mir_transform/src
parent38c86b079866d495062632483ec33cf569cb6f27 (diff)
downloadrust-db9bd9bd8c42aa06d5d822a1f04bc2007601ca43.tar.gz
rust-db9bd9bd8c42aa06d5d822a1f04bc2007601ca43.zip
Do not intern too large aggregates.
Diffstat (limited to 'compiler/rustc_mir_transform/src')
-rw-r--r--compiler/rustc_mir_transform/src/gvn.rs42
1 files changed, 24 insertions, 18 deletions
diff --git a/compiler/rustc_mir_transform/src/gvn.rs b/compiler/rustc_mir_transform/src/gvn.rs
index c38ebdf512b..7800aa63729 100644
--- a/compiler/rustc_mir_transform/src/gvn.rs
+++ b/compiler/rustc_mir_transform/src/gvn.rs
@@ -291,24 +291,30 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
                     .collect::<Option<Vec<_>>>()?;
                 let variant = if ty.is_enum() { Some(variant) } else { None };
                 let ty = self.ecx.layout_of(ty).ok()?;
-                let alloc_id = self
-                    .ecx
-                    .intern_with_temp_alloc(ty, |ecx, dest| {
-                        let variant_dest = if let Some(variant) = variant {
-                            ecx.project_downcast(dest, variant)?
-                        } else {
-                            dest.clone()
-                        };
-                        for (field_index, op) in fields.into_iter().enumerate() {
-                            let field_dest = ecx.project_field(&variant_dest, field_index)?;
-                            ecx.copy_op(op, &field_dest, /*allow_transmute*/ false)?;
-                        }
-                        ecx.write_discriminant(variant.unwrap_or(FIRST_VARIANT), dest)
-                    })
-                    .ok()?;
-                let mplace =
-                    self.ecx.raw_const_to_mplace(ConstAlloc { alloc_id, ty: ty.ty }).ok()?;
-                mplace.into()
+                if ty.is_zst() {
+                    ImmTy::uninit(ty).into()
+                } else if matches!(ty.abi, Abi::Scalar(..) | Abi::ScalarPair(..)) {
+                    let alloc_id = self
+                        .ecx
+                        .intern_with_temp_alloc(ty, |ecx, dest| {
+                            let variant_dest = if let Some(variant) = variant {
+                                ecx.project_downcast(dest, variant)?
+                            } else {
+                                dest.clone()
+                            };
+                            for (field_index, op) in fields.into_iter().enumerate() {
+                                let field_dest = ecx.project_field(&variant_dest, field_index)?;
+                                ecx.copy_op(op, &field_dest, /*allow_transmute*/ false)?;
+                            }
+                            ecx.write_discriminant(variant.unwrap_or(FIRST_VARIANT), dest)
+                        })
+                        .ok()?;
+                    let mplace =
+                        self.ecx.raw_const_to_mplace(ConstAlloc { alloc_id, ty: ty.ty }).ok()?;
+                    mplace.into()
+                } else {
+                    return None;
+                }
             }
 
             Projection(base, elem) => {