diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-01-23 05:41:29 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-01-23 05:41:29 +0000 |
commit | 4bf0b6b4838617764436aa5825776c9c457a2c98 (patch) | |
tree | e0fc3d252e75bdc5169e3ec420757d9e922ce486 /llvm/lib/Transforms/IPO/PruneEH.cpp | |
parent | 2d728ec55d99c04147ee86e451db26319fcd766c (diff) | |
download | bcm5719-llvm-4bf0b6b4838617764436aa5825776c9c457a2c98.tar.gz bcm5719-llvm-4bf0b6b4838617764436aa5825776c9c457a2c98.zip |
[PruneEH] FuncletPads must not have undef operands
Instead of RAUW with undef, replace the first non-token instruction with
unreachable.
This fixes PR26263.
llvm-svn: 258611
Diffstat (limited to 'llvm/lib/Transforms/IPO/PruneEH.cpp')
-rw-r--r-- | llvm/lib/Transforms/IPO/PruneEH.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/IPO/PruneEH.cpp b/llvm/lib/Transforms/IPO/PruneEH.cpp index da3bf234d21..c2f55d896ba 100644 --- a/llvm/lib/Transforms/IPO/PruneEH.cpp +++ b/llvm/lib/Transforms/IPO/PruneEH.cpp @@ -228,10 +228,17 @@ void PruneEH::DeleteBasicBlock(BasicBlock *BB) { assert(pred_empty(BB) && "BB is not dead!"); CallGraph &CG = getAnalysis<CallGraphWrapperPass>().getCallGraph(); + Instruction *TokenInst = nullptr; + CallGraphNode *CGN = CG[BB->getParent()]; for (BasicBlock::iterator I = BB->end(), E = BB->begin(); I != E; ) { --I; + if (I->getType()->isTokenTy()) { + TokenInst = &*I; + break; + } + if (auto CS = CallSite (&*I)) { const Function *Callee = CS.getCalledFunction(); if (!Callee || !Intrinsic::isLeaf(Callee->getIntrinsicID())) @@ -244,11 +251,15 @@ void PruneEH::DeleteBasicBlock(BasicBlock *BB) { I->replaceAllUsesWith(UndefValue::get(I->getType())); } - // Get the list of successors of this block. - std::vector<BasicBlock*> Succs(succ_begin(BB), succ_end(BB)); + if (TokenInst) { + changeToUnreachable(TokenInst->getNextNode(), /*UseLLVMTrap=*/false); + } else { + // Get the list of successors of this block. + std::vector<BasicBlock *> Succs(succ_begin(BB), succ_end(BB)); - for (unsigned i = 0, e = Succs.size(); i != e; ++i) - Succs[i]->removePredecessor(BB); + for (unsigned i = 0, e = Succs.size(); i != e; ++i) + Succs[i]->removePredecessor(BB); - BB->eraseFromParent(); + BB->eraseFromParent(); + } } |