Feedback from Hans on r213815. No functionaility change.
authorManman Ren <manman.ren@gmail.com>
Thu, 24 Jul 2014 21:13:20 +0000 (21:13 +0000)
committerManman Ren <manman.ren@gmail.com>
Thu, 24 Jul 2014 21:13:20 +0000 (21:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213895 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/SimplifyCFG.cpp

index a651eacd1bb03747f5599e1391b5af5b143f5f4f..24bb63bb60a5f8108bb1006db1715dfea44a7214 100644 (file)
@@ -3477,7 +3477,7 @@ namespace {
 
     /// BuildLookup - Build instructions with Builder to retrieve the value at
     /// 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
     /// type ElementType would fit in a target-legal register.
@@ -3598,8 +3598,7 @@ SwitchLookupTable::SwitchLookupTable(Module &M,
   Kind = ArrayKind;
 }
 
-Value *SwitchLookupTable::BuildLookup(Value *Index, uint64_t TableSize,
-                                      IRBuilder<> &Builder) {
+Value *SwitchLookupTable::BuildLookup(Value *Index, IRBuilder<> &Builder) {
   switch (Kind) {
     case SingleValueKind:
       return SingleValue;
@@ -3626,12 +3625,14 @@ Value *SwitchLookupTable::BuildLookup(Value *Index, uint64_t TableSize,
     }
     case ArrayKind: {
       // Make sure the table index will not overflow when treated as signed.
-      if (IntegerType *IT = dyn_cast<IntegerType>(Index->getType()))
-        if (TableSize > (1ULL << (IT->getBitWidth() - 1)))
-          Index = Builder.CreateZExt(Index,
-                                     IntegerType::get(IT->getContext(),
-                                                      IT->getBitWidth() + 1),
-                                     "switch.tableidx.zext");
+      IntegerType *IT = cast<IntegerType>(Index->getType());
+      uint64_t TableSize = Array->getInitializer()->getType()
+                                ->getArrayNumElements();
+      if (TableSize > (1ULL << (IT->getBitWidth() - 1)))
+        Index = Builder.CreateZExt(Index,
+                                   IntegerType::get(IT->getContext(),
+                                                    IT->getBitWidth() + 1),
+                                   "switch.tableidx.zext");
 
       Value *GEPIndices[] = { Builder.getInt32(0), Index };
       Value *GEP = Builder.CreateInBoundsGEP(Array, GEPIndices,
@@ -3887,7 +3888,7 @@ static bool SwitchToLookupTable(SwitchInst *SI,
     SwitchLookupTable Table(Mod, TableSize, MinCaseVal, ResultLists[PHI],
                             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
     // do that right here.