| //===- Bufferization.h - Bufferization dialect ------------------*- 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_IR_BUFFERIZATION_H_ |
| #define MLIR_DIALECT_BUFFERIZATION_IR_BUFFERIZATION_H_ |
| |
| #include "mlir/Bytecode/BytecodeOpInterface.h" |
| #include "mlir/Dialect/Bufferization/IR/AllocationOpInterface.h" |
| #include "mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h" |
| #include "mlir/Interfaces/CopyOpInterface.h" |
| #include "mlir/Interfaces/DestinationStyleOpInterface.h" |
| #include "mlir/Interfaces/InferTypeOpInterface.h" |
| #include "mlir/Interfaces/SubsetOpInterface.h" |
| |
| //===----------------------------------------------------------------------===// |
| // Bufferization Dialect |
| //===----------------------------------------------------------------------===// |
| |
| #include "mlir/Dialect/Bufferization/IR/BufferizationOpsDialect.h.inc" |
| |
| //===----------------------------------------------------------------------===// |
| // Bufferization Dialect Operations |
| //===----------------------------------------------------------------------===// |
| |
| #define GET_OP_CLASSES |
| #include "mlir/Dialect/Bufferization/IR/BufferizationOps.h.inc" |
| |
| //===----------------------------------------------------------------------===// |
| // Helper functions |
| //===----------------------------------------------------------------------===// |
| |
| namespace mlir { |
| namespace bufferization { |
| /// Populate `dynamicDims` with tensor::DimOp / memref::DimOp results for all |
| /// dynamic dimensions of the given shaped value. |
| void populateDynamicDimSizes(OpBuilder &b, Location loc, Value shapedValue, |
| SmallVector<Value> &dynamicDims); |
| |
| /// Try to cast the given ranked MemRef-typed value to the given ranked MemRef |
| /// type. Insert a reallocation + copy if it cannot be statically guaranteed |
| /// that a direct cast would be valid. |
| /// |
| /// E.g., when casting from a ranked MemRef type with dynamic layout to a ranked |
| /// MemRef type with static layout, it is not statically known whether the cast |
| /// will succeed or not. Such `memref.cast` ops may fail at runtime. This |
| /// function never generates such casts and conservatively inserts a copy. |
| /// |
| /// This function returns `failure()` in case of unsupported casts. E.g., casts |
| /// with differing element types or memory spaces. |
| FailureOr<Value> castOrReallocMemRefValue(OpBuilder &b, Value value, |
| MemRefType type, |
| const BufferizationOptions &options); |
| |
| /// Try to fold to_buffer(to_tensor(x)). If x's type and the result type of the |
| /// to_buffer op are different, a memref.cast is needed. |
| LogicalResult foldToBufferToTensorPair(RewriterBase &rewriter, |
| ToBufferOp toBuffer, |
| const BufferizationOptions &options); |
| |
| /// Add the canonicalization patterns for bufferization.dealloc to the given |
| /// pattern set to make them available to other passes (such as |
| /// BufferDeallocationSimplification). |
| void populateDeallocOpCanonicalizationPatterns(RewritePatternSet &patterns, |
| MLIRContext *context); |
| |
| } // namespace bufferization |
| } // namespace mlir |
| |
| #endif // MLIR_DIALECT_BUFFERIZATION_IR_BUFFERIZATION_H_ |