diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 674de57..deabacc 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -6641,16 +6641,20 @@ Value *SwitchLookupTable::buildLookup(Value *Index, IRBuilder<> &Builder, } case ArrayKind: { Type *IndexTy = DL.getIndexType(Array->getType()); + auto *ArrayTy = cast<ArrayType>(Array->getValueType()); - if (Index->getType() != IndexTy) + if (Index->getType() != IndexTy) { + unsigned OldBitWidth = Index->getType()->getIntegerBitWidth(); Index = Builder.CreateZExtOrTrunc(Index, IndexTy); + if (auto *Zext = dyn_cast<ZExtInst>(Index)) + Zext->setNonNeg( + isUIntN(OldBitWidth - 1, ArrayTy->getNumElements() - 1)); + } Value *GEPIndices[] = {ConstantInt::get(IndexTy, 0), Index}; - Value *GEP = Builder.CreateInBoundsGEP(Array->getValueType(), Array, - GEPIndices, "switch.gep"); - return Builder.CreateLoad( - cast<ArrayType>(Array->getValueType())->getElementType(), GEP, - "switch.load"); + Value *GEP = + Builder.CreateInBoundsGEP(ArrayTy, Array, GEPIndices, "switch.gep"); + return Builder.CreateLoad(ArrayTy->getElementType(), GEP, "switch.load"); } } llvm_unreachable("Unknown lookup table kind!"); |