[mlir][sparse] reuse tensor.insert operation to insert elements into … (#84987)
…a sparse tensor.
This commit is contained in:
@@ -580,17 +580,24 @@ public:
|
||||
};
|
||||
|
||||
/// Sparse conversion rule for the insertion operator.
|
||||
class SparseTensorInsertConverter : public OpConversionPattern<InsertOp> {
|
||||
class SparseTensorInsertConverter
|
||||
: public OpConversionPattern<tensor::InsertOp> {
|
||||
public:
|
||||
using OpConversionPattern::OpConversionPattern;
|
||||
LogicalResult
|
||||
matchAndRewrite(InsertOp op, OpAdaptor adaptor,
|
||||
matchAndRewrite(tensor::InsertOp op, OpAdaptor adaptor,
|
||||
ConversionPatternRewriter &rewriter) const override {
|
||||
// Note that the current regime only allows for strict lexicographic
|
||||
// coordinate order. All values are passed by reference through stack
|
||||
// allocated memrefs.
|
||||
Location loc = op->getLoc();
|
||||
const auto stt = getSparseTensorType(op.getTensor());
|
||||
const auto stt = getSparseTensorType(op.getDest());
|
||||
|
||||
// Dense tensor insertion.
|
||||
if (!stt.hasEncoding())
|
||||
return failure();
|
||||
|
||||
assert(stt.isIdentity() && "Run reinterpret-map before conversion.");
|
||||
const auto elemTp = stt.getElementType();
|
||||
const Level lvlRank = stt.getLvlRank();
|
||||
Value lvlCoords, vref;
|
||||
@@ -608,12 +615,12 @@ public:
|
||||
lvlCoords = genAlloca(rewriter, loc, lvlRank, rewriter.getIndexType());
|
||||
vref = genAllocaScalar(rewriter, loc, elemTp);
|
||||
}
|
||||
storeAll(rewriter, loc, lvlCoords, adaptor.getLvlCoords());
|
||||
rewriter.create<memref::StoreOp>(loc, adaptor.getValue(), vref);
|
||||
storeAll(rewriter, loc, lvlCoords, adaptor.getIndices());
|
||||
rewriter.create<memref::StoreOp>(loc, adaptor.getScalar(), vref);
|
||||
SmallString<12> name{"lexInsert", primaryTypeFunctionSuffix(elemTp)};
|
||||
createFuncCall(rewriter, loc, name, {},
|
||||
{adaptor.getTensor(), lvlCoords, vref}, EmitCInterface::On);
|
||||
rewriter.replaceOp(op, adaptor.getTensor());
|
||||
{adaptor.getDest(), lvlCoords, vref}, EmitCInterface::On);
|
||||
rewriter.replaceOp(op, adaptor.getDest());
|
||||
return success();
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user