diff options
author | Devang Patel <dpatel@apple.com> | 2008-09-09 01:06:56 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2008-09-09 01:06:56 +0000 |
commit | 5bb06f711d21da63c73748ef865ef973f9ed4a11 (patch) | |
tree | 03335a3e76eed83ae027b32dc2dbfa272e0b7d7e /lib/Transforms/Utils/BasicBlockUtils.cpp | |
parent | b60ca3c309a4ceb741ebb773b0f09e16239b524d (diff) | |
download | external_llvm-5bb06f711d21da63c73748ef865ef973f9ed4a11.zip external_llvm-5bb06f711d21da63c73748ef865ef973f9ed4a11.tar.gz external_llvm-5bb06f711d21da63c73748ef865ef973f9ed4a11.tar.bz2 |
Fix simplifycfg crash in handing block merge.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55971 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/BasicBlockUtils.cpp')
-rw-r--r-- | lib/Transforms/Utils/BasicBlockUtils.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/Transforms/Utils/BasicBlockUtils.cpp b/lib/Transforms/Utils/BasicBlockUtils.cpp index 719bc8a..a98e135 100644 --- a/lib/Transforms/Utils/BasicBlockUtils.cpp +++ b/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)); |