[Mlir-commits] [mlir] [mlir] Optimize const values AffineMap::compose (PR #141005)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Fri May 23 17:18:53 PDT 2025


https://github.com/qazwsxedcrfvtg14 updated https://github.com/llvm/llvm-project/pull/141005

>From 1d4aa69853fb93d52c046b57da17b90b86a5feb8 Mon Sep 17 00:00:00 2001
From: Yi Chou <yich at google.com>
Date: Thu, 22 May 2025 04:31:49 +0000
Subject: [PATCH] [mlir] Optimize const values AffineMap::compose

The original implementation will create two intermediate AffineMap in the
context, calling this compose function with different values multiple
times will occupy a lot of memory.

To improve the performance, we can call the AffineExpr::replace
directly, so we don't need to store all combinations of values in the
context.
---
 mlir/lib/IR/AffineMap.cpp | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/mlir/lib/IR/AffineMap.cpp b/mlir/lib/IR/AffineMap.cpp
index 72effb38d614c..2838843e2eba6 100644
--- a/mlir/lib/IR/AffineMap.cpp
+++ b/mlir/lib/IR/AffineMap.cpp
@@ -580,15 +580,13 @@ AffineMap AffineMap::compose(AffineMap map) const {
 SmallVector<int64_t, 4> AffineMap::compose(ArrayRef<int64_t> values) const {
   assert(getNumSymbols() == 0 && "Expected symbol-less map");
   SmallVector<AffineExpr, 4> exprs;
-  exprs.reserve(values.size());
   MLIRContext *ctx = getContext();
-  for (auto v : values)
-    exprs.push_back(getAffineConstantExpr(v, ctx));
-  auto resMap = compose(AffineMap::get(0, 0, exprs, ctx));
+  for (int64_t value : values)
+    exprs.push_back(getAffineConstantExpr(value, ctx));
   SmallVector<int64_t, 4> res;
-  res.reserve(resMap.getNumResults());
-  for (auto e : resMap.getResults())
-    res.push_back(cast<AffineConstantExpr>(e).getValue());
+  res.reserve(getNumResults());
+  for (auto e : getResults())
+    res.push_back(cast<AffineConstantExpr>(e.replaceDims(exprs)).getValue());
   return res;
 }
 



More information about the Mlir-commits mailing list