[Mlir-commits] [mlir] [mlir][sparse] Return actual identity map instead of null map (PR #70365)
Yinying Li
llvmlistbot at llvm.org
Thu Oct 26 11:42:49 PDT 2023
https://github.com/yinying-lisa-li created https://github.com/llvm/llvm-project/pull/70365
Changes:
1. For both dimToLvl and lvlToDim, always returns the actual map instead of AffineMap() for identity map.
2. Updated custom builder for encoding to have default values.
3. Non-inferable lvlToDim will still return AffineMap() during inference, so it will be caught by verifier.
>From de7cf5cc49bd8fc4463180c461b50b8d16def6a3 Mon Sep 17 00:00:00 2001
From: Yinying Li <yinyingli at google.com>
Date: Wed, 25 Oct 2023 22:22:17 +0000
Subject: [PATCH] [mlir][sparse] Return actual identity map instead of null map
Changes:
1. For both dimToLvl and lvlToDim, always returns the actual map instead of AffineMap() for identity map.
2. Updated custom builder for encoding to have default values.
3. Non-inferable lvlToDim will still return AffineMap() during inference, so it will be caught by verifier.
---
.../Dialect/SparseTensor/IR/SparseTensorAttrDefs.td | 11 +++++++----
mlir/lib/Dialect/SparseTensor/IR/Detail/DimLvlMap.cpp | 5 +++--
.../Dialect/SparseTensor/IR/SparseTensorDialect.cpp | 4 ++--
mlir/test/python/dialects/sparse_tensor/dialect.py | 4 ++--
4 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorAttrDefs.td b/mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorAttrDefs.td
index 2dd7f8e961929cf..5348cc230ffc0d2 100644
--- a/mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorAttrDefs.td
+++ b/mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorAttrDefs.td
@@ -303,10 +303,13 @@ def SparseTensorEncodingAttr : SparseTensor_Attr<"SparseTensorEncoding",
let builders = [
AttrBuilder<(ins "ArrayRef<::mlir::sparse_tensor::DimLevelType>":$lvlTypes,
- "AffineMap":$dimToLvl,
- "AffineMap":$lvlToDim,
- "unsigned":$posWidth,
- "unsigned":$crdWidth), [{
+ CArg<"AffineMap", "{}">:$dimToLvl,
+ CArg<"AffineMap", "{}">:$lvlToDim,
+ CArg<"unsigned", "0">:$posWidth,
+ CArg<"unsigned", "0">:$crdWidth), [{
+ if (!dimToLvl) {
+ dimToLvl = ::mlir::AffineMap::getMultiDimIdentityMap(lvlTypes.size(), $_ctxt);
+ }
if (!lvlToDim) {
lvlToDim = ::mlir::sparse_tensor::inferLvlToDim(dimToLvl, $_ctxt);
}
diff --git a/mlir/lib/Dialect/SparseTensor/IR/Detail/DimLvlMap.cpp b/mlir/lib/Dialect/SparseTensor/IR/Detail/DimLvlMap.cpp
index 851867926fe679e..cc10f0b7238d4a8 100644
--- a/mlir/lib/Dialect/SparseTensor/IR/Detail/DimLvlMap.cpp
+++ b/mlir/lib/Dialect/SparseTensor/IR/Detail/DimLvlMap.cpp
@@ -314,7 +314,6 @@ AffineMap DimLvlMap::getDimToLvlMap(MLIRContext *context) const {
for (const auto &lvlSpec : lvlSpecs)
lvlAffines.push_back(lvlSpec.getExpr().getAffineExpr());
auto map = AffineMap::get(getDimRank(), getSymRank(), lvlAffines, context);
- if (map.isIdentity()) return AffineMap();
return map;
}
@@ -328,7 +327,9 @@ AffineMap DimLvlMap::getLvlToDimMap(MLIRContext *context) const {
}
}
auto map = AffineMap::get(getLvlRank(), getSymRank(), dimAffines, context);
- if (dimAffines.empty() || map.isIdentity())
+ // If no lvlToDim map was passed in, returns a null AffineMap and infers it
+ // in SparseTensorEncodingAttr::parse.
+ if (dimAffines.empty())
return AffineMap();
return map;
}
diff --git a/mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp b/mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp
index 359c0a696858329..904cc2e4f8e6e17 100644
--- a/mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp
+++ b/mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp
@@ -291,8 +291,8 @@ SparseTensorEncodingAttr
SparseTensorEncodingAttr::withDimToLvl(AffineMap dimToLvl) const {
assert(getImpl() && "Uninitialized SparseTensorEncodingAttr");
return SparseTensorEncodingAttr::get(getContext(), getLvlTypes(), dimToLvl,
- getLvlToDim(), getPosWidth(),
- getCrdWidth());
+ AffineMap(),
+ getPosWidth(), getCrdWidth());
}
SparseTensorEncodingAttr
diff --git a/mlir/test/python/dialects/sparse_tensor/dialect.py b/mlir/test/python/dialects/sparse_tensor/dialect.py
index 240db6ebd1d1eb3..fe7b41e536e2763 100644
--- a/mlir/test/python/dialects/sparse_tensor/dialect.py
+++ b/mlir/test/python/dialects/sparse_tensor/dialect.py
@@ -30,9 +30,9 @@ def testEncodingAttr1D():
# CHECK: lvl_types: [<DimLevelType.compressed: 8>]
print(f"lvl_types: {casted.lvl_types}")
- # CHECK: dim_to_lvl: None
+ # CHECK: dim_to_lvl: (d0) -> (d0)
print(f"dim_to_lvl: {casted.dim_to_lvl}")
- # CHECK: lvl_to_dim: None
+ # CHECK: lvl_to_dim: (d0) -> (d0)
print(f"lvl_to_dim: {casted.lvl_to_dim}")
# CHECK: pos_width: 16
print(f"pos_width: {casted.pos_width}")
More information about the Mlir-commits
mailing list