llvm/mlir/include/mlir/Dialect/Bufferization/IR/BufferViewFlowOpInterface.td

//===-- BufferViewFlowOpInterface.td - Buffer View Flow ----*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef BUFFER_VIEW_FLOW_OP_INTERFACE
#define BUFFER_VIEW_FLOW_OP_INTERFACE

include "mlir/IR/OpBase.td"

def BufferViewFlowOpInterface :
    OpInterface<"BufferViewFlowOpInterface"> {
  let description = [{
    An op interface for the buffer view flow analysis. This interface describes
    buffer dependencies between operands and op results/region entry block
    arguments.
  }];
  let cppNamespace = "::mlir::bufferization";
  let methods = [
      InterfaceMethod<
        /*desc=*/[{
          Populate buffer dependencies between operands and op results/region
          entry block arguments.

          Implementations should register dependencies between an operand ("X")
          and an op result/region entry block argument ("Y") if Y may depend
          on X. Y depends on X if Y and X are the same buffer or if Y is a
          subview of X.

          Example:
          ```
          %r = arith.select %c, %m1, %m2 : memref<5xf32>
          ```
          In the above example, %0 may depend on %m1 or %m2 and a correct
          interface implementation should call:
          - "registerDependenciesFn(%m1, %r)".
          - "registerDependenciesFn(%m2, %r)"
        }],
        /*retType=*/"void",
        /*methodName=*/"populateDependencies",
        /*args=*/(ins
            "::mlir::bufferization::RegisterDependenciesFn"
                :$registerDependenciesFn)
      >,
      InterfaceMethod<
        /*desc=*/[{
          Return "true" if the given value may be a terminal buffer. A buffer
          value is "terminal" if it cannot be traced back any further in the
          buffer view flow analysis.

          Examples: A buffer could be terminal because:
          - it is a newly allocated buffer (e.g., "memref.alloc"),
          - or: because there is not enough compile-time information available
            to make a definite decision (e.g., "memref.realloc" may reallocate
            but we do not know for sure; another example are call ops where we
            would have to analyze the body of the callee).

          Implementations can assume that the given SSA value is an OpResult of
          this operation or a region entry block argument of this operation.
        }],
        /*retType=*/"bool",
        /*methodName=*/"mayBeTerminalBuffer",
        /*args=*/(ins "Value":$value),
        /*methodBody=*/"",
        /*defaultImplementation=*/"return false;"
      >,
  ];
}

#endif  // BUFFER_VIEW_FLOW_OP_INTERFACE