mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
Fix PR8445: a block with no predecessors may be the entry block, in which case
it isn't unreachable and should not be zapped. The check for the entry block was missing in one case: a block containing a unwind instruction. While there, do some small cleanups: "M" is not a great name for a Function* (it would be more appropriate for a Module*), change it to "Fn"; use Fn in more places. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117224 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c052a8c772
commit
5f28475b30
@ -1720,15 +1720,14 @@ static bool SimplifyCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI) {
|
|||||||
|
|
||||||
bool SimplifyCFGOpt::run(BasicBlock *BB) {
|
bool SimplifyCFGOpt::run(BasicBlock *BB) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
Function *M = BB->getParent();
|
Function *Fn = BB->getParent();
|
||||||
|
|
||||||
assert(BB && BB->getParent() && "Block not embedded in function!");
|
assert(BB && Fn && "Block not embedded in function!");
|
||||||
assert(BB->getTerminator() && "Degenerate basic block encountered!");
|
assert(BB->getTerminator() && "Degenerate basic block encountered!");
|
||||||
|
|
||||||
// Remove basic blocks that have no predecessors (except the entry block)...
|
// Remove basic blocks that have no predecessors (except the entry block)...
|
||||||
// or that just have themself as a predecessor. These are unreachable.
|
// or that just have themself as a predecessor. These are unreachable.
|
||||||
if ((pred_begin(BB) == pred_end(BB) &&
|
if ((pred_begin(BB) == pred_end(BB) && BB != &Fn->getEntryBlock()) ||
|
||||||
&BB->getParent()->getEntryBlock() != BB) ||
|
|
||||||
BB->getSinglePredecessor() == BB) {
|
BB->getSinglePredecessor() == BB) {
|
||||||
DEBUG(dbgs() << "Removing BB: \n" << *BB);
|
DEBUG(dbgs() << "Removing BB: \n" << *BB);
|
||||||
DeleteDeadBlock(BB);
|
DeleteDeadBlock(BB);
|
||||||
@ -1798,7 +1797,7 @@ bool SimplifyCFGOpt::run(BasicBlock *BB) {
|
|||||||
// If we eliminated all predecessors of the block, delete the block now.
|
// If we eliminated all predecessors of the block, delete the block now.
|
||||||
if (pred_begin(BB) == pred_end(BB))
|
if (pred_begin(BB) == pred_end(BB))
|
||||||
// We know there are no successors, so just nuke the block.
|
// We know there are no successors, so just nuke the block.
|
||||||
M->getBasicBlockList().erase(BB);
|
Fn->getBasicBlockList().erase(BB);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1847,10 +1846,10 @@ bool SimplifyCFGOpt::run(BasicBlock *BB) {
|
|||||||
Preds.pop_back();
|
Preds.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this block is now dead, remove it.
|
// If this block is now dead (and isn't the entry block), remove it.
|
||||||
if (pred_begin(BB) == pred_end(BB)) {
|
if (pred_begin(BB) == pred_end(BB) && BB != &Fn->getEntryBlock()) {
|
||||||
// We know there are no successors, so just nuke the block.
|
// We know there are no successors, so just nuke the block.
|
||||||
M->getBasicBlockList().erase(BB);
|
Fn->getBasicBlockList().erase(BB);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1880,7 +1879,7 @@ bool SimplifyCFGOpt::run(BasicBlock *BB) {
|
|||||||
while (isa<DbgInfoIntrinsic>(BBI))
|
while (isa<DbgInfoIntrinsic>(BBI))
|
||||||
++BBI;
|
++BBI;
|
||||||
if (BBI->isTerminator()) // Terminator is the only non-phi instruction!
|
if (BBI->isTerminator()) // Terminator is the only non-phi instruction!
|
||||||
if (BB != &BB->getParent()->getEntryBlock())
|
if (BB != &Fn->getEntryBlock())
|
||||||
if (TryToSimplifyUncondBranchFromEmptyBlock(BB))
|
if (TryToSimplifyUncondBranchFromEmptyBlock(BB))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@ -2050,10 +2049,9 @@ bool SimplifyCFGOpt::run(BasicBlock *BB) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If this block is now dead, remove it.
|
// If this block is now dead, remove it.
|
||||||
if (pred_begin(BB) == pred_end(BB) &&
|
if (pred_begin(BB) == pred_end(BB) && BB != &Fn->getEntryBlock()) {
|
||||||
BB != &BB->getParent()->getEntryBlock()) {
|
|
||||||
// We know there are no successors, so just nuke the block.
|
// We know there are no successors, so just nuke the block.
|
||||||
M->getBasicBlockList().erase(BB);
|
Fn->getBasicBlockList().erase(BB);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
; RUN: opt %s -simplifycfg -disable-output
|
||||||
|
; PR8445
|
||||||
|
|
||||||
|
define void @test() {
|
||||||
|
unwind
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user