xref: /llvm-project/mlir/lib/Dialect/MemRef/Transforms/BufferViewFlowOpInterfaceImpl.cpp (revision a45e58af1b381cf3c0374332386b8291ec5310f4)
1 //===- BufferViewFlowOpInterfaceImpl.cpp - Buffer View Flow Analysis ------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "mlir/Dialect/MemRef/Transforms/BufferViewFlowOpInterfaceImpl.h"
10 
11 #include "mlir/Dialect/Bufferization/IR/BufferViewFlowOpInterface.h"
12 #include "mlir/Dialect/MemRef/IR/MemRef.h"
13 
14 using namespace mlir;
15 using namespace mlir::bufferization;
16 
17 namespace mlir {
18 namespace memref {
19 namespace {
20 
21 struct ReallocOpInterface
22     : public BufferViewFlowOpInterface::ExternalModel<ReallocOpInterface,
23                                                       ReallocOp> {
24   void
populateDependenciesmlir::memref::__anonbf0ddcb90111::ReallocOpInterface25   populateDependencies(Operation *op,
26                        RegisterDependenciesFn registerDependenciesFn) const {
27     auto reallocOp = cast<ReallocOp>(op);
28     // memref.realloc may return the source operand.
29     registerDependenciesFn(reallocOp.getSource(), reallocOp.getResult());
30   }
31 
mayBeTerminalBuffermlir::memref::__anonbf0ddcb90111::ReallocOpInterface32   bool mayBeTerminalBuffer(Operation *op, Value value) const {
33     // The return value of memref.realloc is a terminal buffer because the op
34     // may return a newly allocated buffer.
35     return true;
36   }
37 };
38 
39 } // namespace
40 } // namespace memref
41 } // namespace mlir
42 
registerBufferViewFlowOpInterfaceExternalModels(DialectRegistry & registry)43 void memref::registerBufferViewFlowOpInterfaceExternalModels(
44     DialectRegistry &registry) {
45   registry.addExtension(+[](MLIRContext *ctx, memref::MemRefDialect *dialect) {
46     ReallocOp::attachInterface<ReallocOpInterface>(*ctx);
47   });
48 }
49