diff options
author | Chris Lattner <sabre@nondot.org> | 2004-02-24 05:54:22 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-02-24 05:54:22 +0000 |
commit | 3cd98f054ae65e558c5c86eb918bde8ba9191445 (patch) | |
tree | d45d5c83dd56097aceec68ffe59efe24f9b99726 /llvm/lib/Transforms/Utils/SimplifyCFG.cpp | |
parent | 6f4b45acf588e528ec5e0186eb3c1ca15dbd52a3 (diff) | |
download | bcm5719-llvm-3cd98f054ae65e558c5c86eb918bde8ba9191445.tar.gz bcm5719-llvm-3cd98f054ae65e558c5c86eb918bde8ba9191445.zip |
Rearrange code a bit
llvm-svn: 11793
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index a268b47505c..c4702b6af72 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -301,36 +301,6 @@ bool llvm::SimplifyCFG(BasicBlock *BB) { assert(BB->getTerminator() && "Degenerate basic block encountered!"); assert(&BB->getParent()->front() != BB && "Can't Simplify entry block!"); - // Check to see if the first instruction in this block is just an unwind. If - // so, replace any invoke instructions which use this as an exception - // destination with call instructions. - // - if (UnwindInst *UI = dyn_cast<UnwindInst>(BB->getTerminator())) - if (BB->begin() == BasicBlock::iterator(UI)) { // Empty block? - std::vector<BasicBlock*> Preds(pred_begin(BB), pred_end(BB)); - while (!Preds.empty()) { - BasicBlock *Pred = Preds.back(); - if (InvokeInst *II = dyn_cast<InvokeInst>(Pred->getTerminator())) - if (II->getUnwindDest() == BB) { - // Insert a new branch instruction before the invoke, because this - // is now a fall through... - BranchInst *BI = new BranchInst(II->getNormalDest(), II); - Pred->getInstList().remove(II); // Take out of symbol table - - // Insert the call now... - std::vector<Value*> Args(II->op_begin()+3, II->op_end()); - CallInst *CI = new CallInst(II->getCalledValue(), Args, - II->getName(), BI); - // If the invoke produced a value, the Call now does instead - II->replaceAllUsesWith(CI); - delete II; - Changed = true; - } - - Preds.pop_back(); - } - } - // Remove basic blocks that have no predecessors... which are unreachable. if (pred_begin(BB) == pred_end(BB)) { //cerr << "Removing BB: \n" << BB; @@ -473,6 +443,33 @@ bool llvm::SimplifyCFG(BasicBlock *BB) { return true; } } + } else if (UnwindInst *UI = dyn_cast<UnwindInst>(BB->begin())) { + // Check to see if the first instruction in this block is just an unwind. + // If so, replace any invoke instructions which use this as an exception + // destination with call instructions. + // + std::vector<BasicBlock*> Preds(pred_begin(BB), pred_end(BB)); + while (!Preds.empty()) { + BasicBlock *Pred = Preds.back(); + if (InvokeInst *II = dyn_cast<InvokeInst>(Pred->getTerminator())) + if (II->getUnwindDest() == BB) { + // Insert a new branch instruction before the invoke, because this + // is now a fall through... + BranchInst *BI = new BranchInst(II->getNormalDest(), II); + Pred->getInstList().remove(II); // Take out of symbol table + + // Insert the call now... + std::vector<Value*> Args(II->op_begin()+3, II->op_end()); + CallInst *CI = new CallInst(II->getCalledValue(), Args, + II->getName(), BI); + // If the invoke produced a value, the Call now does instead + II->replaceAllUsesWith(CI); + delete II; + Changed = true; + } + + Preds.pop_back(); + } } // Merge basic blocks into their predecessor if there is only one distinct |