My Project
Utils.h
Go to the documentation of this file.
1 //===- Utils.h - Utilities to support the Linalg dialect --------*- C++ -*-===//
2 //
3 // Part of the MLIR 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_LINALG_UTILS_H_
10 #define MLIR_DIALECT_LINALG_UTILS_H_
11 
15 #include "mlir/EDSC/Helpers.h"
16 
17 #include "llvm/ADT/SetVector.h"
18 
19 namespace mlir {
20 class AffineExpr;
21 class AffineMap;
22 class OperationFolder;
23 
24 namespace edsc {
25 
31 public:
38 
39  LoopRangeBuilder(const LoopRangeBuilder &) = delete;
40  LoopRangeBuilder(LoopRangeBuilder &&) = default;
41 
42  LoopRangeBuilder &operator=(const LoopRangeBuilder &) = delete;
44 
48  ValueHandle operator()(std::function<void(void)> fun = nullptr);
49 };
50 
55 public:
59  ArrayRef<Value> ranges);
62  edsc::ValueHandle operator()(std::function<void(void)> fun = nullptr);
63 
64 private:
66 };
67 
70 template <typename LoopTy> class GenericLoopNestRangeBuilder {
71 public:
73  ArrayRef<Value> ranges);
74  void operator()(std::function<void(void)> fun = nullptr) { (*builder)(fun); }
75 
76 private:
77  typedef typename std::conditional<std::is_same<LoopTy, AffineForOp>::value,
79  LoopNestRangeBuilder>::type BuilderType;
80  std::unique_ptr<BuilderType> builder;
81 };
82 
83 } // namespace edsc
84 
85 namespace linalg {
86 class LinalgDependenceGraph;
87 
88 struct FusionInfo {
89  LinalgOp originalProducer;
90  LinalgOp fusedProducer;
91 };
92 
97  LinalgOp consumer, Value consumedView,
98  LinalgOp producer);
99 
103 bool isFusableInto(const LinalgDependenceGraph &graph, LinalgOp consumer,
104  Value consumedView, LinalgOp producer);
105 
111 Optional<FusionInfo> fuseProducerOf(OpBuilder &b, LinalgOp consumer,
112  unsigned consumerIdx,
113  const LinalgDependenceGraph &graph,
114  OperationFolder *folder = nullptr);
115 
119 template <typename ConcreteOp>
120 SmallVector<Value, 8> getViewSizes(ConcreteOp linalgOp) {
122  for (auto v : linalgOp.getInputsAndOutputs()) {
123  MemRefType t = v->getType().template cast<MemRefType>();
124  for (unsigned i = 0; i < t.getRank(); ++i)
125  res.push_back(edsc::intrinsics::dim(v, i));
126  }
127  return res;
128 }
129 
135  AffineMap map, ArrayRef<Value> values,
136  OperationFolder *folder = nullptr);
137 
139  LinalgOp op;
141 };
142 
159  ArrayRef<Value> tileSizes,
160  ArrayRef<unsigned> permutation = {},
161  OperationFolder *folder = nullptr);
162 
179  ArrayRef<int64_t> tileSizes,
180  ArrayRef<unsigned> permutation = {},
181  OperationFolder *folder = nullptr);
182 
183 template <typename... Args>
185  Args... args) {
186  return tileLinalgOp(b, cast<LinalgOp>(op), args...);
187 }
188 
193 };
194 
208  bool dynamicBuffers = false, OperationFolder *folder = nullptr);
209 
214 
219 template <typename T, unsigned N>
221  ArrayRef<unsigned> permutation) {
222  SmallVector<T, N> auxVec(inVec.size());
223  for (unsigned i = 0; i < permutation.size(); ++i)
224  auxVec[i] = inVec[permutation[i]];
225  inVec = auxVec;
226 }
227 
233 LinalgOp promoteSubViewOperands(OpBuilder &b, LinalgOp op,
234  llvm::SetVector<Value> subViews,
235  bool dynamicBuffers = false,
236  OperationFolder *folder = nullptr);
237 
238 } // namespace linalg
239 } // namespace mlir
240 
241 #endif // MLIR_DIALECT_LINALG_UTILS_H_
Definition: InferTypeOpInterface.cpp:20
Definition: Builders.h:201
Definition: Operation.h:27
bool isProducerLastWriteOfView(const LinalgDependenceGraph &graph, LinalgOp consumer, Value consumedView, LinalgOp producer)
Definition: Fusion.cpp:217
void operator()(std::function< void(void)> fun=nullptr)
Definition: Utils.h:74
Definition: Attributes.h:129
Definition: Builders.h:290
Definition: Utils.h:30
Definition: Intrinsics.h:125
Definition: LLVM.h:40
Definition: Utils.h:54
Definition: Location.h:52
ValueHandle operator()(std::function< void(void)> fun=nullptr)
Definition: Utils.cpp:60
LinalgOp op
Definition: Utils.h:139
Definition: LLVM.h:37
bool isFusableInto(const LinalgDependenceGraph &graph, LinalgOp consumer, Value consumedView, LinalgOp producer)
Definition: Fusion.cpp:237
auto map(Fn fun, IterType begin, IterType end) -> SmallVector< typename std::result_of< Fn(decltype(*begin))>::type, 8 >
Map with iterators.
Definition: Functional.h:28
Definition: Builders.h:94
Definition: DependenceAnalysis.h:44
Optional< FusionInfo > fuseProducerOf(OpBuilder &b, LinalgOp consumer, unsigned consumerIdx, const LinalgDependenceGraph &graph, OperationFolder *folder=nullptr)
Definition: Fusion.cpp:253
Optional< TiledLinalgOp > tileLinalgOperation(OpBuilder &b, Operation *op, Args... args)
Definition: Utils.h:184
Optional< TiledLinalgOp > tileLinalgOp(OpBuilder &b, LinalgOp op, ArrayRef< int64_t > tileSizes, ArrayRef< unsigned > permutation={}, OperationFolder *folder=nullptr)
Definition: Tiling.cpp:383
Definition: StandardTypes.h:390
Definition: AffineMap.h:37
LoopRangeBuilder & operator=(const LoopRangeBuilder &)=delete
LinalgOp fusedProducer
Definition: Utils.h:90
Definition: Utils.h:189
Value buffer
Definition: Utils.h:190
Definition: Value.h:38
Value partialLocalView
Definition: Utils.h:192
SmallVector< loop::ForOp, 8 > loops
Definition: Utils.h:140
Definition: FoldUtils.h:50
Definition: LLVM.h:35
LinalgOp originalProducer
Definition: Utils.h:89
Value fullLocalView
Definition: Utils.h:191
LoopRangeBuilder(ValueHandle *iv, ValueHandle range)
Definition: Utils.cpp:35
SmallVector< Value, 4 > applyMapToValues(OpBuilder &b, Location loc, AffineMap map, ArrayRef< Value > values, OperationFolder *folder=nullptr)
Definition: Utils.cpp:142
Definition: Utils.h:138
void applyPermutationToVector(SmallVector< T, N > &inVec, ArrayRef< unsigned > permutation)
Definition: Utils.h:220
Definition: Utils.h:88
SmallVector< Value, 4 > getAssumedNonViewOperands(LinalgOp linalgOp)
Definition: Utils.cpp:163
mlir::edsc::intrinsics::ValueBuilder< RangeOp > range
Definition: Intrinsics.h:23
LinalgOp promoteSubViewOperands(OpBuilder &b, LinalgOp op, llvm::SetVector< Value > subViews, bool dynamicBuffers=false, OperationFolder *folder=nullptr)
SmallVector< PromotionInfo, 8 > promoteSubViews(OpBuilder &b, Location loc, ArrayRef< Value > subViews, bool dynamicBuffers=false, OperationFolder *folder=nullptr)
Definition: Promotion.cpp:108
Definition: LinalgTypes.h:20
Definition: Builders.h:158
SmallVector< Value, 8 > getViewSizes(ConcreteOp linalgOp)
Definition: Utils.h:120