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
+ pub 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 @@ -564,11 +564,14 @@ fn layout_of_uncached<'tcx>(
564
564
BackendRepr :: Memory { sized : true } ,
565
565
AbiAndPrefAlign {
566
566
abi : Align :: max_aligned_factor ( size) ,
567
- pref : dl. vector_align ( size) . pref ,
567
+ pref : dl. llvmlike_vector_align ( size) . pref ,
568
568
} ,
569
569
)
570
570
} else {
571
- ( BackendRepr :: Vector { element : e_abi, count : e_len } , dl. vector_align ( size) )
571
+ (
572
+ BackendRepr :: Vector { element : e_abi, count : e_len } ,
573
+ dl. llvmlike_vector_align ( size) ,
574
+ )
572
575
} ;
573
576
let size = size. align_to ( align. abi ) ;
574
577
You can’t perform that action at this time.
0 commit comments