[llvm] [InstCombine] Handle more scalable geps in EmitGEPOffset (PR #71699)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 8 11:45:48 PST 2023
================
@@ -66,16 +66,26 @@ Value *llvm::emitGEPOffset(IRBuilderBase *Builder, const DataLayout &DL,
// Splat the index if needed.
if (IntIdxTy->isVectorTy() && !Op->getType()->isVectorTy())
Op = Builder->CreateVectorSplat(
- cast<FixedVectorType>(IntIdxTy)->getNumElements(), Op);
+ cast<VectorType>(IntIdxTy)->getElementCount(), Op);
// Convert to correct type.
if (Op->getType() != IntIdxTy)
Op = Builder->CreateIntCast(Op, IntIdxTy, true, Op->getName() + ".c");
if (Size != 1 || TSize.isScalable()) {
// We'll let instcombine(mul) convert this to a shl if possible.
- auto *ScaleC = ConstantInt::get(IntIdxTy, Size);
- Value *Scale =
- !TSize.isScalable() ? ScaleC : Builder->CreateVScale(ScaleC);
+ Value *Scale = ConstantInt::get(IntIdxTy, Size);
+ if (TSize.isScalable()) {
+ Value *VScale;
+ if (IntIdxTy->isVectorTy()) {
+ VScale = Builder->CreateVScale(ConstantInt::get(
+ cast<VectorType>(IntIdxTy)->getElementType(), 1));
+ VScale = Builder->CreateVectorSplat(
+ cast<VectorType>(IntIdxTy)->getElementCount(), VScale);
----------------
nikic wrote:
Can we instead move the above splat creation until after the multiply? I.e. calculate on scalars and then splat?
https://github.com/llvm/llvm-project/pull/71699
More information about the llvm-commits
mailing list