summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2008-09-09 01:06:56 +0000
committerDevang Patel <dpatel@apple.com>2008-09-09 01:06:56 +0000
commit0f7a3507cf45eeffa33f9a4043b913ef90e4d5e6 (patch)
treed17e4832dae4b413cc127813d116226d56acf35a /llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
parent41cf9dedc6a3f5e7f8ee1d8835ad9ea2b8923f46 (diff)
downloadbcm5719-llvm-0f7a3507cf45eeffa33f9a4043b913ef90e4d5e6.tar.gz
bcm5719-llvm-0f7a3507cf45eeffa33f9a4043b913ef90e4d5e6.zip
Fix simplifycfg crash in handing block merge.
llvm-svn: 55971
Diffstat (limited to 'llvm/lib/Transforms/Utils/BasicBlockUtils.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/BasicBlockUtils.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
index 719bc8a34f8..a98e1356ad3 100644
--- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
+++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
@@ -54,7 +54,17 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock* BB, Pass* P) {
// Can't merge if there are multiple successors.
if (!OnlySucc) return false;
-
+
+ // Can't merge if there is PHI loop.
+ for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE; ++BI) {
+ if (PHINode *PN = dyn_cast<PHINode>(BI)) {
+ for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
+ if (PN->getIncomingValue(i) == PN)
+ return false;
+ } else
+ break;
+ }
+
// Begin by getting rid of unneeded PHIs.
while (PHINode *PN = dyn_cast<PHINode>(&BB->front())) {
PN->replaceAllUsesWith(PN->getIncomingValue(0));
OpenPOWER on IntegriCloud