PruneEH.cpp revision 00b16889ab461b7ecef1c91ade101186b7f1fce2
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 171e2385b941242f2f96398dc62767420622856149Chris Lattner#include "llvm/Transforms/IPO.h" 183e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner#include "llvm/CallGraphSCCPass.h" 19d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner#include "llvm/Constants.h" 203e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner#include "llvm/Function.h" 213e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner#include "llvm/Intrinsics.h" 2247b14a4a6a455c7be169cfd312fcbe796f0ad426Misha Brukman#include "llvm/Instructions.h" 233e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner#include "llvm/Analysis/CallGraph.h" 24551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/Statistic.h" 25d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner#include "llvm/Support/CFG.h" 263e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner#include <set> 27f26801b0e6ab958001f796fd42367e93e9feb96eChris Lattner#include <algorithm> 281e2385b941242f2f96398dc62767420622856149Chris Lattnerusing namespace llvm; 29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 303e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattnernamespace { 313e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner Statistic<> NumRemoved("prune-eh", "Number of invokes removed"); 32d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner Statistic<> NumUnreach("prune-eh", "Number of noreturn calls optimized"); 333e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 343e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner struct PruneEH : public CallGraphSCCPass { 35bc9fa589efdfba8c86a8dee4f8e92b79025a7419Chris Lattner /// DoesNotUnwind - This set contains all of the functions which we have 36d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner /// determined cannot unwind. 37bc9fa589efdfba8c86a8dee4f8e92b79025a7419Chris Lattner std::set<CallGraphNode*> DoesNotUnwind; 383e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 39d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner /// DoesNotReturn - This set contains all of the functions which we have 40d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner /// determined cannot return normally (but might unwind). 41d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner std::set<CallGraphNode*> DoesNotReturn; 42d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 433e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // runOnSCC - Analyze the SCC, performing the transformation if possible. 443e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner bool runOnSCC(const std::vector<CallGraphNode *> &SCC); 45d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 46d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner bool SimplifyFunction(Function *F); 47d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner void DeleteBasicBlock(BasicBlock *BB); 483e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner }; 493e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner RegisterOpt<PruneEH> X("prune-eh", "Remove unused exception handling info"); 503e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner} 513e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 52b12914bfc0f76a7a48357162d5f4c39a1343e69bChris LattnerModulePass *llvm::createPruneEHPass() { return new PruneEH(); } 53f6fb96f5591de185f45ba8cd6ba3a3d98e04a86dChris Lattner 543e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 553e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattnerbool PruneEH::runOnSCC(const std::vector<CallGraphNode *> &SCC) { 563e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner CallGraph &CG = getAnalysis<CallGraph>(); 57d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner bool MadeChange = false; 58d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 59d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // First pass, scan all of the functions in the SCC, simplifying them 60d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // according to what we know. 61d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (unsigned i = 0, e = SCC.size(); i != e; ++i) 62d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (Function *F = SCC[i]->getFunction()) 63d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner MadeChange |= SimplifyFunction(F); 643e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 65d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Next, check to see if any callees might throw or if there are any external 663e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // functions in this SCC: if so, we cannot prune any functions in this SCC. 67ee5457cbe88b7f691f774de8515d9a94226d1b00Chris Lattner // If this SCC includes the unwind instruction, we KNOW it throws, so 683e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // obviously the SCC might throw. 693e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // 70d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner bool SCCMightUnwind = false, SCCMightReturn = false; 71d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (unsigned i = 0, e = SCC.size(); 72d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner (!SCCMightUnwind || !SCCMightReturn) && i != e; ++i) { 73d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner Function *F = SCC[i]->getFunction(); 74d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner if (F == 0 || (F->isExternal() && !F->getIntrinsicID())) { 75bc9fa589efdfba8c86a8dee4f8e92b79025a7419Chris Lattner SCCMightUnwind = true; 76d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner SCCMightReturn = true; 77d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner } else { 78d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (F->isExternal()) 79d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner SCCMightReturn = true; 80d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 81d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner // Check to see if this function performs an unwind or calls an 82d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner // unwinding function. 83d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { 84d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner if (isa<UnwindInst>(BB->getTerminator())) { // Uses unwind! 85bc9fa589efdfba8c86a8dee4f8e92b79025a7419Chris Lattner SCCMightUnwind = true; 86d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } else if (isa<ReturnInst>(BB->getTerminator())) { 87d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner SCCMightReturn = true; 88d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner } 89e0def04e430d741daa48f69b05cfe132adb6db11Chris Lattner 90d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner // Invoke instructions don't allow unwinding to continue, so we are 91d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner // only interested in call instructions. 92d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (!SCCMightUnwind) 93d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) 94d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (CallInst *CI = dyn_cast<CallInst>(I)) { 95d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (Function *Callee = CI->getCalledFunction()) { 96d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner CallGraphNode *CalleeNode = CG[Callee]; 97d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // If the callee is outside our current SCC, or if it is not 98d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // known to throw, then we might throw also. 99d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (std::find(SCC.begin(), SCC.end(), CalleeNode) == SCC.end()&& 100d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner !DoesNotUnwind.count(CalleeNode)) { 101d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner SCCMightUnwind = true; 102d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner break; 103d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } 104d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } else { 105d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Indirect call, it might throw. 106bc9fa589efdfba8c86a8dee4f8e92b79025a7419Chris Lattner SCCMightUnwind = true; 107e0def04e430d741daa48f69b05cfe132adb6db11Chris Lattner break; 108e0def04e430d741daa48f69b05cfe132adb6db11Chris Lattner } 109e0def04e430d741daa48f69b05cfe132adb6db11Chris Lattner } 110d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (SCCMightUnwind && SCCMightReturn) break; 111ad9b5f31eaa739940c9ec540cc231afb99343304Chris Lattner } 112d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner } 113d08ddd3300d5244012c1765d34b21cc9e11a80adChris Lattner } 1143e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 115d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // If the SCC doesn't unwind or doesn't throw, note this fact. 116d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (!SCCMightUnwind) 117d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (unsigned i = 0, e = SCC.size(); i != e; ++i) 118bc9fa589efdfba8c86a8dee4f8e92b79025a7419Chris Lattner DoesNotUnwind.insert(SCC[i]); 119d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (!SCCMightReturn) 120d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (unsigned i = 0, e = SCC.size(); i != e; ++i) 121d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner DoesNotReturn.insert(SCC[i]); 1223e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 123d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (unsigned i = 0, e = SCC.size(); i != e; ++i) { 1243e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // Convert any invoke instructions to non-throwing functions in this node 1253e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // into call instructions with a branch. This makes the exception blocks 1263e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner // dead. 1273e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner if (Function *F = SCC[i]->getFunction()) 128d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner MadeChange |= SimplifyFunction(F); 1293e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner } 1303e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner 131fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman return MadeChange; 1323e64b2e1a44b0bef896d645e9b293ab84dc16ab8Chris Lattner} 133d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 134d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 135d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner// SimplifyFunction - Given information about callees, simplify the specified 136d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner// function if we have invokes to non-unwinding functions or code after calls to 137d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner// no-return functions. 138d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattnerbool PruneEH::SimplifyFunction(Function *F) { 139d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner CallGraph &CG = getAnalysis<CallGraph>(); 140d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner bool MadeChange = false; 141d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { 142d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator())) 143d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (Function *F = II->getCalledFunction()) 144d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (DoesNotUnwind.count(CG[F])) { 145d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Insert a call instruction before the invoke... 146d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner std::string Name = II->getName(); II->setName(""); 147f201dbc1a4a638659ec3916785196e2c204c7755Chris Lattner CallInst *Call = new CallInst(II->getCalledValue(), 148f201dbc1a4a638659ec3916785196e2c204c7755Chris Lattner std::vector<Value*>(II->op_begin()+3, 149f201dbc1a4a638659ec3916785196e2c204c7755Chris Lattner II->op_end()), 150f201dbc1a4a638659ec3916785196e2c204c7755Chris Lattner Name, II); 151f201dbc1a4a638659ec3916785196e2c204c7755Chris Lattner Call->setCallingConv(II->getCallingConv()); 15200b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 153d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Anything that used the value produced by the invoke instruction 154d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // now uses the value produced by the call instruction. 155d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner II->replaceAllUsesWith(Call); 156d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner BasicBlock *UnwindBlock = II->getUnwindDest(); 157d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner UnwindBlock->removePredecessor(II->getParent()); 15800b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 159d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Insert a branch to the normal destination right before the 160d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // invoke. 161d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner new BranchInst(II->getNormalDest(), II); 16200b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 163d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Finally, delete the invoke instruction! 164d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner BB->getInstList().pop_back(); 165d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 166d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // If the unwind block is now dead, nuke it. 167d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (pred_begin(UnwindBlock) == pred_end(UnwindBlock)) 168d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner DeleteBasicBlock(UnwindBlock); // Delete the new BB. 16900b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 170d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner ++NumRemoved; 171d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner MadeChange = true; 172d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } 173d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 174209a0aea220548b96c80963062958b97f4ee394fChris Lattner for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) 175d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (CallInst *CI = dyn_cast<CallInst>(I++)) 176d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (Function *Callee = CI->getCalledFunction()) 177d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (DoesNotReturn.count(CG[Callee]) && !isa<UnreachableInst>(I)) { 178d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // This call calls a function that cannot return. Insert an 179d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // unreachable instruction after it and simplify the code. Do this 180d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // by splitting the BB, adding the unreachable, then deleting the 181d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // new BB. 182d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner BasicBlock *New = BB->splitBasicBlock(I); 183d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 184d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Remove the uncond branch and add an unreachable. 185d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner BB->getInstList().pop_back(); 186d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner new UnreachableInst(BB); 187d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 188d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner DeleteBasicBlock(New); // Delete the new BB. 189d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner MadeChange = true; 190d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner ++NumUnreach; 191d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner break; 192d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } 193d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 194d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } 195d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner return MadeChange; 196d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner} 197d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 198d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner/// DeleteBasicBlock - remove the specified basic block from the program, 199d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner/// updating the callgraph to reflect any now-obsolete edges due to calls that 200d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner/// exist in the BB. 201d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattnervoid PruneEH::DeleteBasicBlock(BasicBlock *BB) { 202d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner assert(pred_begin(BB) == pred_end(BB) && "BB is not dead!"); 203d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner CallGraph &CG = getAnalysis<CallGraph>(); 204d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 205d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner CallGraphNode *CGN = CG[BB->getParent()]; 206d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (BasicBlock::iterator I = BB->end(), E = BB->begin(); I != E; ) { 207d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner --I; 208d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (CallInst *CI = dyn_cast<CallInst>(I)) { 209d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (Function *Callee = CI->getCalledFunction()) 210d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner CGN->removeCallEdgeTo(CG[Callee]); 211d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } else if (InvokeInst *II = dyn_cast<InvokeInst>(I)) { 212d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (Function *Callee = II->getCalledFunction()) 213d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner CGN->removeCallEdgeTo(CG[Callee]); 214d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } 215d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner if (!I->use_empty()) 216d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner I->replaceAllUsesWith(UndefValue::get(I->getType())); 217d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner } 218d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 219d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner // Get the list of successors of this block. 220d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner std::vector<BasicBlock*> Succs(succ_begin(BB), succ_end(BB)); 221d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner 222d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner for (unsigned i = 0, e = Succs.size(); i != e; ++i) 223d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner Succs[i]->removePredecessor(BB); 22400b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 225d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner BB->eraseFromParent(); 226d651f441ae4c5a9e2c77a9a38604f83d0d4261eaChris Lattner} 227