diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 7a3d368f34c..3e689f6ad9a 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -3521,6 +3521,12 @@ static bool mergeCleanupPad(CleanupReturnInst *RI) { } bool SimplifyCFGOpt::SimplifyCleanupReturn(CleanupReturnInst *RI) { + // It is possible to transiantly have an undef cleanuppad operand because we + // have deleted some, but not all, dead blocks. + // Eventually, this block will be deleted. + if (isa<UndefValue>(RI->getOperand(0))) + return false; + if (removeEmptyCleanup(RI)) return true; @@ -5278,17 +5284,9 @@ bool SimplifyCFGOpt::run(BasicBlock *BB) { if ((pred_empty(BB) && BB != &BB->getParent()->getEntryBlock()) || BB->getSinglePredecessor() == BB) { - // Get the block mostly empty. - Changed |= removeAllNonTerminatorAndEHPadInstructions(BB) > 0; - // Now, verify that we succeeded getting the block empty. - // This will not be the case if this unreachable BB creates a token which is - // consumed by other unreachable blocks. - Instruction *FirstNonPHI = BB->getFirstNonPHI(); - if (isa<TerminatorInst>(FirstNonPHI) && FirstNonPHI->use_empty()) { - DEBUG(dbgs() << "Removing BB: \n" << *BB); - DeleteDeadBlock(BB); - return true; - } + DEBUG(dbgs() << "Removing BB: \n" << *BB); + DeleteDeadBlock(BB); + return true; } // Check to see if we can constant propagate this terminator instruction |