forked from OSchip/llvm-project
[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:
parent
dff8315892
commit
5a229a6702
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue