From d7f268d4189c2945f4752e21e6f4c91d5d814649 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 23 Jan 2003 02:12:18 +0000 Subject: [PATCH] Fix bug: ADCE/2003-01-22-PredecessorProblem.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5405 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/ADCE.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/lib/Transforms/Scalar/ADCE.cpp b/lib/Transforms/Scalar/ADCE.cpp index e2e9e86216c..24ccee60344 100644 --- a/lib/Transforms/Scalar/ADCE.cpp +++ b/lib/Transforms/Scalar/ADCE.cpp @@ -331,10 +331,17 @@ bool ADCE::doADCE() { } } - // Loop over all of the basic blocks in the function, dropping references of - // the dead basic blocks + // We make changes if there are any dead blocks in the function... + if (unsigned NumDeadBlocks = Func->size() - AliveBlocks.size()) { + MadeChanges = true; + NumBlockRemoved += NumDeadBlocks; + } + + // Loop over all of the basic blocks in the function, removing control flow + // edges to live blocks (also eliminating any entries in PHI functions in + // referenced blocks). // - for (Function::iterator BB = Func->begin(), E = Func->end(); BB != E; ++BB) { + for (Function::iterator BB = Func->begin(), E = Func->end(); BB != E; ++BB) if (!AliveBlocks.count(BB)) { // Remove all outgoing edges from this basic block and convert the // terminator into a return instruction. @@ -354,12 +361,16 @@ bool ADCE::doADCE() { BB->getInstList().push_back(new ReturnInst(RetTy != Type::VoidTy ? Constant::getNullValue(RetTy) : 0)); } + } + + // Loop over all of the basic blocks in the function, dropping references of + // the dead basic blocks. We must do this after the previous step to avoid + // dropping references to PHIs which still have entries... + // + for (Function::iterator BB = Func->begin(), E = Func->end(); BB != E; ++BB) + if (!AliveBlocks.count(BB)) BB->dropAllReferences(); - ++NumBlockRemoved; - MadeChanges = true; - } - } // Now loop through all of the blocks and delete the dead ones. We can safely // do this now because we know that there are no references to dead blocks -- 2.34.1