summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/IPO/PruneEH.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-01-23 05:41:29 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-01-23 05:41:29 +0000
commit4bf0b6b4838617764436aa5825776c9c457a2c98 (patch)
treee0fc3d252e75bdc5169e3ec420757d9e922ce486 /llvm/lib/Transforms/IPO/PruneEH.cpp
parent2d728ec55d99c04147ee86e451db26319fcd766c (diff)
downloadbcm5719-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.cpp21
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();
+ }
}
OpenPOWER on IntegriCloud