mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 07:34:33 +00:00
Implement SimplifyCFG/BrUnwind.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15022 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c6c9db2fd7
commit
af17b1df84
@ -764,12 +764,19 @@ bool llvm::SimplifyCFG(BasicBlock *BB) {
|
||||
} 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.
|
||||
// destination with call instructions, and any unconditional branch
|
||||
// predecessor with an unwind.
|
||||
//
|
||||
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 (BranchInst *BI = dyn_cast<BranchInst>(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<InvokeInst>(Pred->getTerminator()))
|
||||
if (II->getUnwindDest() == BB) {
|
||||
// Insert a new branch instruction before the invoke, because this
|
||||
// is now a fall through...
|
||||
|
Loading…
x
Reference in New Issue
Block a user