This commit adds the `BufferViewFlowOpInterface` to the bufferization dialect. This interface can be implemented by ops that operate on buffers to indicate that a buffer op result and/or region entry block argument may be the same buffer as a buffer operand (or a view thereof). This interface is queried by the `BufferViewFlowAnalysis`. The new interface has two interface methods: * `populateDependencies`: Implementations use the provided callback to declare dependencies between operands and op results/region entry block arguments. E.g., for `%r = arith.select %c, %m1, %m2 : memref<5xf32>`, the interface implementation should declare two dependencies: %m1 -> %r and %m2 -> %r. * `mayBeTerminalBuffer`: An SSA value is a terminal buffer if the buffer view flow analysis stops at the specified value. E.g., because the value is a newly allocated buffer or because no further information is available about the origin of the buffer. Ops that implement the `RegionBranchOpInterface` or `BranchOpInterface` do not have to implement the `BufferViewFlowOpInterface`. The buffer dependencies can be inferred from those two interfaces. This commit makes the `BufferViewFlowAnalysis` more accurate. For unknown ops, it conservatively used to declare all combinations of operands and op results/region entry block arguments as dependencies (false positives). This is no longer the case. While the analysis is still a "maybe" analysis with false positives (e.g., when analyzing ops such as `arith.select` or `scf.if` where the taken branch is not known at compile time), results and region entry block arguments of unknown ops are now marked as terminal buffers. This commit addresses a TODO in `BufferViewFlowAnalysis.cpp`: ``` // TODO: We should have an op interface instead of a hard-coded list of // interfaces/ops. ``` It is no longer needed to hard-code ops.
46 lines
964 B
CMake
46 lines
964 B
CMake
add_mlir_dialect_library(MLIRMemRefTransforms
|
|
AllocationOpInterfaceImpl.cpp
|
|
BufferViewFlowOpInterfaceImpl.cpp
|
|
ComposeSubView.cpp
|
|
ExpandOps.cpp
|
|
ExpandRealloc.cpp
|
|
ExpandStridedMetadata.cpp
|
|
EmulateWideInt.cpp
|
|
EmulateNarrowType.cpp
|
|
ExtractAddressComputations.cpp
|
|
FoldMemRefAliasOps.cpp
|
|
IndependenceTransforms.cpp
|
|
MultiBuffer.cpp
|
|
NormalizeMemRefs.cpp
|
|
ResolveShapedTypeResultDims.cpp
|
|
RuntimeOpVerification.cpp
|
|
|
|
ADDITIONAL_HEADER_DIRS
|
|
${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/MemRef
|
|
|
|
DEPENDS
|
|
MLIRMemRefPassIncGen
|
|
|
|
LINK_LIBS PUBLIC
|
|
MLIRAffineDialect
|
|
MLIRAffineTransforms
|
|
MLIRAffineUtils
|
|
MLIRArithDialect
|
|
MLIRArithTransforms
|
|
MLIRBufferizationDialect
|
|
MLIRBufferizationTransforms
|
|
MLIRDialectUtils
|
|
MLIRFuncDialect
|
|
MLIRGPUDialect
|
|
MLIRInferTypeOpInterface
|
|
MLIRLoopLikeInterface
|
|
MLIRMemRefDialect
|
|
MLIRNVGPUDialect
|
|
MLIRPass
|
|
MLIRTensorDialect
|
|
MLIRTransforms
|
|
MLIRValueBoundsOpInterface
|
|
MLIRVectorDialect
|
|
)
|
|
|