summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2018-04-02 22:49:44 +0000
committerReid Kleckner <rnk@google.com>2018-04-02 22:49:44 +0000
commit298ffc609bf5c67079dbeb77e3f75e5bc18fde7a (patch)
tree4649969364fa70560d90c85ab2932a7751491353 /llvm/lib/Transforms
parent637fd446d926fc35d14fbe59fe38117997b9d582 (diff)
downloadbcm5719-llvm-298ffc609bf5c67079dbeb77e3f75e5bc18fde7a.tar.gz
bcm5719-llvm-298ffc609bf5c67079dbeb77e3f75e5bc18fde7a.zip
[InstCombine] Don't strip function type casts from musttail calls
Summary: The cast simplifications that instcombine does here do not make any attempt to obey the verifier rules for musttail calls. Therefore we have to disable them. Reviewers: efriedma, majnemer, pcc Subscribers: hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D45186 llvm-svn: 329027
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index f5400f978a4..31fbaa7a6e2 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -3996,10 +3996,19 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
if (!Callee)
return false;
- // The prototype of a thunk is a lie. Don't directly call such a function.
+ // If this is a call to a thunk function, don't remove the cast. Thunks are
+ // used to transparently forward all incoming parameters and outgoing return
+ // values, so it's important to leave the cast in place.
if (Callee->hasFnAttribute("thunk"))
return false;
+ // If this is a musttail call, the callee's prototype must match the caller's
+ // prototype with the exception of pointee types. The code below doesn't
+ // implement that, so we can't do this transform.
+ // TODO: Do the transform if it only requires adding pointer casts.
+ if (CS.isMustTailCall())
+ return false;
+
Instruction *Caller = CS.getInstruction();
const AttributeList &CallerPAL = CS.getAttributes();
OpenPOWER on IntegriCloud