diff options
author | Chris Lattner <sabre@nondot.org> | 2006-08-14 21:38:05 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-08-14 21:38:05 +0000 |
commit | df32aac51b611633301e4a2eb5824c9afa7bd674 (patch) | |
tree | 455031a305d4fd84c1760e0dc415b4921f34bc7d | |
parent | a7174736fa0c4409d10fabd221ffc057ed03918c (diff) | |
download | external_llvm-df32aac51b611633301e4a2eb5824c9afa7bd674.zip external_llvm-df32aac51b611633301e4a2eb5824c9afa7bd674.tar.gz external_llvm-df32aac51b611633301e4a2eb5824c9afa7bd674.tar.bz2 |
Handle single-entry PHI nodes correctly. This fixes PR877 and
Transforms/CondProp/2006-08-14-SingleEntryPhiCrash.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29673 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/CondPropagate.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/CondPropagate.cpp b/lib/Transforms/Scalar/CondPropagate.cpp index 101acef..49c87fd 100644 --- a/lib/Transforms/Scalar/CondPropagate.cpp +++ b/lib/Transforms/Scalar/CondPropagate.cpp @@ -87,8 +87,18 @@ void CondProp::SimplifyBlock(BasicBlock *BB) { // If this block ends with an unconditional branch and the only successor has // only this block as a predecessor, merge the two blocks together. if (BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator())) - if (BI->isUnconditional() && BI->getSuccessor(0)->getSinglePredecessor()) { + if (BI->isUnconditional() && BI->getSuccessor(0)->getSinglePredecessor() && + BB != BI->getSuccessor(0)) { BasicBlock *Succ = BI->getSuccessor(0); + + // If Succ has any PHI nodes, they are all single-entry PHI's. + while (PHINode *PN = dyn_cast<PHINode>(Succ->begin())) { + assert(PN->getNumIncomingValues() == 1 && + "PHI doesn't match parent block"); + PN->replaceAllUsesWith(PN->getIncomingValue(0)); + PN->eraseFromParent(); + } + // Remove BI. BI->eraseFromParent(); |