[llvm] [LV][EVL] Generate negative strided load/store for reversed load/store (PR #123608)

Luke Lau via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 21 04:20:54 PST 2025


================
@@ -2749,21 +2755,29 @@ void VPWidenStoreEVLRecipe::execute(VPTransformState &State) {
   CallInst *NewSI = nullptr;
   Value *StoredVal = State.get(StoredValue);
   Value *EVL = State.get(getEVL(), VPLane(0));
-  if (isReverse())
-    StoredVal = createReverseEVL(Builder, StoredVal, EVL, "vp.reverse");
   Value *Mask = nullptr;
-  if (VPValue *VPMask = getMask()) {
+  if (VPValue *VPMask = getMask())
     Mask = State.get(VPMask);
-    if (isReverse())
-      Mask = createReverseEVL(Builder, Mask, EVL, "vp.reverse.mask");
-  } else {
+  else
     Mask = Builder.CreateVectorSplat(State.VF, Builder.getTrue());
-  }
+
   Value *Addr = State.get(getAddr(), !CreateScatter);
   if (CreateScatter) {
     NewSI = Builder.CreateIntrinsic(Type::getVoidTy(EVL->getContext()),
                                     Intrinsic::vp_scatter,
                                     {StoredVal, Addr, Mask, EVL});
+  } else if (isReverse()) {
+    Type *StoredValTy = StoredVal->getType();
+    auto *EltTy = cast<VectorType>(StoredValTy)->getElementType();
+    auto *PtrTy = Addr->getType();
+    Value *Operands[] = {
+        StoredVal, Addr,
+        ConstantInt::getSigned(Builder.getInt32Ty(),
+                               -SI->getDataLayout().getTypeAllocSize(EltTy)),
+        Mask, EVL};
+    NewSI = Builder.CreateIntrinsic(Intrinsic::experimental_vp_strided_store,
+                                    {StoredValTy, PtrTy, Builder.getInt32Ty()},
+                                    Operands);
----------------
lukel97 wrote:

Nit, does the store need to have a name too?

https://github.com/llvm/llvm-project/pull/123608


More information about the llvm-commits mailing list