diff options
| author | bors <bors@rust-lang.org> | 2023-12-11 08:07:20 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-12-11 08:07:20 +0000 |
| commit | 8b1ba11cb1176cd7b8a0f4b55d1c97ee9fd3662d (patch) | |
| tree | bcf864ae9145c72eaed1c0f3f62cd79b3219a584 /compiler/rustc_ty_utils/src | |
| parent | c13187c9983a58f689531002e696ec206450b338 (diff) | |
| parent | aa00baeba410141d579d1cd32a8f4afa45bd28e9 (diff) | |
| download | rust-8b1ba11cb1176cd7b8a0f4b55d1c97ee9fd3662d.tar.gz rust-8b1ba11cb1176cd7b8a0f4b55d1c97ee9fd3662d.zip | |
Auto merge of #117116 - calebzulawski:repr-simd-packed, r=workingjubilee
Implement repr(packed) for repr(simd) This allows creating vectors with non-power-of-2 lengths that do not have padding. See rust-lang/portable-simd#319
Diffstat (limited to 'compiler/rustc_ty_utils/src')
| -rw-r--r-- | compiler/rustc_ty_utils/src/layout.rs | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/compiler/rustc_ty_utils/src/layout.rs b/compiler/rustc_ty_utils/src/layout.rs index f30c40de698..d896873fadd 100644 --- a/compiler/rustc_ty_utils/src/layout.rs +++ b/compiler/rustc_ty_utils/src/layout.rs @@ -433,7 +433,21 @@ fn layout_of_uncached<'tcx>( .size .checked_mul(e_len, dl) .ok_or_else(|| error(cx, LayoutError::SizeOverflow(ty)))?; - let align = dl.vector_align(size); + + let (abi, align) = if def.repr().packed() && !e_len.is_power_of_two() { + // Non-power-of-two vectors have padding up to the next power-of-two. + // If we're a packed repr, remove the padding while keeping the alignment as close + // to a vector as possible. + ( + Abi::Aggregate { sized: true }, + AbiAndPrefAlign { + abi: Align::max_for_offset(size), + pref: dl.vector_align(size).pref, + }, + ) + } else { + (Abi::Vector { element: e_abi, count: e_len }, dl.vector_align(size)) + }; let size = size.align_to(align.abi); // Compute the placement of the vector fields: @@ -446,7 +460,7 @@ fn layout_of_uncached<'tcx>( tcx.mk_layout(LayoutS { variants: Variants::Single { index: FIRST_VARIANT }, fields, - abi: Abi::Vector { element: e_abi, count: e_len }, + abi, largest_niche: e_ly.largest_niche, size, align, |
