diff options
| author | Reid Kleckner <rnk@google.com> | 2018-04-02 22:49:44 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2018-04-02 22:49:44 +0000 |
| commit | 298ffc609bf5c67079dbeb77e3f75e5bc18fde7a (patch) | |
| tree | 4649969364fa70560d90c85ab2932a7751491353 /llvm/lib/Transforms | |
| parent | 637fd446d926fc35d14fbe59fe38117997b9d582 (diff) | |
| download | bcm5719-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.cpp | 11 |
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(); |

