diff options
author | Pete Cooper <peter_cooper@apple.com> | 2015-04-17 22:16:24 +0000 |
---|---|---|
committer | Pete Cooper <peter_cooper@apple.com> | 2015-04-17 22:16:24 +0000 |
commit | 635b509dee6aa29a1524fa76aacf418a44448c77 (patch) | |
tree | e54b8d829d3b9dd09e1cdad578f01e72559d09f5 /clang/lib/CodeGen | |
parent | b8a108cfc7be0cedc0ced90e415490c9b610c6b7 (diff) | |
download | bcm5719-llvm-635b509dee6aa29a1524fa76aacf418a44448c77.tar.gz bcm5719-llvm-635b509dee6aa29a1524fa76aacf418a44448c77.zip |
Change AArch64 i128 returns to use [2 x i64] when possible.
Something like { void*, void * } would be passed to a function as a [2 x i64], but returned as an i128. This patch unifies the 2 behaviours so that we also return it as a [2 x i64].
This is better for the quality of the IR, and the size of the final LLVM binary as we tend to want to insert/extract values from these types and do so with the insert/extract instructions is less IR than shifting, truncating, and or'ing values.
Reviewed by Tim Northover.
llvm-svn: 235231
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 05529656d18..23d304731f1 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -4044,7 +4044,15 @@ ABIArgInfo AArch64ABIInfo::classifyReturnType(QualType RetTy) const { // Aggregates <= 16 bytes are returned directly in registers or on the stack. uint64_t Size = getContext().getTypeSize(RetTy); if (Size <= 128) { + unsigned Alignment = getContext().getTypeAlign(RetTy); Size = 64 * ((Size + 63) / 64); // round up to multiple of 8 bytes + + // We use a pair of i64 for 16-byte aggregate with 8-byte alignment. + // For aggregates with 16-byte alignment, we use i128. + if (Alignment < 128 && Size == 128) { + llvm::Type *BaseTy = llvm::Type::getInt64Ty(getVMContext()); + return ABIArgInfo::getDirect(llvm::ArrayType::get(BaseTy, Size / 64)); + } return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), Size)); } |