File tree Expand file tree Collapse file tree 3 files changed +20
-12
lines changed Expand file tree Collapse file tree 3 files changed +20
-12
lines changed Original file line number Diff line number Diff 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}
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments