add TAILCALL node
authorChris Lattner <sabre@nondot.org>
Fri, 13 May 2005 18:40:17 +0000 (18:40 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 13 May 2005 18:40:17 +0000 (18:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21956 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/SelectionDAG.h
include/llvm/CodeGen/SelectionDAGNodes.h

index c7fa36cc04856ee5ea874a77136f71a5fbb60026..26e11b6591ca3bcc3ddb557539f56540df1345b8 100644 (file)
@@ -129,8 +129,8 @@ public:
   /// getCall - Note that this destroys the vector of RetVals passed in.
   ///
   SDNode *getCall(std::vector<MVT::ValueType> &RetVals, SDOperand Chain,
-                  SDOperand Callee) {
-    SDNode *NN = new SDNode(ISD::CALL, Chain, Callee);
+                  SDOperand Callee, bool isTailCall = false) {
+    SDNode *NN = new SDNode(isTailCall ? ISD::TAILCALL : ISD::CALL, Chain, Callee);
     NN->setValueTypes(RetVals);
     AllNodes.push_back(NN);
     return NN;
@@ -140,10 +140,10 @@ public:
   /// where arguments are passed in physical registers.  This destroys the
   /// RetVals and ArgsInRegs vectors.
   SDNode *getCall(std::vector<MVT::ValueType> &RetVals, SDOperand Chain,
-                  SDOperand Callee, std::vector<SDOperand> &ArgsInRegs) {
+                  SDOperand Callee, std::vector<SDOperand> &ArgsInRegs, bool isTailCall = false) {
     ArgsInRegs.insert(ArgsInRegs.begin(), Callee);
     ArgsInRegs.insert(ArgsInRegs.begin(), Chain);
-    SDNode *NN = new SDNode(ISD::CALL, ArgsInRegs);
+    SDNode *NN = new SDNode(isTailCall ? ISD::TAILCALL : ISD::CALL, ArgsInRegs);
     NN->setValueTypes(RetVals);
     AllNodes.push_back(NN);
     return NN;
index b3ac7db890eec740bf5e5609835c78655bb5530a..06a7b20ff9cb5b1e9df6ca2bea7825ca98eb9d17 100644 (file)
@@ -234,8 +234,10 @@ namespace ISD {
     // CALL - Call to a function pointer.  The first operand is the chain, the
     // second is the destination function pointer (a GlobalAddress for a direct
     // call).  Arguments have already been lowered to explicit DAGs according to
-    // the calling convention in effect here.
+    // the calling convention in effect here.  TAILCALL is the same as CALL, but
+    // the callee is known not to access the stack of the caller.
     CALL,
+    TAILCALL,
 
     // MEMSET/MEMCPY/MEMMOVE - The first operand is the chain, and the rest
     // correspond to the operands of the LLVM intrinsic functions.  The only