summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM/ARMCallLowering.h
diff options
context:
space:
mode:
authorDiana Picus <diana.picus@linaro.org>2019-06-27 08:54:17 +0000
committerDiana Picus <diana.picus@linaro.org>2019-06-27 08:54:17 +0000
commitc3dbe2397792302232114ebb15507c3977b605d2 (patch)
tree8a553a27bcd4acd8b3cdea1ead34b0322324008b /llvm/lib/Target/ARM/ARMCallLowering.h
parent69ce1c1319634dbf8bc3d6cb4305efea2da0965f (diff)
downloadbcm5719-llvm-c3dbe2397792302232114ebb15507c3977b605d2.tar.gz
bcm5719-llvm-c3dbe2397792302232114ebb15507c3977b605d2.zip
[GlobalISel] Accept multiple vregs in lowerFormalArgs
Change the interface of CallLowering::lowerFormalArguments to accept several virtual registers for each formal argument, instead of just one. This is a follow-up to D46018. CallLowering::lowerReturn was similarly refactored in D49660. lowerCall will be refactored in the same way in follow-up patches. With this change, we forward the virtual registers generated for aggregates to CallLowering. Therefore, the target can decide itself whether it wants to handle them as separate pieces or use one big register. We also copy the pack/unpackRegs helpers to CallLowering to facilitate this. 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. AArch64 seems to have had a bug when lowering e.g. [1 x i8*], which was put into a s64 instead of a p0. Added a test-case which illustrates the problem more clearly (it crashes without this patch) and fixed the existing test-case to expect p0. AMDGPU has been updated to unpack into the virtual registers for kernels. I think the other code paths fall back for aggregates, so this should be NFC. Mips doesn't support aggregates yet, so it's also NFC. x86 seems to have code for dealing with aggregates, but I couldn't find the tests for it, so I just added a fallback to DAGISel if we get more than one virtual register for an argument. Differential Revision: https://reviews.llvm.org/D63549 llvm-svn: 364510
Diffstat (limited to 'llvm/lib/Target/ARM/ARMCallLowering.h')
-rw-r--r--llvm/lib/Target/ARM/ARMCallLowering.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMCallLowering.h b/llvm/lib/Target/ARM/ARMCallLowering.h
index a563e179347..d0f20449192 100644
--- a/llvm/lib/Target/ARM/ARMCallLowering.h
+++ b/llvm/lib/Target/ARM/ARMCallLowering.h
@@ -36,7 +36,7 @@ public:
ArrayRef<Register> VRegs) const override;
bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F,
- ArrayRef<Register> VRegs) const override;
+ ArrayRef<ArrayRef<Register>> VRegs) const override;
bool lowerCall(MachineIRBuilder &MIRBuilder, CallingConv::ID CallConv,
const MachineOperand &Callee, const ArgInfo &OrigRet,
OpenPOWER on IntegriCloud