[llvm] [SLPVectorizer][NFC] Save stride in a map. (PR #157706)

Mikhail Gudim via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 11 11:26:24 PDT 2025


================
@@ -13030,10 +13063,18 @@ void BoUpSLP::transformNodes() {
         InstructionCost StridedCost = TTI->getStridedMemoryOpCost(
             Instruction::Load, VecTy, BaseLI->getPointerOperand(),
             /*VariableMask=*/false, CommonAlignment, CostKind, BaseLI);
-        if (StridedCost < OriginalVecCost)
+        if (StridedCost < OriginalVecCost) {
           // Strided load is more profitable than consecutive load + reverse -
           // transform the node to strided load.
+          Type *StrideTy = DL->getIndexType(cast<LoadInst>(E.Scalars.front())
+                                                ->getPointerOperand()
+                                                ->getType());
+          StridedPtrInfo SPtrInfo;
+          SPtrInfo.StrideVal = ConstantInt::get(StrideTy, 1);
----------------
mgudim wrote:

With some hacks I was able to generate -1 stride. On RISCV the resulting assembly looks like this:

```
addi  a0, a0, 15
  li  a2, -1
  vsetivli  zero, 16, e8, m1, ta, ma
  vlse8.v v8, (a0), a2
  vse8.v  v8, (a1)
  ret
```

but by default we generate this:

```
 vsetivli  zero, 16, e8, m1, ta, ma
  vle8.v  v8, (a0)
  vid.v v9  
  vrsub.vi  v9, v9, 15
  vrgather.vv v10, v8, v9
  vse8.v  v10, (a1)
  ret

```

So isn't the first version (with -1 stride) better?

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


More information about the llvm-commits mailing list