[LoopVectorize] Don't create unnecessary vscale intrinsic calls

In quite a few cases in LoopVectorize.cpp we call createStepForVF
with a step value of 0, which leads to unnecessary generation of
llvm.vscale intrinsic calls. I've optimised IRBuilder::CreateVScale
and createStepForVF to return 0 when attempting to multiply
vscale by 0.

Differential Revision: https://reviews.llvm.org/D100763
This commit is contained in:
David Sherwood 2021-04-19 14:56:35 +01:00
parent dff8315892
commit 5a229a6702
3 changed files with 13 additions and 4 deletions

View File

@ -81,8 +81,10 @@ static CallInst *createCallHelper(Function *Callee, ArrayRef<Value *> Ops,
}
Value *IRBuilderBase::CreateVScale(Constant *Scaling, const Twine &Name) {
Module *M = GetInsertBlock()->getParent()->getParent();
assert(isa<ConstantInt>(Scaling) && "Expected constant integer");
if (cast<ConstantInt>(Scaling)->isZero())
return Scaling;
Module *M = GetInsertBlock()->getParent()->getParent();
Function *TheFn =
Intrinsic::getDeclaration(M, Intrinsic::vscale, {Scaling->getType()});
CallInst *CI = createCallHelper(TheFn, {}, this, Name);

View File

@ -4773,10 +4773,9 @@ void InnerLoopVectorizer::widenPHIInstruction(Instruction *PN,
"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));

View File

@ -180,6 +180,14 @@ TEST_F(IRBuilderTest, IntrinsicsWithScalableVectors) {
EXPECT_EQ(FTy->getParamType(i), ArgTys[i]->getType());
}
TEST_F(IRBuilderTest, CreateVScale) {
IRBuilder<> Builder(BB);
Constant *Zero = Builder.getInt32(0);
Value *VScale = Builder.CreateVScale(Zero);
EXPECT_TRUE(isa<ConstantInt>(VScale) && cast<ConstantInt>(VScale)->isZero());
}
TEST_F(IRBuilderTest, CreateStepVector) {
IRBuilder<> Builder(BB);