Skip to content

Commit aea521a

Browse files
author
Simon Moll
committed
[VP] Custom strided VLD/VST VPBuilder path
1 parent 8bc4dd7 commit aea521a

File tree

4 files changed

+63
-4
lines changed

4 files changed

+63
-4
lines changed

llvm/include/llvm/IR/VPBuilder.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ class VPBuilder {
2626
Value& RequestPred();
2727
Value& RequestEVL();
2828

29-
// Cast to vector of element type.
29+
// Cast to pointer to vector of \p Ptr/
3030
Value& GetAsVectorPointer(Value& Ptr);
31+
// Cast to pointer of element of vector type.
32+
Value& GetAsElementPointer(Value &Ptr);
3133

3234
public:
3335
VPBuilder(IRBuilder<> &_builder)
@@ -73,6 +75,10 @@ class VPBuilder {
7375
MaybeAlign Alignment);
7476
Value &CreateContiguousLoad(Type *ReturnTy, Value &Pointer,
7577
MaybeAlign Alignment);
78+
Value &CreateStridedStore(Value &Val, Value &Pointer, MaybeAlign Alignment,
79+
int64_t Stride);
80+
Value &CreateStridedLoad(Type *ReturnTy, Value &Pointer, MaybeAlign Alignment,
81+
int64_t Stride);
7682
Value &CreateScatter(Value &Val, Value &PointerVec, MaybeAlign Alignment);
7783
Value &CreateGather(Type *RetTy, Value &PointerVec, MaybeAlign AlignOpt);
7884
Value &createSelect(Value &OnTrue, Value &OnFalse, Value &Mask, Value &Pivot,

llvm/lib/IR/IntrinsicInst.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -618,13 +618,13 @@ static VPIntrinsic::ShortTypeVec getVPIntrinsicTypes(Intrinsic::ID ID,
618618
return VPIntrinsic::ShortTypeVec{VectorTy};
619619

620620
case Intrinsic::experimental_vp_strided_load:
621-
return VPIntrinsic::ShortTypeVec{VecRetTy,
621+
return VPIntrinsic::ShortTypeVec{VecRetTy, VecPtrTy,
622622
Type::getInt64Ty(VectorTy->getContext())};
623623
case Intrinsic::vp_gather:
624624
case Intrinsic::vp_load:
625625
return VPIntrinsic::ShortTypeVec{VecRetTy, VecPtrTy};
626626
case Intrinsic::experimental_vp_strided_store:
627-
return VPIntrinsic::ShortTypeVec{VectorTy,
627+
return VPIntrinsic::ShortTypeVec{VectorTy, VecPtrTy,
628628
Type::getInt64Ty(VectorTy->getContext())};
629629
case Intrinsic::vp_scatter:
630630
case Intrinsic::vp_store:

llvm/lib/IR/VPBuilder.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,19 @@ VectorType &VPBuilder::getVectorType(Type &ElementTy) {
130130
return *VectorType::get(&ElementTy, StaticVectorLength);
131131
}
132132

133+
Value &VPBuilder::GetAsElementPointer(Value &Ptr) {
134+
auto *ElemTy = Ptr.getType()->getPointerElementType();
135+
if (!ElemTy->isVectorTy())
136+
return Ptr;
137+
auto &PointerTy = cast<PointerType>(*Ptr.getType());
138+
if (auto *VecTy = dyn_cast<VectorType>(PointerTy.getPointerElementType())) {
139+
auto *ElemPtrTy =
140+
VecTy->getElementType()->getPointerTo(PointerTy.getAddressSpace());
141+
return *Builder.CreatePointerCast(&Ptr, ElemPtrTy);
142+
}
143+
return Ptr;
144+
}
145+
133146
Value &VPBuilder::GetAsVectorPointer(Value &Ptr) {
134147
auto *ElemTy = Ptr.getType()->getPointerElementType();
135148
if (ElemTy->isVectorTy())
@@ -140,6 +153,46 @@ Value &VPBuilder::GetAsVectorPointer(Value &Ptr) {
140153
return *Builder.CreatePointerCast(&Ptr, VecPtrTy);
141154
}
142155

156+
Value &VPBuilder::CreateStridedStore(Value &Val, Value &Ptr,
157+
MaybeAlign AlignOpt, int64_t Stride) {
158+
auto &ElemPtr = GetAsElementPointer(Ptr);
159+
auto &VecTy = getVectorType(*ElemPtr.getType()->getPointerElementType());
160+
auto *StoreFunc = Intrinsic::getDeclaration(
161+
&getModule(), Intrinsic::experimental_vp_strided_store,
162+
{&VecTy, Type::getInt64Ty(Builder.getContext())});
163+
auto *StrideConst = Builder.getInt64((uint64_t)Stride);
164+
165+
ShortValueVec Args{&Val, &ElemPtr, StrideConst, &RequestPred(),
166+
&RequestEVL()};
167+
CallInst &StoreCall = *Builder.CreateCall(StoreFunc, Args);
168+
if (AlignOpt.hasValue()) {
169+
unsigned PtrPos =
170+
VPIntrinsic::getMemoryPointerParamPos(Intrinsic::vp_store).getValue();
171+
StoreCall.addParamAttr(
172+
PtrPos, Attribute::getWithAlignment(getContext(), AlignOpt.getValue()));
173+
}
174+
return StoreCall;
175+
}
176+
177+
Value &VPBuilder::CreateStridedLoad(Type *ReturnTy, Value &Ptr,
178+
MaybeAlign AlignOpt, int64_t Stride) {
179+
auto &ElemPtr = GetAsElementPointer(Ptr);
180+
// auto &VecTy = getVectorType(*ElemPtr.getType()->getPointerElementType());
181+
auto *LoadFunc = VPIntrinsic::getDeclarationForParams(
182+
&getModule(), Intrinsic::experimental_vp_strided_load, ReturnTy,
183+
{&ElemPtr});
184+
auto *StrideConst = Builder.getInt64((uint64_t)Stride);
185+
ShortValueVec Args{&ElemPtr, StrideConst, &RequestPred(), &RequestEVL()};
186+
CallInst &LoadCall = *Builder.CreateCall(LoadFunc, Args);
187+
if (AlignOpt.hasValue()) {
188+
unsigned PtrPos =
189+
VPIntrinsic::getMemoryPointerParamPos(Intrinsic::vp_load).getValue();
190+
LoadCall.addParamAttr(
191+
PtrPos, Attribute::getWithAlignment(getContext(), AlignOpt.getValue()));
192+
}
193+
return LoadCall;
194+
}
195+
143196
Value &VPBuilder::CreateContiguousStore(Value &Val, Value &ElemPointer,
144197
MaybeAlign AlignOpt) {
145198
auto &VecPtr = GetAsVectorPointer(ElemPointer);

0 commit comments

Comments
 (0)