@@ -130,6 +130,19 @@ VectorType &VPBuilder::getVectorType(Type &ElementTy) {
130
130
return *VectorType::get (&ElementTy, StaticVectorLength);
131
131
}
132
132
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
+
133
146
Value &VPBuilder::GetAsVectorPointer (Value &Ptr) {
134
147
auto *ElemTy = Ptr.getType ()->getPointerElementType ();
135
148
if (ElemTy->isVectorTy ())
@@ -140,6 +153,46 @@ Value &VPBuilder::GetAsVectorPointer(Value &Ptr) {
140
153
return *Builder.CreatePointerCast (&Ptr, VecPtrTy);
141
154
}
142
155
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
+
143
196
Value &VPBuilder::CreateContiguousStore (Value &Val, Value &ElemPointer,
144
197
MaybeAlign AlignOpt) {
145
198
auto &VecPtr = GetAsVectorPointer (ElemPointer);
0 commit comments