diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/EscapeEnumerator.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Utils/EscapeEnumerator.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/EscapeEnumerator.cpp b/llvm/lib/Transforms/Utils/EscapeEnumerator.cpp index cae9d9ee6d70..accedd5b4ee0 100644 --- a/llvm/lib/Transforms/Utils/EscapeEnumerator.cpp +++ b/llvm/lib/Transforms/Utils/EscapeEnumerator.cpp @@ -41,6 +41,8 @@ IRBuilder<> *EscapeEnumerator::Next() { if (!isa<ReturnInst>(TI) && !isa<ResumeInst>(TI)) continue; + if (CallInst *CI = CurBB->getTerminatingMustTailCall()) + TI = CI; Builder.SetInsertPoint(TI); return &Builder; } @@ -54,11 +56,12 @@ IRBuilder<> *EscapeEnumerator::Next() { return nullptr; // Find all 'call' instructions that may throw. + // We cannot tranform calls with musttail tag. SmallVector<Instruction *, 16> Calls; for (BasicBlock &BB : F) for (Instruction &II : BB) if (CallInst *CI = dyn_cast<CallInst>(&II)) - if (!CI->doesNotThrow()) + if (!CI->doesNotThrow() && !CI->isMustTailCall()) Calls.push_back(CI); if (Calls.empty()) |
