Avoid using load/stores on first class aggregates
LLVM usually prefers using memcpys over direct loads/store of first class aggregates. The check in type_is_immediate to mark certain small structs was originally part of the code to handle such immediates in function arguments, and it had a counterpart in load_ty/store_ty to actually convert small aggregates to integers. But since then, the ABI handling has been refactored and takes care of converting small aggregates to integers. During that refactoring, the code to handle small aggregates in load_ty/store_ty has been removed, and so we accidentally started using loads/stores on FCA values. Since type_is_immediate() is no longer responsible for ABI-related conversions, and using a memcpy even for small aggregates is usually better than performing a FCA load/store, we can remove that code part and only handle simple types as immediates there. This integrates PR #38906 onto this branch. Fixes #38906.
This commit is contained in:
parent
e393046380
commit
43cf5b9231
1 changed files with 1 additions and 2 deletions
|
@ -67,8 +67,7 @@ pub fn type_is_immediate<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, ty: Ty<'tcx>) -
|
|||
Layout::UntaggedUnion { .. } |
|
||||
Layout::RawNullablePointer { .. } |
|
||||
Layout::StructWrappedNullablePointer { .. } => {
|
||||
let dl = &ccx.tcx().data_layout;
|
||||
!layout.is_unsized() && layout.size(dl) <= dl.pointer_size
|
||||
!layout.is_unsized() && layout.size(&ccx.tcx().data_layout).bytes() == 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue