PruneEH.cpp revision 93e985f1b17aef62d58e3198a4604f9f6cfe8d19
13e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner//===- PruneEH.cpp - Pass which deletes unused exception handlers ---------===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under 6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 93e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner// 103e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner// This file implements a simple interprocedural pass which walks the 113e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner// call-graph, turning invoke instructions into calls, iff the callee cannot 123e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner// throw an exception. It implements this as a bottom-up traversal of the 133e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner// call-graph. 143e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner// 153e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner//===----------------------------------------------------------------------===// 163e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 1786453c52ba02e743d29c08456e51006500041456Chris Lattner#define DEBUG_TYPE "prune-eh" 181e2385b941242f2f96398dc62767420622856149Chris Lattner#include "llvm/Transforms/IPO.h" 193e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner#include "llvm/CallGraphSCCPass.h" 20d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner#include "llvm/Constants.h" 213e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner#include "llvm/Function.h" 223e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner#include "llvm/Intrinsics.h" 2347b14a4a6a455c7be169cfd312fcbe796f0ad426Misha Brukman#include "llvm/Instructions.h" 243e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner#include "llvm/Analysis/CallGraph.h" 2593e985f1b17aef62d58e3198a4604f9f6cfe8d19Chris Lattner#include "llvm/ADT/SmallVector.h" 26551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/Statistic.h" 27d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner#include "llvm/Support/CFG.h" 289133fe28954d498fc4de13064c7d65bd811de02cReid Spencer#include "llvm/Support/Compiler.h" 293e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner#include <set> 30f26801b0e6ab958001f796fd42367e93e9feb96eChris Lattner#include <algorithm> 311e2385b941242f2f96398dc62767420622856149Chris Lattnerusing namespace llvm; 32d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 3386453c52ba02e743d29c08456e51006500041456Chris LattnerSTATISTIC(NumRemoved, "Number of invokes removed"); 3486453c52ba02e743d29c08456e51006500041456Chris LattnerSTATISTIC(NumUnreach, "Number of noreturn calls optimized"); 353e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 3686453c52ba02e743d29c08456e51006500041456Chris Lattnernamespace { 379133fe28954d498fc4de13064c7d65bd811de02cReid Spencer struct VISIBILITY_HIDDEN PruneEH : public CallGraphSCCPass { 38bc9fa589efdfba8c86a8dee4f8e92b79025a7419Chris Lattner /// DoesNotUnwind - This set contains all of the functions which we have 39d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner /// determined cannot unwind. 40bc9fa589efdfba8c86a8dee4f8e92b79025a7419Chris Lattner std::set<CallGraphNode*> DoesNotUnwind; 413e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 42d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner /// DoesNotReturn - This set contains all of the functions which we have 43d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner /// determined cannot return normally (but might unwind). 44d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner std::set<CallGraphNode*> DoesNotReturn; 45d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 463e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // runOnSCC - Analyze the SCC, performing the transformation if possible. 473e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner bool runOnSCC(const std::vector<CallGraphNode *> &SCC); 48d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 49d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner bool SimplifyFunction(Function *F); 50d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner void DeleteBasicBlock(BasicBlock *BB); 513e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner }; 527f8897f22e88271cfa114998a4d6088e7c8e8e11Chris Lattner RegisterPass<PruneEH> X("prune-eh", "Remove unused exception handling info"); 533e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner} 543e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 55c71ca3cdd2d7a08b043ebb717cad0beadaf47450Devang PatelPass *llvm::createPruneEHPass() { return new PruneEH(); } 56f6fb96f5591de185f45ba8cd6ba3a3d98e04a86dChris Lattner 573e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 583e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattnerbool PruneEH::runOnSCC(const std::vector<CallGraphNode *> &SCC) { 593e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner CallGraph &CG = getAnalysis<CallGraph>(); 60d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner bool MadeChange = false; 61d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 62d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // First pass, scan all of the functions in the SCC, simplifying them 63d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // according to what we know. 64d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (unsigned i = 0, e = SCC.size(); i != e; ++i) 65d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (Function *F = SCC[i]->getFunction()) 66d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner MadeChange |= SimplifyFunction(F); 673e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 68d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Next, check to see if any callees might throw or if there are any external 693e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // functions in this SCC: if so, we cannot prune any functions in this SCC. 70ee5457cbe88b7f691f774de8515d9a94226d1b00Chris Lattner // If this SCC includes the unwind instruction, we KNOW it throws, so 713e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // obviously the SCC might throw. 723e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // 73d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner bool SCCMightUnwind = false, SCCMightReturn = false; 74d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (unsigned i = 0, e = SCC.size(); 75d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner (!SCCMightUnwind || !SCCMightReturn) && i != e; ++i) { 76d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner Function *F = SCC[i]->getFunction(); 775cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (F == 0 || (F->isDeclaration() && !F->getIntrinsicID())) { 78bc9fa589efdfba8c86a8dee4f8e92b79025a7419Chris Lattner SCCMightUnwind = true; 79d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner SCCMightReturn = true; 80d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner } else { 815cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (F->isDeclaration()) 82d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner SCCMightReturn = true; 83d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 84d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner // Check to see if this function performs an unwind or calls an 85d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner // unwinding function. 86d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { 87d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner if (isa<UnwindInst>(BB->getTerminator())) { // Uses unwind! 88bc9fa589efdfba8c86a8dee4f8e92b79025a7419Chris Lattner SCCMightUnwind = true; 89d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } else if (isa<ReturnInst>(BB->getTerminator())) { 90d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner SCCMightReturn = true; 91d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner } 92e0def04e430d741daa48f69b05cfe132adb6db11Chris Lattner 93d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner // Invoke instructions don't allow unwinding to continue, so we are 94d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner // only interested in call instructions. 95d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (!SCCMightUnwind) 96d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) 97d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (CallInst *CI = dyn_cast<CallInst>(I)) { 98d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (Function *Callee = CI->getCalledFunction()) { 99d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner CallGraphNode *CalleeNode = CG[Callee]; 100d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // If the callee is outside our current SCC, or if it is not 101d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // known to throw, then we might throw also. 102d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (std::find(SCC.begin(), SCC.end(), CalleeNode) == SCC.end()&& 103d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner !DoesNotUnwind.count(CalleeNode)) { 104d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner SCCMightUnwind = true; 105d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner break; 106d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } 107d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } else { 108d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Indirect call, it might throw. 109bc9fa589efdfba8c86a8dee4f8e92b79025a7419Chris Lattner SCCMightUnwind = true; 110e0def04e430d741daa48f69b05cfe132adb6db11Chris Lattner break; 111e0def04e430d741daa48f69b05cfe132adb6db11Chris Lattner } 112e0def04e430d741daa48f69b05cfe132adb6db11Chris Lattner } 113d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (SCCMightUnwind && SCCMightReturn) break; 114ad9b5f31eaa739940c9ec540cc231afb99343304Chris Lattner } 115d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner } 116d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner } 1173e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 118d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // If the SCC doesn't unwind or doesn't throw, note this fact. 119d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (!SCCMightUnwind) 120d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (unsigned i = 0, e = SCC.size(); i != e; ++i) 121bc9fa589efdfba8c86a8dee4f8e92b79025a7419Chris Lattner DoesNotUnwind.insert(SCC[i]); 122d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (!SCCMightReturn) 123d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (unsigned i = 0, e = SCC.size(); i != e; ++i) 124d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner DoesNotReturn.insert(SCC[i]); 1253e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 126d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (unsigned i = 0, e = SCC.size(); i != e; ++i) { 1273e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // Convert any invoke instructions to non-throwing functions in this node 1283e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // into call instructions with a branch. This makes the exception blocks 1293e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // dead. 1303e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner if (Function *F = SCC[i]->getFunction()) 131d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner MadeChange |= SimplifyFunction(F); 1323e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner } 1333e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 134fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman return MadeChange; 1353e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner} 136d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 137d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 138d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner// SimplifyFunction - Given information about callees, simplify the specified 139d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner// function if we have invokes to non-unwinding functions or code after calls to 140d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner// no-return functions. 141d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattnerbool PruneEH::SimplifyFunction(Function *F) { 142d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner CallGraph &CG = getAnalysis<CallGraph>(); 143d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner bool MadeChange = false; 144d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { 145d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator())) 146d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (Function *F = II->getCalledFunction()) 147d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (DoesNotUnwind.count(CG[F])) { 14893e985f1b17aef62d58e3198a4604f9f6cfe8d19Chris Lattner SmallVector<Value*, 8> Args(II->op_begin()+3, II->op_end()); 149046800a7125cd497613efc0e1ea15cb595666585Chris Lattner // Insert a call instruction before the invoke. 150f201dbc1a4a638659ec3916785196e2c204c7755Chris Lattner CallInst *Call = new CallInst(II->getCalledValue(), 15193e985f1b17aef62d58e3198a4604f9f6cfe8d19Chris Lattner &Args[0], Args.size(), "", II); 152046800a7125cd497613efc0e1ea15cb595666585Chris Lattner Call->takeName(II); 153f201dbc1a4a638659ec3916785196e2c204c7755Chris Lattner Call->setCallingConv(II->getCallingConv()); 15400b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 155d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Anything that used the value produced by the invoke instruction 156d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // now uses the value produced by the call instruction. 157d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner II->replaceAllUsesWith(Call); 158d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner BasicBlock *UnwindBlock = II->getUnwindDest(); 159d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner UnwindBlock->removePredecessor(II->getParent()); 16000b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 161d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Insert a branch to the normal destination right before the 162d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // invoke. 163d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner new BranchInst(II->getNormalDest(), II); 16400b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 165d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Finally, delete the invoke instruction! 166d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner BB->getInstList().pop_back(); 167d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 168d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // If the unwind block is now dead, nuke it. 169d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (pred_begin(UnwindBlock) == pred_end(UnwindBlock)) 170d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner DeleteBasicBlock(UnwindBlock); // Delete the new BB. 17100b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 172d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner ++NumRemoved; 173d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner MadeChange = true; 174d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } 175d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 176209a0aea220548b96c80963062958b97f4ee394fChris Lattner for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) 177d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (CallInst *CI = dyn_cast<CallInst>(I++)) 178d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (Function *Callee = CI->getCalledFunction()) 179d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (DoesNotReturn.count(CG[Callee]) && !isa<UnreachableInst>(I)) { 180d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // This call calls a function that cannot return. Insert an 181d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // unreachable instruction after it and simplify the code. Do this 182d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // by splitting the BB, adding the unreachable, then deleting the 183d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // new BB. 184d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner BasicBlock *New = BB->splitBasicBlock(I); 185d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 186d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Remove the uncond branch and add an unreachable. 187d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner BB->getInstList().pop_back(); 188d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner new UnreachableInst(BB); 189d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 190d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner DeleteBasicBlock(New); // Delete the new BB. 191d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner MadeChange = true; 192d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner ++NumUnreach; 193d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner break; 194d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } 195d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 196d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } 197d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner return MadeChange; 198d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner} 199d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 200d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner/// DeleteBasicBlock - remove the specified basic block from the program, 201d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner/// updating the callgraph to reflect any now-obsolete edges due to calls that 202d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner/// exist in the BB. 203d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattnervoid PruneEH::DeleteBasicBlock(BasicBlock *BB) { 204d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner assert(pred_begin(BB) == pred_end(BB) && "BB is not dead!"); 205d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner CallGraph &CG = getAnalysis<CallGraph>(); 206d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 207d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner CallGraphNode *CGN = CG[BB->getParent()]; 208d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (BasicBlock::iterator I = BB->end(), E = BB->begin(); I != E; ) { 209d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner --I; 210d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (CallInst *CI = dyn_cast<CallInst>(I)) { 211d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (Function *Callee = CI->getCalledFunction()) 212d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner CGN->removeCallEdgeTo(CG[Callee]); 213d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } else if (InvokeInst *II = dyn_cast<InvokeInst>(I)) { 214d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (Function *Callee = II->getCalledFunction()) 215d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner CGN->removeCallEdgeTo(CG[Callee]); 216d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } 217d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (!I->use_empty()) 218d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner I->replaceAllUsesWith(UndefValue::get(I->getType())); 219d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } 220d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 221d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Get the list of successors of this block. 222d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner std::vector<BasicBlock*> Succs(succ_begin(BB), succ_end(BB)); 223d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 224d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (unsigned i = 0, e = Succs.size(); i != e; ++i) 225d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner Succs[i]->removePredecessor(BB); 22600b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 227d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner BB->eraseFromParent(); 228d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner} 229