diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2008-03-09 04:55:16 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2008-03-09 04:55:16 +0000 |
commit | 4d0ed842b1495c68f2ad592ae790b0fecabcb43f (patch) | |
tree | 230d059ae06063e01c4aab287ace6802c4478872 /llvm/lib/Transforms | |
parent | d2d3441ddb86993e179f48e89b364191dd27f955 (diff) | |
download | bcm5719-llvm-4d0ed842b1495c68f2ad592ae790b0fecabcb43f.tar.gz bcm5719-llvm-4d0ed842b1495c68f2ad592ae790b0fecabcb43f.zip |
Prune the unwind_to labels on BBs that don't need them. Another step in the
removal of invoke, PR1269.
llvm-svn: 48084
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/IPO/PruneEH.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/IPO/PruneEH.cpp b/llvm/lib/Transforms/IPO/PruneEH.cpp index 4e621dc2f93..fa8b95a2ade 100644 --- a/llvm/lib/Transforms/IPO/PruneEH.cpp +++ b/llvm/lib/Transforms/IPO/PruneEH.cpp @@ -32,6 +32,7 @@ using namespace llvm; STATISTIC(NumRemoved, "Number of invokes removed"); STATISTIC(NumUnreach, "Number of noreturn calls optimized"); +STATISTIC(NumBBUnwind, "Number of unwind_to removed from blocks"); namespace { struct VISIBILITY_HIDDEN PruneEH : public CallGraphSCCPass { @@ -153,6 +154,8 @@ bool PruneEH::runOnSCC(const std::vector<CallGraphNode *> &SCC) { bool PruneEH::SimplifyFunction(Function *F) { bool MadeChange = false; for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { + bool couldUnwind = false; + if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator())) if (II->doesNotThrow()) { SmallVector<Value*, 8> Args(II->op_begin()+3, II->op_end()); @@ -182,10 +185,11 @@ bool PruneEH::SimplifyFunction(Function *F) { ++NumRemoved; MadeChange = true; - } + } else + couldUnwind = true; for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) - if (CallInst *CI = dyn_cast<CallInst>(I++)) + if (CallInst *CI = dyn_cast<CallInst>(I++)) { if (CI->doesNotReturn() && !isa<UnreachableInst>(I)) { // This call calls a function that cannot return. Insert an // unreachable instruction after it and simplify the code. Do this @@ -201,8 +205,17 @@ bool PruneEH::SimplifyFunction(Function *F) { MadeChange = true; ++NumUnreach; break; - } + } else if (!CI->doesNotThrow()) + couldUnwind = true; + } + // Strip 'unwindTo' off of BBs that have no calls/invokes without nounwind. + if (!couldUnwind && BB->getUnwindDest()) { + MadeChange = true; + ++NumBBUnwind; + BB->getUnwindDest()->removePredecessor(BB, false, true); + BB->setUnwindDest(NULL); + } } return MadeChange; } |