[PATCH] D113767: [IR] Change CreateStepVector to work with element types smaller than i8
David Sherwood via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 12 06:27:25 PST 2021
david-arm created this revision.
david-arm added reviewers: sdesmalen, kmclaughlin, paulwalker-arm, efriedma.
Herald added a subscriber: hiraditya.
david-arm requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
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
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D113767
Files:
llvm/lib/IR/IRBuilder.cpp
llvm/unittests/IR/IRBuilderTest.cpp
Index: llvm/unittests/IR/IRBuilderTest.cpp
===================================================================
--- llvm/unittests/IR/IRBuilderTest.cpp
+++ llvm/unittests/IR/IRBuilderTest.cpp
@@ -214,6 +214,25 @@
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;
Index: llvm/lib/IR/IRBuilder.cpp
===================================================================
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -94,11 +94,19 @@
}
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;
+ 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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D113767.386833.patch
Type: text/x-patch
Size: 2179 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211112/6901eaa7/attachment.bin>
More information about the llvm-commits
mailing list