From af17b1df84c31cb4f9a09213db9aa3c1e8b910ea Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 20 Jul 2004 01:17:38 +0000 Subject: [PATCH] Implement SimplifyCFG/BrUnwind.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15022 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/SimplifyCFG.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index cc28e54c374..2cf4ab9cded 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -764,12 +764,19 @@ bool llvm::SimplifyCFG(BasicBlock *BB) { } else if (UnwindInst *UI = dyn_cast(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. + // destination with call instructions, and any unconditional branch + // predecessor with an unwind. // std::vector Preds(pred_begin(BB), pred_end(BB)); while (!Preds.empty()) { BasicBlock *Pred = Preds.back(); - if (InvokeInst *II = dyn_cast(Pred->getTerminator())) + if (BranchInst *BI = dyn_cast(Pred->getTerminator())) { + if (BI->isUnconditional()) { + Pred->getInstList().pop_back(); // nuke uncond branch + new UnwindInst(Pred); // Use unwind. + Changed = true; + } + } else if (InvokeInst *II = dyn_cast(Pred->getTerminator())) if (II->getUnwindDest() == BB) { // Insert a new branch instruction before the invoke, because this // is now a fall through...