Fix bug: test/Regression/Transforms/ADCE/2002-07-29-Segfault.ll

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3129 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2002-07-29 22:31:39 +00:00
parent 91b65c0b42
commit 011de07117

View File

@@ -8,6 +8,7 @@
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Type.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/iTerminators.h"
@@ -209,15 +210,45 @@ bool ADCE::doADCE() {
BasicBlock *BB = I;
TerminatorInst *TI = BB->getTerminator();
// Loop over all of the successors, looking for ones that are not alive
for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
// Loop over all of the successors, looking for ones that are not alive.
// We cannot save the number of successors in the terminator instruction
// here because we may remove them if we don't have a postdominator...
//
for (unsigned i = 0; i != TI->getNumSuccessors(); ++i)
if (!AliveBlocks.count(TI->getSuccessor(i))) {
// Scan up the postdominator tree, looking for the first
// postdominator that is alive, and the last postdominator that is
// dead...
//
PostDominatorTree::Node *LastNode = DT[TI->getSuccessor(i)];
// There is a special case here... if there IS no post-dominator for
// the block we have no owhere to point our branch to. Instead,
// convert it to a return. This can only happen if the code
// branched into an infinite loop. Note that this may not be
// desirable, because we _are_ altering the behavior of the code.
// This is a well known drawback of ADCE, so in the future if we
// choose to revisit the decision, this is where it should be.
//
if (LastNode == 0) { // No postdominator!
// Call RemoveSuccessor to transmogrify the terminator instruction
// to not contain the outgoing branch, or to create a new
// terminator if the form fundementally changes (ie unconditional
// branch to return). Note that this will change a branch into an
// infinite loop into a return instruction!
//
RemoveSuccessor(TI, i);
// RemoveSuccessor may replace TI... make sure we have a fresh
// pointer... and e variable.
//
TI = BB->getTerminator();
// Rescan this successor...
--i;
} else {
PostDominatorTree::Node *NextNode = LastNode->getIDom();
while (!AliveBlocks.count(NextNode->getNode())) {
LastNode = NextNode;
NextNode = NextNode->getIDom();
@@ -246,6 +277,7 @@ bool ADCE::doADCE() {
PN->addIncoming(InVal, BB);
}
}
}
// Now loop over all of the instructions in the basic block, telling
// dead instructions to drop their references. This is so that the next