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