summaryrefslogtreecommitdiff
path: root/lib/Transforms/Utils/SimplifyCFG.cpp
diff options
context:
space:
mode:
authorMichael Gottesman <mgottesman@apple.com>2013-10-21 05:20:11 +0000
committerMichael Gottesman <mgottesman@apple.com>2013-10-21 05:20:11 +0000
commit6701bb7283747b00bc814b1db784fdbbe03644a1 (patch)
tree71906e300d70fc5f8c46da6c1d0924ea7d0bc534 /lib/Transforms/Utils/SimplifyCFG.cpp
parent3e033f29239e48c190f29cdf3a02cdfbaf2fe72b (diff)
downloadllvm-6701bb7283747b00bc814b1db784fdbbe03644a1.tar.gz
llvm-6701bb7283747b00bc814b1db784fdbbe03644a1.tar.bz2
llvm-6701bb7283747b00bc814b1db784fdbbe03644a1.tar.xz
Fix the predecessor removal logic in r193045.
Additionally some small comment/stylistic fixes are included as well. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193068 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r--lib/Transforms/Utils/SimplifyCFG.cpp20
1 files changed, 9 insertions, 11 deletions
diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp
index ad3b92a714..61c44fc4b2 100644
--- a/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -3741,18 +3741,20 @@ static bool SwitchToLookupTable(SwitchInst *SI,
// Compute the maximum table size representable by the integer type we are
// switching upon.
- const unsigned CaseSize = MinCaseVal->getType()->getPrimitiveSizeInBits();
- const uint64_t MaxTableSize = CaseSize > 63? UINT64_MAX : 1ULL << CaseSize;
+ unsigned CaseSize = MinCaseVal->getType()->getPrimitiveSizeInBits();
+ uint64_t MaxTableSize = CaseSize > 63? UINT64_MAX : 1ULL << CaseSize;
assert(MaxTableSize >= TableSize &&
"It is impossible for a switch to have more entries than the max "
"representable value of its input integer type's size.");
- // If we have a covered lookup table, unconditionally branch to the lookup table
- // BB. Otherwise, check if the condition value is within the case range. If it
- // is so, branch to the new BB. Otherwise branch to SI's default destination.
+ // If we have a fully covered lookup table, unconditionally branch to the
+ // lookup table BB. Otherwise, check if the condition value is within the case
+ // range. If it is so, branch to the new BB. Otherwise branch to SI's default
+ // destination.
const bool GeneratingCoveredLookupTable = MaxTableSize == TableSize;
if (GeneratingCoveredLookupTable) {
Builder.CreateBr(LookupBB);
+ SI->getDefaultDest()->removePredecessor(SI->getParent());
} else {
Value *Cmp = Builder.CreateICmpULT(TableIndex, ConstantInt::get(
MinCaseVal->getType(), TableSize));
@@ -3786,14 +3788,10 @@ static bool SwitchToLookupTable(SwitchInst *SI,
Builder.CreateBr(CommonDest);
// Remove the switch.
- for (unsigned i = 0; i < SI->getNumSuccessors(); ++i) {
+ for (unsigned i = 0, e = SI->getNumSuccessors(); i < e; ++i) {
BasicBlock *Succ = SI->getSuccessor(i);
- // If we are not generating a covered lookup table, we will have a
- // conditional branch from SI's parent BB to SI's default destination if our
- // input value lies outside of our case range. Thus in that case leave the
- // default destination BB as a predecessor of SI's parent BB.
- if (Succ == SI->getDefaultDest() && !GeneratingCoveredLookupTable)
+ if (Succ == SI->getDefaultDest())
continue;
Succ->removePredecessor(SI->getParent());
}