[Mlir-commits] [mlir] 531613e - [mlir] Use Repeated<T> in more places to avoid temporary vectors. NFC. (#188846)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Thu Mar 26 16:46:59 PDT 2026


Author: Jakub Kuderski
Date: 2026-03-26T19:46:55-04:00
New Revision: 531613e0fb17aca41971649c15c942231a870777

URL: https://github.com/llvm/llvm-project/commit/531613e0fb17aca41971649c15c942231a870777
DIFF: https://github.com/llvm/llvm-project/commit/531613e0fb17aca41971649c15c942231a870777.diff

LOG: [mlir] Use Repeated<T> in more places to avoid temporary vectors. NFC. (#188846)

Replace `SmallVector<Type/Value>(n, x)` with `Repeated<Type/Value>(n,
x)`. This avoids heap allocations for repeated values.

Also change `ExtractAddressComputations` rebuild callbacks from
`ArrayRef<Value>` to `ValueRange` to enable `Repeated<Value>`
passthrough.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply at anthropic.com>

Added: 
    

Modified: 
    mlir/lib/Dialect/MemRef/Transforms/ElideReinterpretCast.cpp
    mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp
    mlir/lib/Dialect/Tensor/IR/TensorOps.cpp
    mlir/lib/Dialect/Vector/IR/VectorOps.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/lib/Dialect/MemRef/Transforms/ElideReinterpretCast.cpp b/mlir/lib/Dialect/MemRef/Transforms/ElideReinterpretCast.cpp
index dc139d892f5e5..01632c6ea1579 100644
--- a/mlir/lib/Dialect/MemRef/Transforms/ElideReinterpretCast.cpp
+++ b/mlir/lib/Dialect/MemRef/Transforms/ElideReinterpretCast.cpp
@@ -13,6 +13,7 @@
 #include "mlir/Dialect/MemRef/Transforms/Transforms.h"
 #include "mlir/IR/TypeUtilities.h"
 #include "mlir/Transforms/DialectConversion.h"
+#include "llvm/ADT/Repeated.h"
 #include <cassert>
 
 namespace mlir {
@@ -174,7 +175,7 @@ struct CopyToScalarLoadAndStore : public OpRewritePattern<memref::CopyOp> {
     Value zero = arith::ConstantIndexOp::create(rewriter, loc, 0);
 
     auto srcType = cast<MemRefType>(src.getType());
-    SmallVector<Value> loadIndices(srcType.getRank(), zero);
+    Repeated<Value> loadIndices(srcType.getRank(), zero);
     auto offsets = rc.getMixedOffsets();
     assert(offsets.size() == 1 && "Expecting single offset");
     OpFoldResult offset = offsets[0];

diff  --git a/mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp b/mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp
index 0946da8e4e919..9c922c28d0f54 100644
--- a/mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp
+++ b/mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp
@@ -20,6 +20,7 @@
 #include "mlir/Dialect/Utils/StaticValueUtils.h"
 #include "mlir/Dialect/Vector/IR/VectorOps.h"
 #include "mlir/IR/PatternMatch.h"
+#include "llvm/ADT/Repeated.h"
 
 using namespace mlir;
 
@@ -40,7 +41,7 @@ static FailureOr<Value> getLoadOpSrcMemRef(memref::LoadOp loadOp) {
 // \see LoadStoreLikeOpRewriter.
 static memref::LoadOp rebuildLoadOp(RewriterBase &rewriter,
                                     memref::LoadOp loadOp, Value srcMemRef,
-                                    ArrayRef<Value> indices) {
+                                    ValueRange indices) {
   Location loc = loadOp.getLoc();
   return memref::LoadOp::create(rewriter, loc, srcMemRef, indices,
                                 loadOp.getNontemporal());
@@ -70,7 +71,7 @@ static FailureOr<Value> getStoreOpSrcMemRef(memref::StoreOp storeOp) {
 // \see LoadStoreLikeOpRewriter.
 static memref::StoreOp rebuildStoreOp(RewriterBase &rewriter,
                                       memref::StoreOp storeOp, Value srcMemRef,
-                                      ArrayRef<Value> indices) {
+                                      ValueRange indices) {
   Location loc = storeOp.getLoc();
   return memref::StoreOp::create(rewriter, loc, storeOp.getValueToStore(),
                                  srcMemRef, indices, storeOp.getNontemporal());
@@ -101,7 +102,7 @@ static FailureOr<Value> getLdMatrixOpSrcMemRef(nvgpu::LdMatrixOp ldMatrixOp) {
 static nvgpu::LdMatrixOp rebuildLdMatrixOp(RewriterBase &rewriter,
                                            nvgpu::LdMatrixOp ldMatrixOp,
                                            Value srcMemRef,
-                                           ArrayRef<Value> indices) {
+                                           ValueRange indices) {
   Location loc = ldMatrixOp.getLoc();
   return nvgpu::LdMatrixOp::create(
       rewriter, loc, ldMatrixOp.getResult().getType(), srcMemRef, indices,
@@ -129,7 +130,7 @@ getTransferLikeOpSrcMemRef(TransferLikeOp transferLikeOp) {
 static vector::TransferReadOp
 rebuildTransferReadOp(RewriterBase &rewriter,
                       vector::TransferReadOp transferReadOp, Value srcMemRef,
-                      ArrayRef<Value> indices) {
+                      ValueRange indices) {
   Location loc = transferReadOp.getLoc();
   return vector::TransferReadOp::create(
       rewriter, loc, transferReadOp.getResult().getType(), srcMemRef, indices,
@@ -147,7 +148,7 @@ rebuildTransferReadOp(RewriterBase &rewriter,
 static vector::TransferWriteOp
 rebuildTransferWriteOp(RewriterBase &rewriter,
                        vector::TransferWriteOp transferWriteOp, Value srcMemRef,
-                       ArrayRef<Value> indices) {
+                       ValueRange indices) {
   Location loc = transferWriteOp.getLoc();
   return vector::TransferWriteOp::create(
       rewriter, loc, transferWriteOp.getValue(), srcMemRef, indices,
@@ -221,7 +222,7 @@ template <typename LoadStoreLikeOp,
           FailureOr<Value> (*getFailureOrSrcMemRef)(LoadStoreLikeOp),
           LoadStoreLikeOp (*rebuildOpFromAddressAndIndices)(
               RewriterBase & /*rewriter*/, LoadStoreLikeOp /*loadStoreOp*/,
-              Value /*srcMemRef*/, ArrayRef<Value> /*indices*/),
+              Value /*srcMemRef*/, ValueRange /*indices*/),
           SmallVector<OpFoldResult> (*getViewSizeForEachDim)(
               RewriterBase & /*rewriter*/, LoadStoreLikeOp /*loadStoreOp*/) =
               getGenericOpViewSizeForEachDim<
@@ -269,8 +270,8 @@ struct LoadStoreLikeOpRewriter : public OpRewritePattern<LoadStoreLikeOp> {
                                   /*offsets=*/indices,
                                   /*sizes=*/sizes, /*strides=*/ones);
     // Rewrite the load/store with the subview as the base pointer.
-    SmallVector<Value> zeros(loadStoreRank,
-                             arith::ConstantIndexOp::create(rewriter, loc, 0));
+    Repeated<Value> zeros(loadStoreRank,
+                          arith::ConstantIndexOp::create(rewriter, loc, 0));
     LoadStoreLikeOp newLoadStore = rebuildOpFromAddressAndIndices(
         rewriter, loadStoreLikeOp, subview.getResult(), zeros);
     rewriter.replaceOp(loadStoreLikeOp, newLoadStore->getResults());

diff  --git a/mlir/lib/Dialect/Tensor/IR/TensorOps.cpp b/mlir/lib/Dialect/Tensor/IR/TensorOps.cpp
index 4d266a635b7cf..d33b8d32a1d88 100644
--- a/mlir/lib/Dialect/Tensor/IR/TensorOps.cpp
+++ b/mlir/lib/Dialect/Tensor/IR/TensorOps.cpp
@@ -32,6 +32,7 @@
 #include "mlir/Interfaces/ViewLikeInterface.h"
 #include "mlir/Support/LLVM.h"
 #include "llvm/ADT/DenseSet.h"
+#include "llvm/ADT/Repeated.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallBitVector.h"
 #include "llvm/ADT/SmallVectorExtras.h"
@@ -3379,7 +3380,7 @@ void PadOp::build(OpBuilder &b, OperationState &result, Type resultType,
   // Add a region and a block to yield the pad value.
   Region *region = result.regions[0].get();
   int sourceRank = llvm::cast<RankedTensorType>(source.getType()).getRank();
-  SmallVector<Type> blockArgTypes(sourceRank, b.getIndexType());
+  Repeated<Type> blockArgTypes(sourceRank, b.getIndexType());
   SmallVector<Location> blockArgLocs(sourceRank, result.location);
 
   // `builder.createBlock` changes the insertion point within the block. Create

diff  --git a/mlir/lib/Dialect/Vector/IR/VectorOps.cpp b/mlir/lib/Dialect/Vector/IR/VectorOps.cpp
index 73632875ca9e2..c1536d6e062cd 100644
--- a/mlir/lib/Dialect/Vector/IR/VectorOps.cpp
+++ b/mlir/lib/Dialect/Vector/IR/VectorOps.cpp
@@ -40,6 +40,7 @@
 #include "mlir/Support/LLVM.h"
 #include "mlir/Transforms/InliningUtils.h"
 #include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/Repeated.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/SmallVectorExtras.h"
@@ -3721,8 +3722,8 @@ class InsertChainFullyInitialized final : public OpRewritePattern<InsertOp> {
         continue;
       }
 
-      SmallVector<Type> elementToInsertTypes(insertSize,
-                                             srcVectorType.getElementType());
+      Repeated<Type> elementToInsertTypes(insertSize,
+                                          srcVectorType.getElementType());
       // Get all elements from the vector in row-major order.
       auto elementsToInsert = vector::ToElementsOp::create(
           rewriter, op.getLoc(), elementToInsertTypes, valueToStore);


        


More information about the Mlir-commits mailing list