diff options
author | Reid Kleckner <reid@kleckner.net> | 2014-08-26 00:59:51 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2014-08-26 00:59:51 +0000 |
commit | 3715461b48ae720559901162687edb46cc6e65d8 (patch) | |
tree | 0038fbed424375cff3e17587b81aaf1923cff342 /llvm/lib/Transforms | |
parent | 4e31cdabd12a7671d1b49bde2bca4f6dd68f2ffa (diff) | |
download | bcm5719-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.cpp | 9 |
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; } |