diff options
author | Fedor Indutny <fedor@indutny.com> | 2018-03-02 00:59:27 +0000 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2018-03-02 00:59:27 +0000 |
commit | 1571b1271ef855e9da9a2b73ed6529dd9b8ba988 (patch) | |
tree | e53dd75e40ca30fe8c9217371b486c1bc666ce7f /llvm/lib/Transforms/IPO/ArgumentPromotion.cpp | |
parent | 0ffcaf7437972dd9f8ba9be50ac14570d4305681 (diff) | |
download | bcm5719-llvm-1571b1271ef855e9da9a2b73ed6529dd9b8ba988.tar.gz bcm5719-llvm-1571b1271ef855e9da9a2b73ed6529dd9b8ba988.zip |
[ArgumentPromotion] don't break musttail invariant PR36543
Summary:
Do not break musttail invariant by promoting arguments of musttail
callee or caller.
Reviewers: sanjoy, dberlin, hfinkel, george.burgess.iv, fhahn, rnk
Reviewed By: rnk
Subscribers: rnk, llvm-commits
Differential Revision: https://reviews.llvm.org/D43926
llvm-svn: 326521
Diffstat (limited to 'llvm/lib/Transforms/IPO/ArgumentPromotion.cpp')
-rw-r--r-- | llvm/lib/Transforms/IPO/ArgumentPromotion.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp b/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp index 461c4e12cbd..d27adca86f2 100644 --- a/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp +++ b/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp @@ -853,10 +853,20 @@ promoteArguments(Function *F, function_ref<AAResults &(Function &F)> AARGetter, if (CS.getInstruction() == nullptr || !CS.isCallee(&U)) return nullptr; + // Can't change signature of musttail callee + if (CS.isMustTailCall()) + return nullptr; + if (CS.getInstruction()->getParent()->getParent() == F) isSelfRecursive = true; } + // Can't change signature of musttail caller + // FIXME: Support promoting whole chain of musttail functions + for (BasicBlock &BB : *F) + if (BB.getTerminatingMustTailCall()) + return nullptr; + const DataLayout &DL = F->getParent()->getDataLayout(); AAResults &AAR = AARGetter(*F); |