summaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/SelectionDAG
diff options
context:
space:
mode:
authorArnold Schwaighofer <arnold.schwaighofer@gmail.com>2009-06-15 14:43:36 +0000
committerArnold Schwaighofer <arnold.schwaighofer@gmail.com>2009-06-15 14:43:36 +0000
commit5d2c01e48afba59be7bd0eaa10db784bf2073c20 (patch)
tree3d1c5866f4ff7d6fd5d7744956625ea9b91ecb87 /lib/CodeGen/SelectionDAG
parentc457b65087cd79d74c8eab2a3fa4bbf0ba940c1a (diff)
downloadexternal_llvm-5d2c01e48afba59be7bd0eaa10db784bf2073c20.zip
external_llvm-5d2c01e48afba59be7bd0eaa10db784bf2073c20.tar.gz
external_llvm-5d2c01e48afba59be7bd0eaa10db784bf2073c20.tar.bz2
CheckTailCallReturnConstraints is missing a check on the
incomming chain of the RETURN node. The incomming chain must be the outgoing chain of the CALL node. This causes the backend to identify tail calls that are not tail calls. This patch fixes this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73387 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG')
-rw-r--r--lib/CodeGen/SelectionDAG/TargetLowering.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index ab4cd51..134a859 100644
--- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -2584,8 +2584,12 @@ bool TargetLowering::CheckTailCallReturnConstraints(CallSDNode *TheCall,
// Check that operand of the RET node sources from the CALL node. The RET node
// has at least two operands. Operand 0 holds the chain. Operand 1 holds the
// value.
+ // Also we need to check that there is no code in between the call and the
+ // return. Hence we also check that the incomming chain to the return sources
+ // from the outgoing chain of the call.
if (NumOps > 1 &&
- IgnoreHarmlessInstructions(Ret.getOperand(1)) == SDValue(TheCall,0))
+ IgnoreHarmlessInstructions(Ret.getOperand(1)) == SDValue(TheCall,0) &&
+ Ret.getOperand(0) == SDValue(TheCall, TheCall->getNumValues()-1))
return true;
// void return: The RET node has the chain result value of the CALL node as
// input.