[mlir][sparse] implement sparse_tensor.lvl operation. (#69993)
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user