diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-08-02 03:24:05 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-08-02 03:24:05 +0000 |
| commit | 4fd3e16cbdc63647aed847b0ff18c56a3caec02b (patch) | |
| tree | 3122782736908af33d1e4f0d5f7c91b92c1f3aa2 /llvm | |
| parent | 8530d6d0af5f54c3ef8ea30bcde122feb536966b (diff) | |
| download | bcm5719-llvm-4fd3e16cbdc63647aed847b0ff18c56a3caec02b.tar.gz bcm5719-llvm-4fd3e16cbdc63647aed847b0ff18c56a3caec02b.zip | |
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.
llvm-svn: 22584
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 6a3b803cbdb..c060127e2c0 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -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 |

