summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
diff options
context:
space:
mode:
authorDiana Picus <diana.picus@linaro.org>2019-06-27 09:15:53 +0000
committerDiana Picus <diana.picus@linaro.org>2019-06-27 09:15:53 +0000
commit8138996128cd17d78d9d3e6ef7b49987565cb310 (patch)
tree6940587d49fcb7f7116dfb017a531017ac5d514c /llvm/lib/Target/AArch64/AArch64CallLowering.cpp
parentc3dbe2397792302232114ebb15507c3977b605d2 (diff)
downloadbcm5719-llvm-8138996128cd17d78d9d3e6ef7b49987565cb310.tar.gz
bcm5719-llvm-8138996128cd17d78d9d3e6ef7b49987565cb310.zip
[GlobalISel] Accept multiple vregs for lowerCall's result
Change the interface of CallLowering::lowerCall to accept several virtual registers for the call result, instead of just one. This is a follow-up to D46018. CallLowering::lowerReturn was similarly refactored in D49660 and lowerFormalArguments in D63549. With this change, we no longer pack the virtual registers generated for aggregates into one big lump before delegating to the target. Therefore, the target can decide itself whether it wants to handle them as separate pieces or use one big register. ARM and AArch64 have been updated to use the passed in virtual registers directly, which means we no longer need to generate so many merge/extract instructions. NFCI for AMDGPU, Mips and X86. Differential Revision: https://reviews.llvm.org/D63550 llvm-svn: 364511
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64CallLowering.cpp')
-rw-r--r--llvm/lib/Target/AArch64/AArch64CallLowering.cpp12
1 files changed, 3 insertions, 9 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
index effca68b09b..1fa12b0290b 100644
--- a/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
@@ -498,24 +498,18 @@ bool AArch64CallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
// symmetry with the arugments, the physical register must be an
// implicit-define of the call instruction.
CCAssignFn *RetAssignFn = TLI.CCAssignFnForReturn(F.getCallingConv());
- assert(OrigRet.Regs.size() == 1 && "Can't handle multple regs yet");
- if (OrigRet.Regs[0]) {
+ if (!OrigRet.Ty->isVoidTy()) {
SplitArgs.clear();
- SmallVector<uint64_t, 8> RegOffsets;
- SmallVector<Register, 8> SplitRegs;
splitToValueTypes(OrigRet, SplitArgs, DL, MRI, F.getCallingConv(),
[&](unsigned Reg, uint64_t Offset) {
- RegOffsets.push_back(Offset);
- SplitRegs.push_back(Reg);
+ llvm_unreachable(
+ "Call results should already be split");
});
CallReturnHandler Handler(MIRBuilder, MRI, MIB, RetAssignFn);
if (!handleAssignments(MIRBuilder, SplitArgs, Handler))
return false;
-
- if (!RegOffsets.empty())
- MIRBuilder.buildSequence(OrigRet.Regs[0], SplitRegs, RegOffsets);
}
if (SwiftErrorVReg) {
OpenPOWER on IntegriCloud