mirror of
https://github.com/intel/llvm.git
synced 2026-01-28 01:04:49 +08:00
[mlir][sparse] Add has_runtime_library test op (#85355)
This commit adds a new test-only op: `sparse_tensor.has_runtime_library`. The op returns "1" if the sparse compiler runs in runtime library mode. This op is useful for writing test cases that require different IR depending on whether the sparse compiler runs in runtime library or codegen mode. This commit fixes a memory leak in `sparse_pack_d.mlir`. This test case uses `sparse_tensor.assemble` to create a sparse tensor SSA value from existing buffers. This runtime library reallocates+copies the existing buffers; the codegen path does not. Therefore, the test requires additional deallocations when running in runtime library mode. Alternatives considered: - Make the codegen path allocate. "Codegen" is the "default" compilation mode and it is handling `sparse_tensor.assemble` correctly. The issue is with the runtime library path, which should not allocate. Therefore, it is better to put a workaround in the runtime library path than to work around the issue with a new flag in the codegen path. - Add a `sparse_tensor.runtime_only` attribute to `bufferization.dealloc_tensor`. Verifying that the attribute can only be attached to `bufferization.dealloc_tensor` may introduce an unwanted dependency of `MLIRSparseTensorDialect` on `MLIRBufferizationDialect`.
This commit is contained in:
committed by
GitHub
parent
5124eedd35
commit
e8e8df4c1b
@@ -1561,6 +1561,19 @@ struct SparseNewConverter : public OpConversionPattern<NewOp> {
|
||||
}
|
||||
};
|
||||
|
||||
struct SparseHasRuntimeLibraryConverter
|
||||
: public OpConversionPattern<HasRuntimeLibraryOp> {
|
||||
using OpConversionPattern::OpConversionPattern;
|
||||
LogicalResult
|
||||
matchAndRewrite(HasRuntimeLibraryOp op, OpAdaptor adaptor,
|
||||
ConversionPatternRewriter &rewriter) const override {
|
||||
auto i1Type = rewriter.getI1Type();
|
||||
rewriter.replaceOpWithNewOp<arith::ConstantOp>(
|
||||
op, i1Type, rewriter.getIntegerAttr(i1Type, 0));
|
||||
return success();
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@@ -1572,21 +1585,21 @@ struct SparseNewConverter : public OpConversionPattern<NewOp> {
|
||||
void mlir::populateSparseTensorCodegenPatterns(
|
||||
TypeConverter &typeConverter, RewritePatternSet &patterns,
|
||||
bool createSparseDeallocs, bool enableBufferInitialization) {
|
||||
patterns.add<SparseAssembleOpConverter, SparseDisassembleOpConverter,
|
||||
SparseReturnConverter, SparseCallConverter, SparseLvlOpConverter,
|
||||
SparseCastConverter, SparseExtractSliceConverter,
|
||||
SparseTensorLoadConverter, SparseExpandConverter,
|
||||
SparseCompressConverter, SparseInsertConverter,
|
||||
SparseReorderCOOConverter, SparseReMapConverter,
|
||||
SparseSliceGetterOpConverter<ToSliceOffsetOp,
|
||||
StorageSpecifierKind::DimOffset>,
|
||||
SparseSliceGetterOpConverter<ToSliceStrideOp,
|
||||
StorageSpecifierKind::DimStride>,
|
||||
SparseToPositionsConverter, SparseToCoordinatesConverter,
|
||||
SparseToCoordinatesBufferConverter, SparseToValuesConverter,
|
||||
SparseConvertConverter, SparseNewConverter,
|
||||
SparseNumberOfEntriesConverter>(typeConverter,
|
||||
patterns.getContext());
|
||||
patterns.add<
|
||||
SparseAssembleOpConverter, SparseDisassembleOpConverter,
|
||||
SparseReturnConverter, SparseCallConverter, SparseLvlOpConverter,
|
||||
SparseCastConverter, SparseExtractSliceConverter,
|
||||
SparseTensorLoadConverter, SparseExpandConverter, SparseCompressConverter,
|
||||
SparseInsertConverter, SparseReorderCOOConverter, SparseReMapConverter,
|
||||
SparseSliceGetterOpConverter<ToSliceOffsetOp,
|
||||
StorageSpecifierKind::DimOffset>,
|
||||
SparseSliceGetterOpConverter<ToSliceStrideOp,
|
||||
StorageSpecifierKind::DimStride>,
|
||||
SparseToPositionsConverter, SparseToCoordinatesConverter,
|
||||
SparseToCoordinatesBufferConverter, SparseToValuesConverter,
|
||||
SparseConvertConverter, SparseNewConverter,
|
||||
SparseNumberOfEntriesConverter, SparseHasRuntimeLibraryConverter>(
|
||||
typeConverter, patterns.getContext());
|
||||
patterns.add<SparseTensorDeallocConverter>(
|
||||
typeConverter, patterns.getContext(), createSparseDeallocs);
|
||||
patterns.add<SparseTensorAllocConverter, SparseTensorEmptyConverter>(
|
||||
|
||||
Reference in New Issue
Block a user