summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-08-26 00:59:51 +0000
committerReid Kleckner <reid@kleckner.net>2014-08-26 00:59:51 +0000
commit3715461b48ae720559901162687edb46cc6e65d8 (patch)
tree0038fbed424375cff3e17587b81aaf1923cff342 /llvm/lib/Transforms
parent4e31cdabd12a7671d1b49bde2bca4f6dd68f2ffa (diff)
downloadbcm5719-llvm-3715461b48ae720559901162687edb46cc6e65d8.tar.gz
bcm5719-llvm-3715461b48ae720559901162687edb46cc6e65d8.zip
musttail: Don't eliminate varargs packs if there is a forwarding call
Also clean up and beef up this grep test for the feature. llvm-svn: 216425
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
index ac3853dbd67..7b22e921814 100644
--- a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
+++ b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
@@ -199,10 +199,15 @@ bool DAE::DeleteDeadVarargs(Function &Fn) {
return false;
// Okay, we know we can transform this function if safe. Scan its body
- // looking for calls to llvm.vastart.
+ // looking for calls marked musttail or calls to llvm.vastart.
for (Function::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) {
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
- if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
+ CallInst *CI = dyn_cast<CallInst>(I);
+ if (!CI)
+ continue;
+ if (CI->isMustTailCall())
+ return false;
+ if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) {
if (II->getIntrinsicID() == Intrinsic::vastart)
return false;
}
OpenPOWER on IntegriCloud