File tree 3 files changed +20
-12
lines changed
3 files changed +20
-12
lines changed Original file line number Diff line number Diff line change @@ -57,7 +57,7 @@ impl Reg {
57
57
128 => dl. f128_align . abi ,
58
58
_ => panic ! ( "unsupported float: {self:?}" ) ,
59
59
} ,
60
- RegKind :: Vector => dl. vector_align ( self . size ) . abi ,
60
+ RegKind :: Vector => dl. llvmlike_vector_align ( self . size ) . abi ,
61
61
}
62
62
}
63
63
}
Original file line number Diff line number Diff line change @@ -408,16 +408,21 @@ impl TargetDataLayout {
408
408
}
409
409
}
410
410
411
+ /// psABI-mandated alignment for a vector type, if any
411
412
#[ 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
+ ) )
421
426
}
422
427
}
423
428
Original file line number Diff line number Diff line change @@ -535,11 +535,14 @@ fn layout_of_uncached<'tcx>(
535
535
BackendRepr :: Memory { sized : true } ,
536
536
AbiAndPrefAlign {
537
537
abi : Align :: max_aligned_factor ( size) ,
538
- pref : dl. vector_align ( size) . pref ,
538
+ pref : dl. llvmlike_vector_align ( size) . pref ,
539
539
} ,
540
540
)
541
541
} 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
+ )
543
546
} ;
544
547
let size = size. align_to ( align. abi ) ;
545
548
You can’t perform that action at this time.
0 commit comments