From: Chris Lattner Date: Mon, 16 Jun 2003 12:10:45 +0000 (+0000) Subject: Fix bug: ADCE/2003-06-11-InvalidCFG.ll X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=34e353e56064d600d76b05a54095cc74bbbb2ea8;p=oota-llvm.git Fix bug: ADCE/2003-06-11-InvalidCFG.ll This was because we were deleting large chunks of functions without an exit block, because the post-dominance information was not useful. This broke crafty and twolf. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6698 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/ADCE.cpp b/lib/Transforms/Scalar/ADCE.cpp index 55a4f5badc5..15ae7677f22 100644 --- a/lib/Transforms/Scalar/ADCE.cpp +++ b/lib/Transforms/Scalar/ADCE.cpp @@ -166,6 +166,16 @@ bool ADCE::doADCE() { } } + // Check to ensure we have an exit node for this CFG. If we don't, we won't + // have any post-dominance information, thus we cannot perform our + // transformations safely. + // + PostDominatorTree &DT = getAnalysis(); + if (DT[&Func->getEntryNode()] == 0) { + WorkList.clear(); + return MadeChanges; + } + DEBUG(std::cerr << "Processing work list\n"); // AliveBlocks - Set of basic blocks that we know have instructions that are @@ -208,19 +218,18 @@ bool ADCE::doADCE() { DEBUG( std::cerr << "Current Function: X = Live\n"; - for (Function::iterator I = Func->begin(), E = Func->end(); I != E; ++I) + for (Function::iterator I = Func->begin(), E = Func->end(); I != E; ++I){ + std::cerr << I->getName() << ":\t" + << (AliveBlocks.count(I) ? "LIVE\n" : "DEAD\n"); for (BasicBlock::iterator BI = I->begin(), BE = I->end(); BI != BE; ++BI){ if (LiveSet.count(BI)) std::cerr << "X "; std::cerr << *BI; } - ); + }); // Find the first postdominator of the entry node that is alive. Make it the // new entry node... // - PostDominatorTree &DT = getAnalysis(); - - if (AliveBlocks.size() == Func->size()) { // No dead blocks? for (Function::iterator I = Func->begin(), E = Func->end(); I != E; ++I) // Loop over all of the instructions in the function, telling dead