[Mlir-commits] [mlir] 58b449c - [mlir][sparse] Replace the folding of nop convert with a codegen rule.
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Oct 19 10:20:52 PDT 2022
Author: bixia1
Date: 2022-10-19T10:20:47-07:00
New Revision: 58b449c3bb9ddd49c9c840bdd4ed46135c1254e1
URL: https://github.com/llvm/llvm-project/commit/58b449c3bb9ddd49c9c840bdd4ed46135c1254e1
DIFF: https://github.com/llvm/llvm-project/commit/58b449c3bb9ddd49c9c840bdd4ed46135c1254e1.diff
LOG: [mlir][sparse] Replace the folding of nop convert with a codegen rule.
This is to allow the use of a nop convert to express that the sparse tensor
allocated through bufferization::AllocTensorOp will be expanded to sparse
tensor storage by sparse tensor codegen.
Reviewed By: aartbik
Differential Revision: https://reviews.llvm.org/D136214
Added:
Modified:
mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorOps.td
mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp
mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp
mlir/test/Dialect/SparseTensor/codegen.mlir
mlir/test/Dialect/SparseTensor/fold.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorOps.td b/mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorOps.td
index 16a056523641d..df02c5e801da9 100644
--- a/mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorOps.td
+++ b/mlir/include/mlir/Dialect/SparseTensor/IR/SparseTensorOps.td
@@ -86,7 +86,6 @@ def SparseTensor_ConvertOp : SparseTensor_Op<"convert",
}];
let assemblyFormat = "$source attr-dict `:` type($source) `to` type($dest)";
- let hasFolder = 1;
let hasVerifier = 1;
}
diff --git a/mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp b/mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp
index 7822b40c287a5..e9168f7a40517 100644
--- a/mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp
+++ b/mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp
@@ -333,12 +333,6 @@ LogicalResult ConvertOp::verify() {
return emitError("unexpected type in convert");
}
-OpFoldResult ConvertOp::fold(ArrayRef<Attribute> operands) {
- if (getType() == getSource().getType())
- return getSource();
- return {};
-}
-
LogicalResult ToPointersOp::verify() {
auto e = getSparseTensorEncoding(getTensor().getType());
if (failed(isInBounds(getDimension().getZExtValue(), getTensor())))
diff --git a/mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp b/mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp
index 77bfef7c7d8aa..707c6c99734cd 100644
--- a/mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp
+++ b/mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp
@@ -720,6 +720,22 @@ class SparseToValuesConverter
}
};
+/// Sparse codegen rule for the convert operator.
+class SparseConvertConverter : public OpConversionPattern<ConvertOp> {
+public:
+ using OpConversionPattern::OpConversionPattern;
+ LogicalResult
+ matchAndRewrite(ConvertOp op, OpAdaptor adaptor,
+ ConversionPatternRewriter &rewriter) const override {
+ if (op.getType() != op.getSource().getType()) {
+ // This should be handled by rewriting before codegen.
+ return failure();
+ }
+ rewriter.replaceOp(op, adaptor.getSource());
+ return success();
+ }
+};
+
} // namespace
//===----------------------------------------------------------------------===//
@@ -744,6 +760,6 @@ void mlir::populateSparseTensorCodegenPatterns(TypeConverter &typeConverter,
SparseTensorDeallocConverter, SparseTensorLoadConverter,
SparseExpandConverter, SparseCompressConverter,
SparseInsertConverter, SparseToPointersConverter,
- SparseToIndicesConverter, SparseToValuesConverter>(
- typeConverter, patterns.getContext());
+ SparseToIndicesConverter, SparseToValuesConverter,
+ SparseConvertConverter>(typeConverter, patterns.getContext());
}
diff --git a/mlir/test/Dialect/SparseTensor/codegen.mlir b/mlir/test/Dialect/SparseTensor/codegen.mlir
index b469e669f8218..6a32c72daa7fd 100644
--- a/mlir/test/Dialect/SparseTensor/codegen.mlir
+++ b/mlir/test/Dialect/SparseTensor/codegen.mlir
@@ -518,3 +518,15 @@ func.func @sparse_insert_typed(%arg0: tensor<128xf64, #SparseVector>, %arg1: ind
%1 = sparse_tensor.load %0 hasInserts : tensor<128xf64, #SparseVector>
return %1 : tensor<128xf64, #SparseVector>
}
+
+// CHECK-LABEL: func.func @sparse_nop_convert(
+// CHECK-SAME: %[[A0:.*]]: memref<1xindex>,
+// CHECK-SAME: %[[A1:.*]]: memref<3xindex>,
+// CHECK-SAME: %[[A2:.*]]: memref<?xi32>,
+// CHECK-SAME: %[[A3:.*]]: memref<?xi64>,
+// CHECK-SAME: %[[A4:.*]]: memref<?xf32>)
+// CHECK: return %[[A0]], %[[A1]], %[[A2]], %[[A3]], %[[A4]] : memref<1xindex>, memref<3xindex>, memref<?xi32>, memref<?xi64>, memref<?xf32>
+func.func @sparse_nop_convert(%arg0: tensor<?xf32, #SparseVector>) -> tensor<?xf32, #SparseVector> {
+ %0 = sparse_tensor.convert %arg0 : tensor<?xf32, #SparseVector> to tensor<?xf32, #SparseVector>
+ return %0 : tensor<?xf32, #SparseVector>
+}
diff --git a/mlir/test/Dialect/SparseTensor/fold.mlir b/mlir/test/Dialect/SparseTensor/fold.mlir
index 58900ad233cf6..fba2e8e9ceecb 100644
--- a/mlir/test/Dialect/SparseTensor/fold.mlir
+++ b/mlir/test/Dialect/SparseTensor/fold.mlir
@@ -2,15 +2,6 @@
#SparseVector = #sparse_tensor.encoding<{dimLevelType = ["compressed"]}>
-// CHECK-LABEL: func @sparse_nop_convert(
-// CHECK-SAME: %[[A:.*]]: tensor<64xf32, #sparse_tensor.encoding<{{{.*}}}>>)
-// CHECK-NOT: sparse_tensor.convert
-// CHECK: return %[[A]] : tensor<64xf32, #sparse_tensor.encoding<{{{.*}}}>>
-func.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
More information about the Mlir-commits
mailing list