//===- Transforms.h - Bufferization and related transforms ------*- C++ -*-===// // // 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 MLIR_DIALECT_BUFFERIZATION_TRANSFORMS_TRANSFORMS_H #define MLIR_DIALECT_BUFFERIZATION_TRANSFORMS_TRANSFORMS_H #include "mlir/Dialect/Bufferization/Transforms/OneShotAnalysis.h" #include "mlir/IR/Operation.h" namespace mlir { namespace bufferization { class AnalysisState; struct BufferizationStatistics; class OneShotAnalysisState; struct OneShotBufferizationOptions; /// Try to eliminate "tensor.empty" ops inside `op`. This transformation looks /// for subset ops that insert a tensor that originates from a "tensor.empty" /// (as per the reverse use-def chain). Such "tensor.empty" ops are replaced /// with the destination subset. /// /// E.g.: /// %0 = tensor.empty() : tensor<10xf32> /// %1 = linalg.fill ... outs(%0 : tensor<10xf32>) /// %2 = tensor.insert_slice %0 into %t ... /// /// In the above example, the subset op is "tensor.insert_slice". When tracing /// back the reverse use-def chain of a the source, we end up at a /// "tensor.empty" op. LogicalResult eliminateEmptyTensors(RewriterBase &rewriter, Operation *op); /// Try to eliminate "tensor.empty" ops inside `op`. /// /// This function overload accepts an existing `OneShotAnalysisState`, which /// contains in-place bufferization decisions. This overload is useful if an /// existing analysis should be reused for empty tensor elimination. LogicalResult eliminateEmptyTensors(RewriterBase &rewriter, Operation *op, OneShotAnalysisState &state); /// Within the given operation, hoist buffers from loops where possible. See /// "BufferLoopHoistingPass" for more information. void hoistBuffersFromLoops(Operation *op); /// Resolve RaW and other conflicts by inserting bufferization.alloc_tensor ops. /// After applying this transform, the IR can be bufferized without inserting /// additional buffer allocations. LogicalResult insertTensorCopies(Operation *op, const OneShotBufferizationOptions &options, BufferizationStatistics *statistics = nullptr); /// Resolve RaW and other conflicts by inserting bufferization.alloc_tensor ops. /// After applying this transform, the IR can be bufferized without inserting /// additional buffer allocations. LogicalResult insertTensorCopies(Operation *op, const AnalysisState &state); /// Populate patterns to lower tensor.empty ops to bufferization.alloc_tensor /// ops. void populateEmptyTensorToAllocTensorPattern(RewritePatternSet &patterns); } // namespace bufferization } // namespace mlir #endif // MLIR_DIALECT_BUFFERIZATION_TRANSFORMS_TRANSFORMS_H