Index: llvm/lib/IR/IRBuilder.cpp =================================================================== --- llvm/lib/IR/IRBuilder.cpp +++ llvm/lib/IR/IRBuilder.cpp @@ -81,8 +81,10 @@ } Value *IRBuilderBase::CreateVScale(Constant *Scaling, const Twine &Name) { - Module *M = GetInsertBlock()->getParent()->getParent(); assert(isa(Scaling) && "Expected constant integer"); + if (cast(Scaling)->isZero()) + return Scaling; + Module *M = GetInsertBlock()->getParent()->getParent(); Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::vscale, {Scaling->getType()}); CallInst *CI = createCallHelper(TheFn, {}, this, Name); Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp =================================================================== --- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -1108,10 +1108,12 @@ /// Return a value for Step multiplied by VF. static Value *createStepForVF(IRBuilder<> &B, Constant *Step, ElementCount VF) { assert(isa(Step) && "Expected an integer step"); - Constant *StepVal = ConstantInt::get( - Step->getType(), - cast(Step)->getSExtValue() * VF.getKnownMinValue()); - return VF.isScalable() ? B.CreateVScale(StepVal) : StepVal; + uint64_t StepVal = cast(Step)->getSExtValue(); + if (StepVal == 0) + return Step; + Constant *NewStep = + ConstantInt::get(Step->getType(), StepVal * VF.getKnownMinValue()); + return VF.isScalable() ? B.CreateVScale(NewStep) : NewStep; } namespace llvm { @@ -4768,10 +4770,9 @@ "Currently unsupported for scalable vectors"); unsigned Lanes = IsUniform ? 1 : State.VF.getFixedValue(); - Value *RuntimeVF = getRuntimeVF(Builder, PtrInd->getType(), VF); for (unsigned Part = 0; Part < UF; ++Part) { - Value *PartStart = Builder.CreateMul( - RuntimeVF, ConstantInt::get(PtrInd->getType(), Part)); + Value *PartStart = createStepForVF( + Builder, ConstantInt::get(PtrInd->getType(), Part), VF); for (unsigned Lane = 0; Lane < Lanes; ++Lane) { Value *Idx = Builder.CreateAdd( PartStart, ConstantInt::get(PtrInd->getType(), Lane));