@@ -14,7 +14,7 @@ use rustc_session::{config::OptLevel, DataTypeKind, FieldInfo, SizeKind, Variant
14
14
use rustc_span:: symbol:: Symbol ;
15
15
use rustc_span:: { Span , DUMMY_SP } ;
16
16
use rustc_target:: abi:: call:: {
17
- ArgAbi , ArgAttribute , ArgAttributes , ArgExtension , Conv , FnAbi , PassMode , /* Reg, RegKind, */
17
+ ArgAbi , ArgAttribute , ArgAttributes , ArgExtension , Conv , FnAbi , PassMode , Reg , RegKind ,
18
18
} ;
19
19
use rustc_target:: abi:: * ;
20
20
use rustc_target:: spec:: { abi:: Abi as SpecAbi , HasTargetSpec , PanicStrategy , Target } ;
@@ -3340,16 +3340,16 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
3340
3340
Ok ( self . tcx . arena . alloc ( fn_abi) )
3341
3341
}
3342
3342
3343
- // // / Small heuristic for determining if layout has any float primitive
3344
- // fn has_all_float(&self, layout: &'_ TyAndLayout<'tcx>) -> bool {
3345
- // match layout.abi {
3346
- // Abi::Uninhabited | Abi::Vector { .. } => false,
3347
- // Abi::Scalar(scalar) => matches!(scalar.primitive(), Primitive::F32 | Primitive::F64),
3348
- // Abi::ScalarPair(..) | Abi::Aggregate { .. } => {
3349
- // (0..layout.fields.count()).all(|i| self.has_all_float(&layout.field(self, i)))
3350
- // }
3351
- // }
3352
- // }
3343
+ /// Small heuristic for determining if layout has any float primitive
3344
+ fn has_all_float ( & self , layout : & ' _ TyAndLayout < ' tcx > ) -> bool {
3345
+ match layout. abi {
3346
+ Abi :: Uninhabited | Abi :: Vector { .. } => false ,
3347
+ Abi :: Scalar ( scalar) => matches ! ( scalar. primitive( ) , Primitive :: F32 | Primitive :: F64 ) ,
3348
+ Abi :: ScalarPair ( ..) | Abi :: Aggregate { .. } => {
3349
+ ( 0 ..layout. fields . count ( ) ) . all ( |i| self . has_all_float ( & layout. field ( self , i) ) )
3350
+ }
3351
+ }
3352
+ }
3353
3353
3354
3354
fn fn_abi_adjust_for_abi (
3355
3355
& self ,
@@ -3375,29 +3375,27 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
3375
3375
// Pass and return structures up to 2 pointers in size by value,
3376
3376
// matching `ScalarPair`. LLVM will usually pass these in 2 registers
3377
3377
// which is more efficient than by-ref.
3378
- let max_by_val_size = Pointer . size ( self ) * 2 ;
3378
+ let ptr_size = Pointer . size ( self ) ;
3379
+ let max_by_val_size = ptr_size * 2 ;
3379
3380
let size = arg. layout . size ;
3380
3381
3381
3382
if arg. layout . is_unsized ( ) || size > max_by_val_size {
3382
3383
arg. make_indirect ( ) ;
3383
- // } else if self.has_all_float(&arg.layout) {
3384
- // // We don't want to aggregate floats as an aggregates of Integer
3385
- // // because this will hurt the generated assembly (#93490)
3386
- // //
3387
- // // As an optimization we want to pass homogeneous aggregate of floats
3388
- // // greater than pointer size as indirect
3389
- // if size > Pointer.size(self) {
3390
- // arg.make_indirect();
3391
- // }
3392
- // } else {
3393
- // // We want to pass small aggregates as immediates, but using
3394
- // // a LLVM aggregate type for this leads to bad optimizations,
3395
- // // so we pick an appropriately sized integer type instead.
3396
- // //
3397
- // // NOTE: This is sub-optimal because in the case of (f32, f32, u32, u32)
3398
- // // we could do ([f32; 2], u64) which is better but this is the best we
3399
- // // can do right now.
3400
- // arg.cast_to(Reg { kind: RegKind::Integer, size });
3384
+ } else if size > ptr_size && self . has_all_float ( & arg. layout ) {
3385
+ // We don't want to aggregate floats as an aggregates of Integer
3386
+ // because this will hurt the generated assembly (#93490) but as an
3387
+ // optimization we want to pass homogeneous aggregate of floats
3388
+ // greater than pointer size as indirect.
3389
+ arg. make_indirect ( ) ;
3390
+ } else {
3391
+ // We want to pass small aggregates as immediates, but using
3392
+ // a LLVM aggregate type for this leads to bad optimizations,
3393
+ // so we pick an appropriately sized integer type instead.
3394
+ //
3395
+ // NOTE: This is sub-optimal because in the case of (f32, f32, u32, u32)
3396
+ // we could do ([f32; 2], u64) which is better but this is the best we
3397
+ // can do right now.
3398
+ arg. cast_to ( Reg { kind : RegKind :: Integer , size } ) ;
3401
3399
}
3402
3400
}
3403
3401
0 commit comments