@@ -772,19 +772,6 @@ fn univariant(
772
772
if optimize {
773
773
let end = if let StructKind :: MaybeUnsized = kind { fields. len ( ) - 1 } else { fields. len ( ) } ;
774
774
let optimizing = & mut inverse_memory_index. raw [ ..end] ;
775
- let effective_field_align = |layout : Layout < ' _ > | {
776
- if let Some ( pack) = pack {
777
- // return the packed alignment in bytes
778
- layout. align ( ) . abi . min ( pack) . bytes ( )
779
- } else {
780
- // returns log2(effective-align).
781
- // This is ok since `pack` applies to all fields equally.
782
- // The calculation assumes that size is an integer multiple of align, except for ZSTs.
783
- //
784
- // group [u8; 4] with align-4 or [u8; 6] with align-2 fields
785
- layout. align ( ) . abi . bytes ( ) . max ( layout. size ( ) . bytes ( ) ) . trailing_zeros ( ) as u64
786
- }
787
- } ;
788
775
789
776
// If `-Z randomize-layout` was enabled for the type definition we can shuffle
790
777
// the field ordering to try and catch some code making assumptions about layouts
@@ -801,6 +788,30 @@ fn univariant(
801
788
}
802
789
// Otherwise we just leave things alone and actually optimize the type's fields
803
790
} else {
791
+ let max_field_align = fields. iter ( ) . map ( |f| f. align ( ) . abi . bytes ( ) ) . max ( ) . unwrap_or ( 1 ) ;
792
+ let any_niche = fields. iter ( ) . any ( |f| f. largest_niche ( ) . is_some ( ) ) ;
793
+ let effective_field_align = |layout : Layout < ' _ > | {
794
+ if let Some ( pack) = pack {
795
+ // return the packed alignment in bytes
796
+ layout. align ( ) . abi . min ( pack) . bytes ( )
797
+ } else {
798
+ // returns log2(effective-align).
799
+ // This is ok since `pack` applies to all fields equally.
800
+ // The calculation assumes that size is an integer multiple of align, except for ZSTs.
801
+ //
802
+ // group [u8; 4] with align-4 or [u8; 6] with align-2 fields
803
+ let align = layout. align ( ) . abi . bytes ( ) ;
804
+ let size = layout. size ( ) . bytes ( ) ;
805
+ let size_as_align = align. max ( size) . trailing_zeros ( ) ;
806
+ let size_as_align = if any_niche {
807
+ max_field_align. trailing_zeros ( ) . min ( size_as_align)
808
+ } else {
809
+ size_as_align
810
+ } ;
811
+ size_as_align as u64
812
+ }
813
+ } ;
814
+
804
815
match kind {
805
816
StructKind :: AlwaysSized | StructKind :: MaybeUnsized => {
806
817
optimizing. sort_by_key ( |& x| {
0 commit comments