[llvm] r275458 - [Hexagon] Packetize function call arguments with tail call instructions

Krzysztof Parzyszek via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 14 12:30:55 PDT 2016


Author: kparzysz
Date: Thu Jul 14 14:30:55 2016
New Revision: 275458

URL: http://llvm.org/viewvc/llvm-project?rev=275458&view=rev
Log:
[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.

Added:
    llvm/trunk/test/CodeGen/Hexagon/packetize-tailcall-arg.ll
Modified:
    llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.cpp
    llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.h
    llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp

Modified: llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.cpp?rev=275458&r1=275457&r2=275458&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.cpp Thu Jul 14 14:30:55 2016
@@ -2437,6 +2437,17 @@ bool HexagonInstrInfo::isSpillPredRegOp(
 }
 
 
+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();

Modified: llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.h?rev=275458&r1=275457&r2=275458&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.h (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.h Thu Jul 14 14:30:55 2016
@@ -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;

Modified: llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp?rev=275458&r1=275457&r2=275458&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp Thu Jul 14 14:30:55 2016
@@ -1248,7 +1248,7 @@ bool HexagonPacketizerList::isLegalToPac
       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()))

Added: llvm/trunk/test/CodeGen/Hexagon/packetize-tailcall-arg.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/packetize-tailcall-arg.ll?rev=275458&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/packetize-tailcall-arg.ll (added)
+++ llvm/trunk/test/CodeGen/Hexagon/packetize-tailcall-arg.ll Thu Jul 14 14:30:55 2016
@@ -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
+




More information about the llvm-commits mailing list