diff options
| author | Diana Picus <diana.picus@linaro.org> | 2017-02-21 11:33:59 +0000 |
|---|---|---|
| committer | Diana Picus <diana.picus@linaro.org> | 2017-02-21 11:33:59 +0000 |
| commit | 613b65696a04a29047fe1628c1f6e3587cc024ee (patch) | |
| tree | 13166fb72a9c9d30fe7d3743ab6b2e36fc09551d | |
| parent | ba5df6dea5194099a740ed09c48c3080a14210b6 (diff) | |
| download | bcm5719-llvm-613b65696a04a29047fe1628c1f6e3587cc024ee.tar.gz bcm5719-llvm-613b65696a04a29047fe1628c1f6e3587cc024ee.zip | |
[ARM] GlobalISel: Lower calls to void() functions
For now, we hardcode a BLX instruction, and generate an ADJCALLSTACKDOWN/UP pair
with amount 0.
llvm-svn: 295716
| -rw-r--r-- | llvm/lib/Target/ARM/ARMCallLowering.cpp | 35 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMCallLowering.h | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll | 23 |
3 files changed, 62 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMCallLowering.cpp b/llvm/lib/Target/ARM/ARMCallLowering.cpp index d79d9173635..64e870cd1f0 100644 --- a/llvm/lib/Target/ARM/ARMCallLowering.cpp +++ b/llvm/lib/Target/ARM/ARMCallLowering.cpp @@ -304,3 +304,38 @@ bool ARMCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder, AssignFn); return handleAssignments(MIRBuilder, ArgInfos, ArgHandler); } + +bool ARMCallLowering::lowerCall(MachineIRBuilder &MIRBuilder, + const MachineOperand &Callee, + const ArgInfo &OrigRet, + ArrayRef<ArgInfo> OrigArgs) const { + const MachineFunction &MF = MIRBuilder.getMF(); + const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); + + if (MF.getSubtarget<ARMSubtarget>().genLongCalls()) + return false; + + // FIXME: Support calling functions with arguments. + if (OrigArgs.size() > 0) + return false; + + // FIXME: Support calling functions with return types. + if (!OrigRet.Ty->isVoidTy()) + return false; + + MIRBuilder.buildInstr(ARM::ADJCALLSTACKDOWN) + .addImm(0) + .add(predOps(ARMCC::AL)); + + MIRBuilder.buildInstr(ARM::BLX) + .add(Callee) + // FIXME: Don't hardcode the calling conv here... + .addRegMask(TRI->getCallPreservedMask(MF, CallingConv::ARM_AAPCS)); + + MIRBuilder.buildInstr(ARM::ADJCALLSTACKUP) + .addImm(0) + .addImm(0) + .add(predOps(ARMCC::AL)); + + return true; +} diff --git a/llvm/lib/Target/ARM/ARMCallLowering.h b/llvm/lib/Target/ARM/ARMCallLowering.h index 7c3b3ddec74..a71256108d5 100644 --- a/llvm/lib/Target/ARM/ARMCallLowering.h +++ b/llvm/lib/Target/ARM/ARMCallLowering.h @@ -34,6 +34,10 @@ public: bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F, ArrayRef<unsigned> VRegs) const override; + bool lowerCall(MachineIRBuilder &MIRBuilder, const MachineOperand &Callee, + const ArgInfo &OrigRet, + ArrayRef<ArgInfo> OrigArgs) const override; + private: bool lowerReturnVal(MachineIRBuilder &MIRBuilder, const Value *Val, unsigned VReg, MachineInstrBuilder &Ret) const; diff --git a/llvm/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll b/llvm/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll index ead9950ecac..28bbda4dc8e 100644 --- a/llvm/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll +++ b/llvm/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll @@ -335,3 +335,26 @@ entry: %v = fadd double %p0, %p1 ret double %v } + +define arm_aapcscc void @test_indirect_call(void() *%fptr) { +; CHECK-LABEL: name: test_indirect_call +; CHECK: [[FPTR:%[0-9]+]](p0) = COPY %r0 +; CHECK: ADJCALLSTACKDOWN 0, 14, _, implicit-def %sp, implicit %sp +; CHECK: BLX [[FPTR]](p0), csr_aapcs, implicit-def %lr, implicit %sp +; CHECK: ADJCALLSTACKUP 0, 0, 14, _, implicit-def %sp, implicit %sp +entry: + notail call arm_aapcscc void %fptr() + ret void +} + +declare arm_aapcscc void @call_target() + +define arm_aapcscc void @test_direct_call() { +; CHECK-LABEL: name: test_direct_call +; CHECK: ADJCALLSTACKDOWN 0, 14, _, implicit-def %sp, implicit %sp +; CHECK: BLX @call_target, csr_aapcs, implicit-def %lr, implicit %sp +; CHECK: ADJCALLSTACKUP 0, 0, 14, _, implicit-def %sp, implicit %sp +entry: + notail call arm_aapcscc void @call_target() + ret void +} |

