diff options
author | Evan Cheng <evan.cheng@apple.com> | 2012-11-30 02:02:42 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2012-11-30 02:02:42 +0000 |
commit | 65df808f6254617b9eee931d00e95d900610b660 (patch) | |
tree | 53c7752f63fd5feeccf55314a78e89e2f28612b1 /llvm/lib/Transforms/Utils/SimplifyCFG.cpp | |
parent | 317962381a2bd6ca929bff1e8fd42271dbe85b7a (diff) | |
download | bcm5719-llvm-65df808f6254617b9eee931d00e95d900610b660.tar.gz bcm5719-llvm-65df808f6254617b9eee931d00e95d900610b660.zip |
Fix logic to determine whether to turn a switch into a lookup table. When
the tables cannot fit in registers (i.e. bitmap), do not emit the table
if it's using an illegal type.
rdar://12779436
llvm-svn: 168970
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 6c34eed13d6..611e466719b 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -3511,22 +3511,29 @@ bool SwitchLookupTable::WouldFitInRegister(const DataLayout *TD, static bool ShouldBuildLookupTable(SwitchInst *SI, uint64_t TableSize, const DataLayout *TD, + const TargetTransformInfo *TTI, const SmallDenseMap<PHINode*, Type*>& ResultTypes) { // The table density should be at least 40%. This is the same criterion as for // jump tables, see SelectionDAGBuilder::handleJTSwitchCase. // FIXME: Find the best cut-off. if (SI->getNumCases() > TableSize || TableSize >= UINT64_MAX / 10) return false; // TableSize overflowed, or mul below might overflow. - if (SI->getNumCases() * 10 >= TableSize * 4) - return true; // If each table would fit in a register, we should build it anyway. + bool AllFit = true; + bool HasIllegalType = false; for (SmallDenseMap<PHINode*, Type*>::const_iterator I = ResultTypes.begin(), E = ResultTypes.end(); I != E; ++I) { - if (!SwitchLookupTable::WouldFitInRegister(TD, TableSize, I->second)) - return false; + Type *Ty = I->second; + if (!TTI->getScalarTargetTransformInfo()->isTypeLegal(Ty)) + HasIllegalType = true; + if (!SwitchLookupTable::WouldFitInRegister(TD, TableSize, Ty)) { + AllFit = false; + break; + } } - return true; + + return AllFit || (!HasIllegalType && (SI->getNumCases() * 10 >= TableSize * 4)); } /// SwitchToLookupTable - If the switch is only used to initialize one or more @@ -3607,7 +3614,7 @@ static bool SwitchToLookupTable(SwitchInst *SI, APInt RangeSpread = MaxCaseVal->getValue() - MinCaseVal->getValue(); uint64_t TableSize = RangeSpread.getLimitedValue() + 1; - if (!ShouldBuildLookupTable(SI, TableSize, TD, ResultTypes)) + if (!ShouldBuildLookupTable(SI, TableSize, TD, TTI, ResultTypes)) return false; // Create the BB that does the lookups. |