[llvm] [RISCV] Improve performCONCAT_VECTORCombine stride matching (PR #68726)

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 10 16:39:36 PDT 2023


================
@@ -13821,6 +13822,56 @@ static SDValue performCONCAT_VECTORSCombine(SDNode *N, SelectionDAG &DAG,
     Align = std::min(Align, Ld->getAlign());
   }
 
+  // If the load ptrs can be decomposed into a common (Base + Index) with a
+  // common constant stride, then return the constant stride. This matcher
+  // enables some additional optimization since BaseIndexOffset is capable of
+  // decomposing the load ptrs to (add (add Base, Index), Stride) instead of
+  // (add LastPtr, Stride) or (add NextPtr, Stride) that matchForwardStrided and
+  // matchReverseStrided use respectively.
+  auto matchConstantStride = [&DAG, &N](ArrayRef<SDUse> Loads) {
+    // Initialize match constraints based on the first load. Initialize
+    // ConstStride by taking the difference between the offset of the first two
+    // loads.
+    if (Loads.size() < 2)
+      return SDValue();
+    BaseIndexOffset BaseLdBIO =
----------------
preames wrote:

Hm, an idea...

Looking at this code, I realized we could factor out a helper routine of the form optional<int64_t> getPtrDiff(LD1, LD2).  Then we could loop over all of the indices, and check that the offset is known and the same.

After that, it occurred to me that both of the previous two matchers can *also* be written as rules inside a getPtrDiff helper.  (The return value has to become SDValue instead, but otherwise it works.)

Maybe we should switch over in a separate commit, and then implement this matcher in that style?


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


More information about the llvm-commits mailing list