aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms/Scalar/CondPropagate.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-11-01 04:23:20 +0000
committerChris Lattner <sabre@nondot.org>2009-11-01 04:23:20 +0000
commit0b649dd91fd2b4879fd930a19ec5e6919c033838 (patch)
treea204a10cb31978299b3df5033922f3c0b0e3cbaa /lib/Transforms/Scalar/CondPropagate.cpp
parent660a4f389c84c196c983c7bae1f0a02957dc70af (diff)
strengthen an assumption: RevectorBlockTo knows that PredBB
ended in an uncond branch because the pass requires BreakCriticalEdges. However, BCE doesn't eliminate critical adges from indbrs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85707 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/CondPropagate.cpp')
-rw-r--r--lib/Transforms/Scalar/CondPropagate.cpp26
1 files changed, 14 insertions, 12 deletions
diff --git a/lib/Transforms/Scalar/CondPropagate.cpp b/lib/Transforms/Scalar/CondPropagate.cpp
index 5b573f492c..8a6c5562eb 100644
--- a/lib/Transforms/Scalar/CondPropagate.cpp
+++ b/lib/Transforms/Scalar/CondPropagate.cpp
@@ -196,18 +196,20 @@ void CondProp::SimplifyPredecessors(SwitchInst *SI) {
// possible, and to avoid invalidating "i".
for (unsigned i = PN->getNumIncomingValues(); i != 0; --i)
if (ConstantInt *CI = dyn_cast<ConstantInt>(PN->getIncomingValue(i-1))) {
- // If we have a constant, forward the edge from its current to its
- // ultimate destination.
- unsigned DestCase = SI->findCaseValue(CI);
- RevectorBlockTo(PN->getIncomingBlock(i-1),
- SI->getSuccessor(DestCase));
- ++NumSwThread;
-
- // If there were two predecessors before this simplification, or if the
- // PHI node contained all the same value except for the one we just
- // substituted, the PHI node may be deleted. Don't iterate through it the
- // last time.
- if (SI->getCondition() != PN) return;
+ BasicBlock *PredBB = PN->getIncomingBlock(i-1);
+ if (isa<BranchInst>(PredBB->getTerminator())) {
+ // If we have a constant, forward the edge from its current to its
+ // ultimate destination.
+ unsigned DestCase = SI->findCaseValue(CI);
+ RevectorBlockTo(PredBB, SI->getSuccessor(DestCase));
+ ++NumSwThread;
+
+ // If there were two predecessors before this simplification, or if the
+ // PHI node contained all the same value except for the one we just
+ // substituted, the PHI node may be deleted. Don't iterate through it the
+ // last time.
+ if (SI->getCondition() != PN) return;
+ }
}
}