diff options
Diffstat (limited to 'mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp')
-rw-r--r-- | mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp b/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp index bcf6576abbb..ed9553d710d 100644 --- a/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp +++ b/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp @@ -173,6 +173,7 @@ struct TileCheck : public AffineExprVisitor<TileCheck> { static void transformIndexedGenericOpIndices( OpBuilder &b, LinalgOp op, ArrayRef<ValueHandle *> pivs, const LoopIndexToRangeIndexMap &loopIndexToRangeIndex) { + assert(op.hasBufferSemantics() && "expected linalg op with buffer semantics"); auto indexedGenericOp = dyn_cast<IndexedGenericOp>(op.getOperation()); if (!indexedGenericOp) return; @@ -232,6 +233,8 @@ static SmallVector<Value, 4> makeTiledViews(OpBuilder &b, Location loc, LinalgOp linalgOp, ArrayRef<Value> ivs, ArrayRef<Value> tileSizes, ArrayRef<Value> viewSizes, OperationFolder *folder) { + assert(linalgOp.hasBufferSemantics() && + "expected linalg op with buffer semantics"); assert(ivs.size() == static_cast<size_t>(llvm::count_if( llvm::make_range(tileSizes.begin(), tileSizes.end()), [](Value v) { return !isZero(v); })) && @@ -254,7 +257,7 @@ makeTiledViews(OpBuilder &b, Location loc, LinalgOp linalgOp, SmallVector<Value, 4> res; res.reserve(op->getNumOperands()); - auto viewIteratorBegin = linalgOp.getInputsAndOutputs().begin(); + auto viewIteratorBegin = linalgOp.getInputsAndOutputBuffers().begin(); for (unsigned viewIndex = 0; viewIndex < linalgOp.getNumInputsAndOutputs(); ++viewIndex) { Value view = *(viewIteratorBegin + viewIndex); @@ -309,6 +312,7 @@ Optional<TiledLinalgOp> mlir::linalg::tileLinalgOp(OpBuilder &b, LinalgOp op, ArrayRef<Value> tileSizes, ArrayRef<unsigned> permutation, OperationFolder *folder) { + assert(op.hasBufferSemantics() && "expected linalg op with buffer semantics"); // 1. Enforce the convention that "tiling by zero" skips tiling a particular // dimension. This convention is significantly simpler to handle instead of // adjusting affine maps to account for missing dimensions. @@ -383,6 +387,7 @@ mlir::linalg::tileLinalgOp(OpBuilder &b, LinalgOp op, ArrayRef<Value> tileSizes, Optional<TiledLinalgOp> mlir::linalg::tileLinalgOp( OpBuilder &b, LinalgOp op, ArrayRef<int64_t> tileSizes, ArrayRef<unsigned> permutation, OperationFolder *folder) { + assert(op.hasBufferSemantics() && "expected linalg op with buffer semantics"); if (tileSizes.empty()) return llvm::None; @@ -419,6 +424,8 @@ static void tileLinalgOps(FuncOp f, ArrayRef<int64_t> tileSizes) { OpBuilder b(f); OperationFolder folder(f.getContext()); f.walk([tileSizes, &b, &folder](LinalgOp op) { + if (!op.hasBufferSemantics()) + return; auto opLoopsPair = tileLinalgOp(b, op, tileSizes, /*permutation=*/{}, &folder); // If tiling occurred successfully, erase old op. |