[llvm-commits] CVS: llvm/lib/Transforms/Utils/SimplifyCFG.cpp
Chris Lattner
lattner at cs.uiuc.edu
Mon Aug 1 20:24:16 PDT 2005
Changes in directory llvm/lib/Transforms/Utils:
SimplifyCFG.cpp updated: 1.72 -> 1.73
---
Log message:
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.
---
Diffs of the changes: (+10 -3)
SimplifyCFG.cpp | 13 ++++++++++---
1 files changed, 10 insertions(+), 3 deletions(-)
Index: llvm/lib/Transforms/Utils/SimplifyCFG.cpp
diff -u llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.72 llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.73
--- llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.72 Thu Jun 16 20:45:53 2005
+++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp Mon Aug 1 22:24:05 2005
@@ -894,9 +894,16 @@
// 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
More information about the llvm-commits
mailing list