[llvm] [RISCV] Improve performCONCAT_VECTORCombine stride matching (PR #68726)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 10 13:16:09 PDT 2023
================
@@ -13821,6 +13822,58 @@ 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 =
+ BaseIndexOffset::match(cast<LoadSDNode>(Loads[0]), DAG);
+ BaseIndexOffset LastLdBIO =
+ BaseIndexOffset::match(cast<LoadSDNode>(Loads[1]), DAG);
+ bool AllValidOffset =
+ BaseLdBIO.hasValidOffset() && LastLdBIO.hasValidOffset();
+ if (!AllValidOffset)
+ return SDValue();
+ bool BaseIndexMatch = BaseLdBIO.equalBaseIndex(LastLdBIO, DAG);
+ if (!BaseIndexMatch)
+ return SDValue();
+ int64_t ConstStride = LastLdBIO.getOffset() - BaseLdBIO.getOffset();
+
+ // Check that constraints hold for all subsequent loads and the ConstStride
+ // is the same.
+ for (auto Idx : enumerate(Loads.drop_front(2))) {
----------------
topperc wrote:
Do we need to use enumerate here? I don't think the index is used.
https://github.com/llvm/llvm-project/pull/68726
More information about the llvm-commits
mailing list