summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Utils/SimplifyCFG.cpp20
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
OpenPOWER on IntegriCloud