diff options
| author | Camille GILLOT <gillot.camille@gmail.com> | 2023-09-23 14:55:28 +0000 |
|---|---|---|
| committer | Camille GILLOT <gillot.camille@gmail.com> | 2023-10-25 06:46:47 +0000 |
| commit | db9bd9bd8c42aa06d5d822a1f04bc2007601ca43 (patch) | |
| tree | fc6094266abe3ab3ccdcbd3dedaec4183ad84bab /compiler/rustc_mir_transform/src | |
| parent | 38c86b079866d495062632483ec33cf569cb6f27 (diff) | |
| download | rust-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.rs | 42 |
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) => { |
