From 0f7a3507cf45eeffa33f9a4043b913ef90e4d5e6 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Tue, 9 Sep 2008 01:06:56 +0000 Subject: Fix simplifycfg crash in handing block merge. llvm-svn: 55971 --- llvm/lib/Transforms/Utils/BasicBlockUtils.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'llvm/lib/Transforms/Utils/BasicBlockUtils.cpp') 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(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(&BB->front())) { PN->replaceAllUsesWith(PN->getIncomingValue(0)); -- cgit v1.2.3