@@ -772,19 +772,6 @@ fn univariant(
772772 if optimize {
773773 let end = if let StructKind :: MaybeUnsized = kind { fields. len ( ) - 1 } else { fields. len ( ) } ;
774774 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- } ;
788775
789776 // If `-Z randomize-layout` was enabled for the type definition we can shuffle
790777 // the field ordering to try and catch some code making assumptions about layouts
@@ -801,6 +788,30 @@ fn univariant(
801788 }
802789 // Otherwise we just leave things alone and actually optimize the type's fields
803790 } 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+
804815 match kind {
805816 StructKind :: AlwaysSized | StructKind :: MaybeUnsized => {
806817 optimizing. sort_by_key ( |& x| {
0 commit comments