Feedback from Hans on r213815. No functionaility change.

llvm-svn: 213895
This commit is contained in:
Manman Ren 2014-07-24 21:13:20 +00:00
parent e34a71aa91
commit 4d189fb9a6
1 changed files with 11 additions and 10 deletions

View File

@ -3477,7 +3477,7 @@ namespace {
/// BuildLookup - Build instructions with Builder to retrieve the value at /// BuildLookup - Build instructions with Builder to retrieve the value at
/// the position given by Index in the lookup table. /// the position given by Index in the lookup table.
Value *BuildLookup(Value *Index, uint64_t TableSize, IRBuilder<> &Builder); Value *BuildLookup(Value *Index, IRBuilder<> &Builder);
/// WouldFitInRegister - Return true if a table with TableSize elements of /// WouldFitInRegister - Return true if a table with TableSize elements of
/// type ElementType would fit in a target-legal register. /// type ElementType would fit in a target-legal register.
@ -3598,8 +3598,7 @@ SwitchLookupTable::SwitchLookupTable(Module &M,
Kind = ArrayKind; Kind = ArrayKind;
} }
Value *SwitchLookupTable::BuildLookup(Value *Index, uint64_t TableSize, Value *SwitchLookupTable::BuildLookup(Value *Index, IRBuilder<> &Builder) {
IRBuilder<> &Builder) {
switch (Kind) { switch (Kind) {
case SingleValueKind: case SingleValueKind:
return SingleValue; return SingleValue;
@ -3626,12 +3625,14 @@ Value *SwitchLookupTable::BuildLookup(Value *Index, uint64_t TableSize,
} }
case ArrayKind: { case ArrayKind: {
// Make sure the table index will not overflow when treated as signed. // Make sure the table index will not overflow when treated as signed.
if (IntegerType *IT = dyn_cast<IntegerType>(Index->getType())) IntegerType *IT = cast<IntegerType>(Index->getType());
if (TableSize > (1ULL << (IT->getBitWidth() - 1))) uint64_t TableSize = Array->getInitializer()->getType()
Index = Builder.CreateZExt(Index, ->getArrayNumElements();
IntegerType::get(IT->getContext(), if (TableSize > (1ULL << (IT->getBitWidth() - 1)))
IT->getBitWidth() + 1), Index = Builder.CreateZExt(Index,
"switch.tableidx.zext"); IntegerType::get(IT->getContext(),
IT->getBitWidth() + 1),
"switch.tableidx.zext");
Value *GEPIndices[] = { Builder.getInt32(0), Index }; Value *GEPIndices[] = { Builder.getInt32(0), Index };
Value *GEP = Builder.CreateInBoundsGEP(Array, GEPIndices, Value *GEP = Builder.CreateInBoundsGEP(Array, GEPIndices,
@ -3887,7 +3888,7 @@ static bool SwitchToLookupTable(SwitchInst *SI,
SwitchLookupTable Table(Mod, TableSize, MinCaseVal, ResultLists[PHI], SwitchLookupTable Table(Mod, TableSize, MinCaseVal, ResultLists[PHI],
DV, DL); DV, DL);
Value *Result = Table.BuildLookup(TableIndex, TableSize, Builder); Value *Result = Table.BuildLookup(TableIndex, Builder);
// If the result is used to return immediately from the function, we want to // If the result is used to return immediately from the function, we want to
// do that right here. // do that right here.