This code was very close, but not quite right. It did not take into

consideration the case where a reference in an unreachable block could
occur.  This fixes Transforms/SimplifyCFG/2005-08-01-PHIUpdateFail.ll,
something I ran into while bugpoint'ing another pass.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22584 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2005-08-02 03:24:05 +00:00
parent 1bc0f735c9
commit 1593ac259d

View File

@ -894,9 +894,16 @@ bool llvm::SimplifyCFG(BasicBlock *BB) {
// Move all PHI nodes in BB to Succ if they are alive, otherwise
// delete them.
while (PHINode *PN = dyn_cast<PHINode>(&BB->front()))
if (PN->use_empty())
BB->getInstList().erase(BB->begin()); // Nuke instruction.
else {
if (PN->use_empty() || Succ->getSinglePredecessor() == 0) {
// We can only move the PHI node into Succ if BB dominates Succ.
// Since BB only has a single successor (Succ), the PHI nodes
// will dominate Succ, unless Succ has multiple predecessors. In
// this case, the PHIs are either dead, or have references in dead
// blocks. In either case, we can just remove them.
if (!PN->use_empty()) // Uses in dead block?
PN->replaceAllUsesWith(UndefValue::get(PN->getType()));
PN->eraseFromParent(); // Nuke instruction.
} 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, because we know that BB