From 3a43837d859bddfdc24bc0c2d87669a6300c7bfe Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 7 Mar 2003 18:13:41 +0000 Subject: [PATCH] Fix bug: SimplifyCFG/2003-03-07-DominateProblem.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5722 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/SimplifyCFG.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index 3b658aacb40..25d835684b2 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -141,9 +141,11 @@ bool SimplifyCFG(BasicBlock *BB) { // if (!PropagatePredecessorsForPHIs(BB, Succ)) { //cerr << "Killing Trivial BB: \n" << BB; - BB->replaceAllUsesWith(Succ); std::string OldName = BB->getName(); + std::vector + OldSuccPreds(pred_begin(Succ), pred_end(Succ)); + // Move all PHI nodes in BB to Succ if they are alive, otherwise // delete them. while (PHINode *PN = dyn_cast(&BB->front())) @@ -152,11 +154,26 @@ bool SimplifyCFG(BasicBlock *BB) { else { // The instruction is alive, so this means that Succ must have // *ONLY* had BB as a predecessor, and the PHI node is still valid - // now. Simply move it into Succ. + // now. Simply move it into Succ, because we know that BB + // strictly dominated Succ. BB->getInstList().remove(BB->begin()); Succ->getInstList().push_front(PN); + + // We need to add new entries for the PHI node to account for + // predecessors of Succ that the PHI node does not take into + // account. At this point, since we know that BB dominated succ, + // this means that we should any newly added incoming edges should + // use the PHI node as the value for these edges, because they are + // loop back edges. + + for (unsigned i = 0, e = OldSuccPreds.size(); i != e; ++i) + if (OldSuccPreds[i] != BB) + PN->addIncoming(PN, OldSuccPreds[i]); } + // Everything that jumped to BB now goes to Succ... + BB->replaceAllUsesWith(Succ); + // Delete the old basic block... M->getBasicBlockList().erase(BB);