diff options
author | Diana Picus <diana.picus@linaro.org> | 2016-12-19 11:55:41 +0000 |
---|---|---|
committer | Diana Picus <diana.picus@linaro.org> | 2016-12-19 11:55:41 +0000 |
commit | 1437f6d710ecf2c7a6aa19858e57a93ee0685338 (patch) | |
tree | a3e55c4967bd24968ab5dfc7326ada61aacf1bc7 /llvm/lib/Target | |
parent | 69c8aa26d8cc1014a791611be72c7c1ee5a3d336 (diff) | |
download | bcm5719-llvm-1437f6d710ecf2c7a6aa19858e57a93ee0685338.tar.gz bcm5719-llvm-1437f6d710ecf2c7a6aa19858e57a93ee0685338.zip |
[ARM] GlobalISel: Lower more than 4 arguments
This adds support for lowering more than 4 arguments (although still i32 only).
It uses the handleAssignments / ValueHandler infrastructure extracted from
the AArch64 backend in r288658.
Differential Revision: https://reviews.llvm.org/D27195
llvm-svn: 290098
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/ARM/ARMCallLowering.cpp | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/llvm/lib/Target/ARM/ARMCallLowering.cpp b/llvm/lib/Target/ARM/ARMCallLowering.cpp index f266e188950..de40dd0db0e 100644 --- a/llvm/lib/Target/ARM/ARMCallLowering.cpp +++ b/llvm/lib/Target/ARM/ARMCallLowering.cpp @@ -19,6 +19,7 @@ #include "ARMISelLowering.h" #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" using namespace llvm; @@ -115,7 +116,27 @@ struct FormalArgHandler : public CallLowering::ValueHandler { unsigned getStackAddress(uint64_t Size, int64_t Offset, MachinePointerInfo &MPO) override { - llvm_unreachable("Don't know how to get a stack address yet"); + assert(Size == 4 && "Unsupported size"); + + auto &MFI = MIRBuilder.getMF().getFrameInfo(); + + int FI = MFI.CreateFixedObject(Size, Offset, true); + MPO = MachinePointerInfo::getFixedStack(MIRBuilder.getMF(), FI); + + unsigned AddrReg = + MRI.createGenericVirtualRegister(LLT::pointer(MPO.getAddrSpace(), 32)); + MIRBuilder.buildFrameIndex(AddrReg, FI); + + return AddrReg; + } + + void assignValueToAddress(unsigned ValVReg, unsigned Addr, uint64_t Size, + MachinePointerInfo &MPO, CCValAssign &VA) override { + assert(Size == 4 && "Unsupported size"); + + auto MMO = MIRBuilder.getMF().getMachineMemOperand( + MPO, MachineMemOperand::MOLoad, Size, /* Alignment */ 0); + MIRBuilder.buildLoad(ValVReg, Addr, *MMO); } void assignValueToReg(unsigned ValVReg, unsigned PhysReg, @@ -129,11 +150,6 @@ struct FormalArgHandler : public CallLowering::ValueHandler { MIRBuilder.getMBB().addLiveIn(PhysReg); MIRBuilder.buildCopy(ValVReg, PhysReg); } - - void assignValueToAddress(unsigned ValVReg, unsigned Addr, uint64_t Size, - MachinePointerInfo &MPO, CCValAssign &VA) override { - llvm_unreachable("Don't know how to assign a value to an address yet"); - } }; } // End anonymous namespace @@ -144,10 +160,6 @@ bool ARMCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder, if (F.arg_empty()) return true; - // Stick to only 4 arguments for now - if (F.arg_size() > 4) - return false; - if (F.isVarArg()) return false; |