[llvm] ca18fcc - [IR] Change CreateStepVector to work with element types smaller than i8
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 17 02:48:11 PST 2021
Author: David Sherwood
Date: 2021-11-17T10:47:50Z
New Revision: ca18fcc2c0645e3b76992da9e49a6fad2fc8ebb4
URL: https://github.com/llvm/llvm-project/commit/ca18fcc2c0645e3b76992da9e49a6fad2fc8ebb4
DIFF: https://github.com/llvm/llvm-project/commit/ca18fcc2c0645e3b76992da9e49a6fad2fc8ebb4.diff
LOG: [IR] Change CreateStepVector to work with element types smaller than i8
Currently the stepvector intrinsic only supports element types that
are integers of size 8 bits or more. This patch adds support for the
creation of stepvectors with smaller element types by creating
the intrinsic with i8 elements that we then truncate to the requested
size.
It's not currently possible to write a vectoriser test to exercise
this code path so I have added a unit test here:
llvm/unittests/IR/IRBuilderTest.cpp
Differential Revision: https://reviews.llvm.org/D113767
Added:
Modified:
llvm/lib/IR/IRBuilder.cpp
llvm/unittests/IR/IRBuilderTest.cpp
Removed:
################################################################################
diff --git a/llvm/lib/IR/IRBuilder.cpp b/llvm/lib/IR/IRBuilder.cpp
index 0f4945bad5ab5..98f6ccf81973e 100644
--- a/llvm/lib/IR/IRBuilder.cpp
+++ b/llvm/lib/IR/IRBuilder.cpp
@@ -94,11 +94,22 @@ Value *IRBuilderBase::CreateVScale(Constant *Scaling, const Twine &Name) {
}
Value *IRBuilderBase::CreateStepVector(Type *DstType, const Twine &Name) {
- if (isa<ScalableVectorType>(DstType))
- return CreateIntrinsic(Intrinsic::experimental_stepvector, {DstType}, {},
- nullptr, Name);
-
Type *STy = DstType->getScalarType();
+ if (isa<ScalableVectorType>(DstType)) {
+ Type *StepVecType = DstType;
+ // TODO: We expect this special case (element type < 8 bits) to be
+ // temporary - once the intrinsic properly supports < 8 bits this code
+ // can be removed.
+ if (STy->getScalarSizeInBits() < 8)
+ StepVecType =
+ VectorType::get(getInt8Ty(), cast<ScalableVectorType>(DstType));
+ Value *Res = CreateIntrinsic(Intrinsic::experimental_stepvector,
+ {StepVecType}, {}, nullptr, Name);
+ if (StepVecType != DstType)
+ Res = CreateTrunc(Res, DstType);
+ return Res;
+ }
+
unsigned NumEls = cast<FixedVectorType>(DstType)->getNumElements();
// Create a vector of consecutive numbers from zero to VF.
diff --git a/llvm/unittests/IR/IRBuilderTest.cpp b/llvm/unittests/IR/IRBuilderTest.cpp
index 052f69e7ebd17..1609f27830a46 100644
--- a/llvm/unittests/IR/IRBuilderTest.cpp
+++ b/llvm/unittests/IR/IRBuilderTest.cpp
@@ -214,6 +214,25 @@ TEST_F(IRBuilderTest, CreateStepVector) {
EXPECT_EQ(Call->getIntrinsicID(), Intrinsic::experimental_stepvector);
}
+TEST_F(IRBuilderTest, CreateStepVectorI3) {
+ IRBuilder<> Builder(BB);
+
+ // Scalable vectors
+ Type *DstVecTy = VectorType::get(IntegerType::get(Ctx, 3), 2, true);
+ Type *VecI8Ty = VectorType::get(Builder.getInt8Ty(), 2, true);
+ Value *StepVec = Builder.CreateStepVector(DstVecTy);
+ EXPECT_TRUE(isa<TruncInst>(StepVec));
+ TruncInst *Trunc = cast<TruncInst>(StepVec);
+ EXPECT_EQ(Trunc->getDestTy(), DstVecTy);
+ EXPECT_EQ(Trunc->getSrcTy(), VecI8Ty);
+ EXPECT_TRUE(isa<CallInst>(Trunc->getOperand(0)));
+
+ CallInst *Call = cast<CallInst>(Trunc->getOperand(0));
+ FunctionType *FTy = Call->getFunctionType();
+ EXPECT_EQ(FTy->getReturnType(), VecI8Ty);
+ EXPECT_EQ(Call->getIntrinsicID(), Intrinsic::experimental_stepvector);
+}
+
TEST_F(IRBuilderTest, ConstrainedFP) {
IRBuilder<> Builder(BB);
Value *V;
More information about the llvm-commits
mailing list