mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-15 22:32:35 +00:00
Fix a bug in the unreachable block elim pass. Dropping all references on a
basic block clear()'s all of the operands lists, including phis. This caused removePredecessor to get confused later. Because of this, we just nuke (without prejudice) PHI nodes in unreachable blocks. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14635 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ba466362c4
commit
7f0566c123
@ -21,6 +21,8 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/iPHINode.h"
|
||||
#include "llvm/Constant.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/CFG.h"
|
||||
@ -52,10 +54,15 @@ bool UnreachableBlockElim::runOnFunction(Function &F) {
|
||||
std::vector<BasicBlock*> DeadBlocks;
|
||||
for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
|
||||
if (!Reachable.count(I)) {
|
||||
DeadBlocks.push_back(I);
|
||||
for (succ_iterator SI = succ_begin(&*I), E = succ_end(&*I); SI != E; ++SI)
|
||||
(*SI)->removePredecessor(I);
|
||||
I->dropAllReferences();
|
||||
BasicBlock *BB = I;
|
||||
DeadBlocks.push_back(BB);
|
||||
while (PHINode *PN = dyn_cast<PHINode>(BB->begin())) {
|
||||
PN->replaceAllUsesWith(Constant::getNullValue(PN->getType()));
|
||||
BB->getInstList().pop_front();
|
||||
}
|
||||
for (succ_iterator SI = succ_begin(BB), E = succ_end(BB); SI != E; ++SI)
|
||||
(*SI)->removePredecessor(BB);
|
||||
BB->dropAllReferences();
|
||||
}
|
||||
|
||||
if (DeadBlocks.empty()) return false;
|
||||
|
Loading…
x
Reference in New Issue
Block a user