74 lines
2.8 KiB
TableGen
74 lines
2.8 KiB
TableGen
//===-- 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
|