Skip to content

Commit 79f41c7

Browse files
compiler: split vector_align into cabi and llvmlike
Introduce a pair of functions that actually describe what they do, because it wasn't clear the alignment is sometimes a forgery.
1 parent 5c474fd commit 79f41c7

File tree

3 files changed

+20
-12
lines changed

3 files changed

+20
-12
lines changed

Diff for: compiler/rustc_abi/src/callconv/reg.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ impl Reg {
5757
128 => dl.f128_align.abi,
5858
_ => panic!("unsupported float: {self:?}"),
5959
},
60-
RegKind::Vector => dl.vector_align(self.size).abi,
60+
RegKind::Vector => dl.llvmlike_vector_align(self.size).abi,
6161
}
6262
}
6363
}

Diff for: compiler/rustc_abi/src/lib.rs

+14-9
Original file line numberDiff line numberDiff line change
@@ -408,16 +408,21 @@ impl TargetDataLayout {
408408
}
409409
}
410410

411+
/// psABI-mandated alignment for a vector type, if any
411412
#[inline]
412-
pub fn vector_align(&self, vec_size: Size) -> AbiAndPrefAlign {
413-
for &(size, align) in &self.vector_align {
414-
if size == vec_size {
415-
return align;
416-
}
417-
}
418-
// Default to natural alignment, which is what LLVM does.
419-
// That is, use the size, rounded up to a power of 2.
420-
AbiAndPrefAlign::new(Align::from_bytes(vec_size.bytes().next_power_of_two()).unwrap())
413+
fn cabi_vector_align(&self, vec_size: Size) -> Option<AbiAndPrefAlign> {
414+
self.vector_align
415+
.iter()
416+
.find(|(size, _align)| *size == vec_size)
417+
.map(|(_size, align)| *align)
418+
}
419+
420+
/// an alignment resembling the one LLVM would pick for a vector
421+
#[inline]
422+
pub fn llvmlike_vector_align(&self, vec_size: Size) -> AbiAndPrefAlign {
423+
self.cabi_vector_align(vec_size).unwrap_or(AbiAndPrefAlign::new(
424+
Align::from_bytes(vec_size.bytes().next_power_of_two()).unwrap(),
425+
))
421426
}
422427
}
423428

Diff for: compiler/rustc_ty_utils/src/layout.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -535,11 +535,14 @@ fn layout_of_uncached<'tcx>(
535535
BackendRepr::Memory { sized: true },
536536
AbiAndPrefAlign {
537537
abi: Align::max_aligned_factor(size),
538-
pref: dl.vector_align(size).pref,
538+
pref: dl.llvmlike_vector_align(size).pref,
539539
},
540540
)
541541
} else {
542-
(BackendRepr::Vector { element: e_abi, count: e_len }, dl.vector_align(size))
542+
(
543+
BackendRepr::Vector { element: e_abi, count: e_len },
544+
dl.llvmlike_vector_align(size),
545+
)
543546
};
544547
let size = size.align_to(align.abi);
545548

0 commit comments

Comments
 (0)