[Mlir-commits] [mlir] 066d786 - [mlir][sparse] add folding to sparse_tensor.convert
Aart Bik
llvmlistbot at llvm.org
Thu Sep 9 15:45:27 PDT 2021
Author: Aart Bik
Date: 2021-09-09T15:45:19-07:00
New Revision: 066d786ce03b0aa30547abdbf7671eb35f00eb59
URL: https://github.com/llvm/llvm-project/commit/066d786ce03b0aa30547abdbf7671eb35f00eb59
DIFF: https://github.com/llvm/llvm-project/commit/066d786ce03b0aa30547abdbf7671eb35f00eb59.diff
LOG: [mlir][sparse] add folding to sparse_tensor.convert
folds conversion between identical types (with tests)
Reviewed By: ThomasRaoux
Differential Revision: https://reviews.llvm.org/D109545
Added:
mlir/test/Dialect/SparseTensor/fold.mlir
Modified:
mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorOps.td
mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp
mlir/test/Dialect/SparseTensor/conversion.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorOps.td b/mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorOps.td
index fb7494ce41d3d..c6f5c97e832a8 100644
--- a/mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorOps.td
+++ b/mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorOps.td
@@ -82,6 +82,7 @@ def SparseTensor_ConvertOp : SparseTensor_Op<"convert",
}];
let assemblyFormat = "$source attr-dict `:` type($source) `to` type($dest)";
+ let hasFolder = 1;
}
def SparseTensor_ToPointersOp : SparseTensor_Op<"pointers", [NoSideEffect]>,
diff --git a/mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp b/mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp
index 4987e5faf0e4c..a25a4b7346f07 100644
--- a/mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp
+++ b/mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp
@@ -230,6 +230,12 @@ static LogicalResult verify(ConvertOp op) {
return op.emitError("unexpected type in convert");
}
+OpFoldResult ConvertOp::fold(ArrayRef<Attribute> operands) {
+ if (getType() == source().getType())
+ return source();
+ return {};
+}
+
static LogicalResult verify(ToPointersOp op) {
if (auto e = getSparseTensorEncoding(op.tensor().getType())) {
if (failed(isInBounds(op.dim(), op.tensor())))
diff --git a/mlir/test/Dialect/SparseTensor/conversion.mlir b/mlir/test/Dialect/SparseTensor/conversion.mlir
index f3ea0c0584f17..deca4f12c0f3f 100644
--- a/mlir/test/Dialect/SparseTensor/conversion.mlir
+++ b/mlir/test/Dialect/SparseTensor/conversion.mlir
@@ -112,6 +112,14 @@ func @sparse_new3d(%arg0: !llvm.ptr<i8>) -> tensor<?x?x?xf32, #SparseTensor> {
return %0 : tensor<?x?x?xf32, #SparseTensor>
}
+// CHECK-LABEL: func @sparse_nop_convert(
+// CHECK-SAME: %[[A:.*]]: !llvm.ptr<i8>) -> !llvm.ptr<i8>
+// CHECK: return %[[A]] : !llvm.ptr<i8>
+func @sparse_nop_convert(%arg0: tensor<64xf32, #SparseVector>) -> tensor<64xf32, #SparseVector> {
+ %0 = sparse_tensor.convert %arg0 : tensor<64xf32, #SparseVector> to tensor<64xf32, #SparseVector>
+ return %0 : tensor<64xf32, #SparseVector>
+}
+
// CHECK-LABEL: func @sparse_convert_1d(
// CHECK-SAME: %[[A:.*]]: tensor<?xi32>) -> !llvm.ptr<i8>
// CHECK-DAG: %[[C0:.*]] = constant 0 : index
diff --git a/mlir/test/Dialect/SparseTensor/fold.mlir b/mlir/test/Dialect/SparseTensor/fold.mlir
new file mode 100644
index 0000000000000..b26f00329a439
--- /dev/null
+++ b/mlir/test/Dialect/SparseTensor/fold.mlir
@@ -0,0 +1,20 @@
+// RUN: mlir-opt %s --canonicalize --cse | FileCheck %s
+
+#SparseVector = #sparse_tensor.encoding<{dimLevelType = ["compressed"]}>
+
+// CHECK-LABEL: func @sparse_nop_convert(
+// CHECK-SAME: %[[A:.*]]: tensor<64xf32, #{{.*}}>)
+// CHECK: return %[[A]] : tensor<64xf32, #{{.*}}>
+func @sparse_nop_convert(%arg0: tensor<64xf32, #SparseVector>) -> tensor<64xf32, #SparseVector> {
+ %0 = sparse_tensor.convert %arg0 : tensor<64xf32, #SparseVector> to tensor<64xf32, #SparseVector>
+ return %0 : tensor<64xf32, #SparseVector>
+}
+
+// CHECK-LABEL: func @sparse_dce_convert(
+// CHECK-SAME: %[[A:.*]]: tensor<64xf32>)
+// CHECK-NOT: sparse_tensor.convert
+// CHECK: return
+func @sparse_dce_convert(%arg0: tensor<64xf32>) {
+ %0 = sparse_tensor.convert %arg0 : tensor<64xf32> to tensor<64xf32, #SparseVector>
+ return
+}
More information about the Mlir-commits
mailing list