@@ -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+
133146Value &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+
143196Value &VPBuilder::CreateContiguousStore (Value &Val, Value &ElemPointer,
144197 MaybeAlign AlignOpt) {
145198 auto &VecPtr = GetAsVectorPointer (ElemPointer);
0 commit comments