forked from OSchip/llvm-project
Feedback from Hans on r213815. No functionaility change.
llvm-svn: 213895
This commit is contained in:
parent
e34a71aa91
commit
4d189fb9a6
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue