1 | //===- Bufferization.h - Bufferization dialect ------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef MLIR_DIALECT_BUFFERIZATION_IR_BUFFERIZATION_H_ |
10 | #define MLIR_DIALECT_BUFFERIZATION_IR_BUFFERIZATION_H_ |
11 | |
12 | #include "mlir/Bytecode/BytecodeOpInterface.h" |
13 | #include "mlir/Dialect/Bufferization/IR/AllocationOpInterface.h" |
14 | #include "mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h" |
15 | #include "mlir/Interfaces/CopyOpInterface.h" |
16 | #include "mlir/Interfaces/DestinationStyleOpInterface.h" |
17 | #include "mlir/Interfaces/InferTypeOpInterface.h" |
18 | #include "mlir/Interfaces/SubsetOpInterface.h" |
19 | |
20 | //===----------------------------------------------------------------------===// |
21 | // Bufferization Dialect |
22 | //===----------------------------------------------------------------------===// |
23 | |
24 | #include "mlir/Dialect/Bufferization/IR/BufferizationOpsDialect.h.inc" |
25 | |
26 | //===----------------------------------------------------------------------===// |
27 | // Bufferization Dialect Operations |
28 | //===----------------------------------------------------------------------===// |
29 | |
30 | #define GET_OP_CLASSES |
31 | #include "mlir/Dialect/Bufferization/IR/BufferizationOps.h.inc" |
32 | |
33 | //===----------------------------------------------------------------------===// |
34 | // Helper functions |
35 | //===----------------------------------------------------------------------===// |
36 | |
37 | namespace mlir { |
38 | namespace bufferization { |
39 | /// Populate `dynamicDims` with tensor::DimOp / memref::DimOp results for all |
40 | /// dynamic dimensions of the given shaped value. |
41 | void populateDynamicDimSizes(OpBuilder &b, Location loc, Value shapedValue, |
42 | SmallVector<Value> &dynamicDims); |
43 | |
44 | /// Try to cast the given ranked MemRef-typed value to the given ranked MemRef |
45 | /// type. Insert a reallocation + copy if it cannot be statically guaranteed |
46 | /// that a direct cast would be valid. |
47 | /// |
48 | /// E.g., when casting from a ranked MemRef type with dynamic layout to a ranked |
49 | /// MemRef type with static layout, it is not statically known whether the cast |
50 | /// will succeed or not. Such `memref.cast` ops may fail at runtime. This |
51 | /// function never generates such casts and conservatively inserts a copy. |
52 | /// |
53 | /// This function returns `failure()` in case of unsupported casts. E.g., casts |
54 | /// with differing element types or memory spaces. |
55 | FailureOr<Value> castOrReallocMemRefValue(OpBuilder &b, Value value, |
56 | MemRefType type, |
57 | const BufferizationOptions &options); |
58 | |
59 | /// Try to fold to_memref(to_tensor(x)). If x's type and the result type of the |
60 | /// to_memref op are different, a memref.cast is needed. |
61 | LogicalResult foldToMemrefToTensorPair(RewriterBase &rewriter, |
62 | ToMemrefOp toMemref, |
63 | const BufferizationOptions &options); |
64 | |
65 | /// Add the canonicalization patterns for bufferization.dealloc to the given |
66 | /// pattern set to make them available to other passes (such as |
67 | /// BufferDeallocationSimplification). |
68 | void populateDeallocOpCanonicalizationPatterns(RewritePatternSet &patterns, |
69 | MLIRContext *context); |
70 | |
71 | } // namespace bufferization |
72 | } // namespace mlir |
73 | |
74 | #endif // MLIR_DIALECT_BUFFERIZATION_IR_BUFFERIZATION_H_ |
75 | |