@@ -14,7 +14,8 @@ 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 , HomogeneousAggregate , PassMode ,
18
+ Reg , RegKind ,
18
19
} ;
19
20
use rustc_target:: abi:: * ;
20
21
use rustc_target:: spec:: { abi:: Abi as SpecAbi , HasTargetSpec , PanicStrategy , Target } ;
@@ -3340,17 +3341,6 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
3340
3341
Ok ( self . tcx . arena . alloc ( fn_abi) )
3341
3342
}
3342
3343
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
-
3354
3344
fn fn_abi_adjust_for_abi (
3355
3345
& self ,
3356
3346
fn_abi : & mut FnAbi < ' tcx , Ty < ' tcx > > ,
@@ -3381,12 +3371,19 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
3381
3371
3382
3372
if arg. layout . is_unsized ( ) || size > max_by_val_size {
3383
3373
arg. make_indirect ( ) ;
3384
- } else if size > ptr_size && self . has_all_float ( & arg. layout ) {
3374
+ } else if let Ok ( HomogeneousAggregate :: Homogeneous ( Reg {
3375
+ kind : RegKind :: Float ,
3376
+ ..
3377
+ } ) ) = arg. layout . homogeneous_aggregate ( self )
3378
+ {
3385
3379
// 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 ( ) ;
3380
+ // because this will hurt the generated assembly (#93490)
3381
+ //
3382
+ // As an optimization we want to pass homogeneous aggregate of floats
3383
+ // greater than pointer size as indirect
3384
+ if size > ptr_size {
3385
+ arg. make_indirect ( ) ;
3386
+ }
3390
3387
} else {
3391
3388
// We want to pass small aggregates as immediates, but using
3392
3389
// a LLVM aggregate type for this leads to bad optimizations,
0 commit comments