Skip to content

Commit 43cf5b9

Browse files
dotdashMark-Simulacrum
authored andcommitted
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.
1 parent e393046 commit 43cf5b9

File tree

1 file changed

+1
-2
lines changed

1 file changed

+1
-2
lines changed

src/librustc_trans/common.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@ pub fn type_is_immediate<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, ty: Ty<'tcx>) -
6767
Layout::UntaggedUnion { .. } |
6868
Layout::RawNullablePointer { .. } |
6969
Layout::StructWrappedNullablePointer { .. } => {
70-
let dl = &ccx.tcx().data_layout;
71-
!layout.is_unsized() && layout.size(dl) <= dl.pointer_size
70+
!layout.is_unsized() && layout.size(&ccx.tcx().data_layout).bytes() == 0
7271
}
7372
}
7473
}

0 commit comments

Comments
 (0)