diff options
author | Andreas Jonson <andjo403@hotmail.com> | 2025-08-04 16:18:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-04 16:18:05 +0200 |
commit | c6fd3d32c37f599c69da16f5ff026b925b510f94 (patch) | |
tree | 2158bf40ad7054d18f5a921e4c2777390155408e /llvm/lib/Transforms/Utils/SimplifyCFG.cpp | |
parent | 88c6448fa265e5f50d92251202ab57458ca23064 (diff) | |
download | llvm-c6fd3d32c37f599c69da16f5ff026b925b510f94.zip llvm-c6fd3d32c37f599c69da16f5ff026b925b510f94.tar.gz llvm-c6fd3d32c37f599c69da16f5ff026b925b510f94.tar.bz2 |
[SimplifyCfg] Add nneg to zext for switch to table conversion (#147180)
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!"); |