[mlir][sparse] implement sparse_tensor.lvl operation. (#69993)

This commit is contained in:
Peiming Liu
2023-10-24 13:23:28 -07:00
committed by GitHub
parent 260dbb45ac
commit c780352de9
15 changed files with 132 additions and 106 deletions

View File

@@ -293,26 +293,28 @@ public:
}
};
/// Sparse conversion rule for accessing dimension-sizes.
class SparseTensorToDimSizeConverter
: public OpConversionPattern<tensor::DimOp> {
/// Sparse conversion rule for accessing level-sizes.
class SparseTensorLvlOpConverter : public OpConversionPattern<LvlOp> {
public:
using OpConversionPattern::OpConversionPattern;
LogicalResult
matchAndRewrite(tensor::DimOp op, OpAdaptor adaptor,
matchAndRewrite(LvlOp op, OpAdaptor adaptor,
ConversionPatternRewriter &rewriter) const override {
const auto stt = getSparseTensorType(op.getSource());
// Only rewrite sparse DimOp.
if (!stt.hasEncoding())
return failure();
// Only rewrite DimOp with constant index.
std::optional<int64_t> dim = op.getConstantIndex();
if (!dim)
std::optional<int64_t> lvl = op.getConstantLvlIndex();
if (!lvl)
return failure();
// Generate the call.
// By now, if the level size is constant, the operation should have already
// been folded by LvlOp's folder, so we generate the call unconditionally.
Value src = adaptor.getOperands()[0];
rewriter.replaceOp(
op, createOrFoldDimCall(rewriter, op->getLoc(), stt, src, *dim));
rewriter.replaceOp(op, genLvlSizeCall(rewriter, op.getLoc(), src, *lvl));
return success();
}
};
@@ -767,7 +769,7 @@ mlir::SparseTensorTypeToPtrConverter::SparseTensorTypeToPtrConverter() {
void mlir::populateSparseTensorConversionPatterns(TypeConverter &typeConverter,
RewritePatternSet &patterns) {
patterns
.add<SparseReturnConverter, SparseTensorToDimSizeConverter,
.add<SparseReturnConverter, SparseTensorLvlOpConverter,
SparseCastConverter, SparseTensorNewConverter,
SparseTensorAllocConverter, SparseTensorEmptyConverter,
SparseTensorDeallocConverter, SparseTensorReorderCOOConverter,