From 1a360b3be9825e99dfb14c35c844143bae6991f4 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Thu, 14 Jul 2016 19:30:55 +0000 Subject: [PATCH] [Hexagon] Packetize function call arguments with tail call instructions On Hexagon is it legal to packetize the instructions setting up call arguments with the call instruction itself. This was already done, except for tail calls. Make sure tail calls are handled as well. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275458 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Hexagon/HexagonInstrInfo.cpp | 11 +++++++++++ lib/Target/Hexagon/HexagonInstrInfo.h | 1 + lib/Target/Hexagon/HexagonVLIWPacketizer.cpp | 2 +- test/CodeGen/Hexagon/packetize-tailcall-arg.ll | 22 ++++++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/Hexagon/packetize-tailcall-arg.ll diff --git a/lib/Target/Hexagon/HexagonInstrInfo.cpp b/lib/Target/Hexagon/HexagonInstrInfo.cpp index d3fd517fe49..f3230a76f25 100644 --- a/lib/Target/Hexagon/HexagonInstrInfo.cpp +++ b/lib/Target/Hexagon/HexagonInstrInfo.cpp @@ -2437,6 +2437,17 @@ bool HexagonInstrInfo::isSpillPredRegOp(const MachineInstr *MI) const { } +bool HexagonInstrInfo::isTailCall(const MachineInstr *MI) const { + if (!MI->isBranch()) + return false; + + for (auto &Op : MI->operands()) + if (Op.isGlobal() || Op.isSymbol()) + return true; + return false; +} + + // Returns true when SU has a timing class TC1. bool HexagonInstrInfo::isTC1(const MachineInstr *MI) const { unsigned SchedClass = MI->getDesc().getSchedClass(); diff --git a/lib/Target/Hexagon/HexagonInstrInfo.h b/lib/Target/Hexagon/HexagonInstrInfo.h index 92f8c33f693..50bd7e9e845 100644 --- a/lib/Target/Hexagon/HexagonInstrInfo.h +++ b/lib/Target/Hexagon/HexagonInstrInfo.h @@ -309,6 +309,7 @@ public: bool isSignExtendingLoad(const MachineInstr &MI) const; bool isSolo(const MachineInstr* MI) const; bool isSpillPredRegOp(const MachineInstr *MI) const; + bool isTailCall(const MachineInstr *MI) const; bool isTC1(const MachineInstr *MI) const; bool isTC2(const MachineInstr *MI) const; bool isTC2Early(const MachineInstr *MI) const; diff --git a/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp b/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp index 033c02154db..0b3aea1bdbe 100644 --- a/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp +++ b/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp @@ -1248,7 +1248,7 @@ bool HexagonPacketizerList::isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ) { RC = HRI->getMinimalPhysRegClass(DepReg); } - if (I->isCall() || I->isReturn()) { + if (I->isCall() || I->isReturn() || HII->isTailCall(I)) { if (!isRegDependence(DepType)) continue; if (!isCallDependent(I, DepType, SUJ->Succs[i].getReg())) diff --git a/test/CodeGen/Hexagon/packetize-tailcall-arg.ll b/test/CodeGen/Hexagon/packetize-tailcall-arg.ll new file mode 100644 index 00000000000..17afd7df94a --- /dev/null +++ b/test/CodeGen/Hexagon/packetize-tailcall-arg.ll @@ -0,0 +1,22 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s +; There should only be one packet: +; { +; jump free +; r0 = memw(r0 + #-4) +; } +; +; CHECK: { +; CHECK-NOT: { + +define void @fred(i8* %p) nounwind { +entry: + %arrayidx = getelementptr inbounds i8, i8* %p, i32 -4 + %t0 = bitcast i8* %arrayidx to i8** + %t1 = load i8*, i8** %t0, align 4 + tail call void @free(i8* %t1) + ret void +} + +; Function Attrs: nounwind +declare void @free(i8* nocapture) nounwind + -- 2.11.0