116cbe883SMatthias Springer //===- Bufferize.cpp - Bufferization of linalg ops ------------------------===//
29ca97cdeSSean Silva //
39ca97cdeSSean Silva // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
49ca97cdeSSean Silva // See https://llvm.org/LICENSE.txt for license information.
59ca97cdeSSean Silva // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69ca97cdeSSean Silva //
79ca97cdeSSean Silva //===----------------------------------------------------------------------===//
89ca97cdeSSean Silva 
99ca97cdeSSean Silva #include "PassDetail.h"
10f89bb3c0SAlexander Belyaev 
1157470abcSAlexander Belyaev #include "mlir/Dialect/Bufferization/IR/Bufferization.h"
12f89bb3c0SAlexander Belyaev #include "mlir/Dialect/Bufferization/Transforms/Bufferize.h"
13b7f2c108Sgysit #include "mlir/Dialect/Linalg/IR/Linalg.h"
149ca97cdeSSean Silva #include "mlir/Dialect/Linalg/Passes.h"
1516cbe883SMatthias Springer #include "mlir/Dialect/Linalg/Transforms/BufferizableOpInterfaceImpl.h"
169ca97cdeSSean Silva #include "mlir/Dialect/Linalg/Transforms/Transforms.h"
17060208b4SMatthias Springer #include "mlir/Dialect/Tensor/IR/Tensor.h"
1801c44185SNicolas Vasilache #include "mlir/IR/BuiltinDialect.h"
199ca97cdeSSean Silva #include "mlir/IR/Operation.h"
209ca97cdeSSean Silva #include "mlir/Pass/Pass.h"
219ca97cdeSSean Silva 
2216cbe883SMatthias Springer using namespace mlir;
2316cbe883SMatthias Springer using namespace bufferization;
249ca97cdeSSean Silva 
259ca97cdeSSean Silva namespace {
269ca97cdeSSean Silva /// Converts Linalg operations that work on tensor-type operands or results to
279ca97cdeSSean Silva /// work on buffers.
289ca97cdeSSean Silva struct LinalgBufferizePass : public LinalgBufferizeBase<LinalgBufferizePass> {
runOnOperation__anon74c001240111::LinalgBufferizePass299ca97cdeSSean Silva   void runOnOperation() override {
3016cbe883SMatthias Springer     BufferizationOptions options = getPartialBufferizationOptions();
31*1534177fSMatthias Springer     options.opFilter.allowDialect<linalg::LinalgDialect>();
329ca97cdeSSean Silva 
3316cbe883SMatthias Springer     if (failed(bufferizeOp(getOperation(), options)))
34eb8d386dSSean Silva       signalPassFailure();
359ca97cdeSSean Silva   }
3616cbe883SMatthias Springer 
getDependentDialects__anon74c001240111::LinalgBufferizePass3716cbe883SMatthias Springer   void getDependentDialects(DialectRegistry &registry) const override {
3816cbe883SMatthias Springer     registry.insert<bufferization::BufferizationDialect, memref::MemRefDialect,
3916cbe883SMatthias Springer                     tensor::TensorDialect, linalg::LinalgDialect>();
4016cbe883SMatthias Springer     linalg::registerBufferizableOpInterfaceExternalModels(registry);
4116cbe883SMatthias Springer   }
429ca97cdeSSean Silva };
43be0a7e9fSMehdi Amini } // namespace
449ca97cdeSSean Silva 
createLinalgBufferizePass()4558ceae95SRiver Riddle std::unique_ptr<OperationPass<func::FuncOp>> mlir::createLinalgBufferizePass() {
469ca97cdeSSean Silva   return std::make_unique<LinalgBufferizePass>();
479ca97cdeSSean Silva }
48