summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
diff options
context:
space:
mode:
authorFedor Indutny <fedor@indutny.com>2018-03-02 00:59:27 +0000
committerFedor Indutny <fedor@indutny.com>2018-03-02 00:59:27 +0000
commit1571b1271ef855e9da9a2b73ed6529dd9b8ba988 (patch)
treee53dd75e40ca30fe8c9217371b486c1bc666ce7f /llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
parent0ffcaf7437972dd9f8ba9be50ac14570d4305681 (diff)
downloadbcm5719-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.cpp10
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);
OpenPOWER on IntegriCloud