diff options
| author | Keno Fischer <kfischer@college.harvard.edu> | 2014-08-20 19:00:37 +0000 |
|---|---|---|
| committer | Keno Fischer <kfischer@college.harvard.edu> | 2014-08-20 19:00:37 +0000 |
| commit | d750723d291dc6cd9295b7b0643b71d8cd9fbab2 (patch) | |
| tree | 38cc699f6664b9f8e0dfa760e1f56d4ab992a6a4 /llvm/lib | |
| parent | 314c643b4a80f71d12024b495e6c626ea5ca860b (diff) | |
| download | bcm5719-llvm-d750723d291dc6cd9295b7b0643b71d8cd9fbab2.tar.gz bcm5719-llvm-d750723d291dc6cd9295b7b0643b71d8cd9fbab2.zip | |
Do not insert a tail call when returning multiple values on X86
Summary: This fixes http://llvm.org/bugs/show_bug.cgi?id=19530.
The problem is that X86ISelLowering erroneously thought the third call
was eligible for tail call elimination.
It would have been if it's return value was actually the one returned
by the calling function, but here that is not the case and
additional values are being returned.
Test Plan: Test case from the original bug report is included.
Reviewers: rafael
Reviewed By: rafael
Subscribers: rafael, llvm-commits
Differential Revision: http://reviews.llvm.org/D4968
llvm-svn: 216117
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index af8e1a18808..9cb9e6abbef 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -2052,6 +2052,13 @@ bool X86TargetLowering::isUsedByReturnOnly(SDNode *N, SDValue &Chain) const { UI != UE; ++UI) { if (UI->getOpcode() != X86ISD::RET_FLAG) return false; + // If we are returning more than one value, we can definitely + // not make a tail call see PR19530 + if (UI->getNumOperands() > 4) + return false; + if (UI->getNumOperands() == 4 && + UI->getOperand(UI->getNumOperands()-1).getValueType() != MVT::Glue) + return false; HasRet = true; } |

