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

Mel Chen via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 21 08:51:05 PST 2025


================
@@ -2628,18 +2617,26 @@ void VPWidenLoadEVLRecipe::execute(VPTransformState &State) {
   Value *EVL = State.get(getEVL(), VPLane(0));
   Value *Addr = State.get(getAddr(), !CreateGather);
   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());
-  }
 
   if (CreateGather) {
     NewLI =
         Builder.CreateIntrinsic(DataTy, Intrinsic::vp_gather, {Addr, Mask, EVL},
                                 nullptr, "wide.masked.gather");
+  } else if (isReverse()) {
+    auto *EltTy = DataTy->getElementType();
+    auto *PtrTy = Addr->getType();
+    Value *Operands[] = {
+        Addr,
+        ConstantInt::getSigned(Builder.getInt32Ty(),
+                               -LI->getDataLayout().getTypeAllocSize(EltTy)),
+        Mask, EVL};
+    NewLI = Builder.CreateIntrinsic(Intrinsic::experimental_vp_strided_load,
+                                    {DataTy, PtrTy, Builder.getInt32Ty()},
+                                    Operands, nullptr, "vp.neg.strided.load");
----------------
Mel-Chen wrote:

nit: I prefer another name. 
```suggestion
                                    Operands, nullptr, "vp.reverse.load");
```

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


More information about the llvm-commits mailing list