My Project
Builders.h
Go to the documentation of this file.
1 //===- Builders.h - Helpers for constructing MLIR Classes -------*- 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_IR_BUILDERS_H
10 #define MLIR_IR_BUILDERS_H
11 
12 #include "mlir/IR/OpDefinition.h"
13 
14 namespace mlir {
15 
16 class AffineExpr;
17 class BlockAndValueMapping;
18 class ModuleOp;
19 class UnknownLoc;
20 class FileLineColLoc;
21 class Type;
22 class PrimitiveType;
23 class IntegerType;
24 class FunctionType;
25 class MemRefType;
26 class VectorType;
27 class RankedTensorType;
28 class UnrankedTensorType;
29 class TupleType;
30 class NoneType;
31 class BoolAttr;
32 class IntegerAttr;
33 class FloatAttr;
34 class StringAttr;
35 class TypeAttr;
36 class ArrayAttr;
37 class SymbolRefAttr;
38 class ElementsAttr;
39 class DenseElementsAttr;
40 class DenseIntElementsAttr;
41 class AffineMapAttr;
42 class AffineMap;
43 class UnitAttr;
44 
47 class Builder {
48 public:
49  explicit Builder(MLIRContext *context) : context(context) {}
50  explicit Builder(ModuleOp module);
51 
52  MLIRContext *getContext() const { return context; }
53 
54  Identifier getIdentifier(StringRef str);
55 
56  // Locations.
58  Location getFileLineColLoc(Identifier filename, unsigned line,
59  unsigned column);
61  Attribute metadata = Attribute());
62 
63  // Types.
68 
70 
72  IntegerType getIntegerType(unsigned width);
76 
78  template <typename Ty, typename... Args> Ty getType(Args... args) {
79  return Ty::get(context, args...);
80  }
81 
82  // Attributes.
83  NamedAttribute getNamedAttr(StringRef name, Attribute val);
84 
86  BoolAttr getBoolAttr(bool value);
88  IntegerAttr getIntegerAttr(Type type, int64_t value);
89  IntegerAttr getIntegerAttr(Type type, const APInt &value);
90  FloatAttr getFloatAttr(Type type, double value);
91  FloatAttr getFloatAttr(Type type, const APFloat &value);
92  StringAttr getStringAttr(StringRef bytes);
95  FlatSymbolRefAttr getSymbolRefAttr(StringRef value);
96  SymbolRefAttr getSymbolRefAttr(StringRef value,
97  ArrayRef<FlatSymbolRefAttr> nestedReferences);
98 
99  // Returns a 0-valued attribute of the given `type`. This function only
100  // supports boolean, integer, and 16-/32-/64-bit float types, and vector or
101  // ranked tensor of them. Returns null attribute otherwise.
102  Attribute getZeroAttr(Type type);
103 
104  // Convenience methods for fixed types.
105  FloatAttr getF16FloatAttr(float value);
106  FloatAttr getF32FloatAttr(float value);
107  FloatAttr getF64FloatAttr(double value);
108 
109  IntegerAttr getI8IntegerAttr(int8_t value);
110  IntegerAttr getI16IntegerAttr(int16_t value);
111  IntegerAttr getI32IntegerAttr(int32_t value);
112  IntegerAttr getI64IntegerAttr(int64_t value);
113 
115 
123 
124  // Affine expressions and affine maps.
125  AffineExpr getAffineDimExpr(unsigned position);
126  AffineExpr getAffineSymbolExpr(unsigned position);
128 
129  // Special cases of affine maps and integer sets
134  AffineMap getConstantAffineMap(int64_t val);
135  // One dimension id identity map: (i) -> (i).
137  // Multi-dimensional identity map: (d0, d1, d2) -> (d0, d1, d2).
138  AffineMap getMultiDimIdentityMap(unsigned rank);
139  // One symbol identity map: ()[s] -> (s).
141 
144  AffineMap getSingleDimShiftAffineMap(int64_t shift);
145 
150  AffineMap getShiftedAffineMap(AffineMap map, int64_t shift);
151 
152 protected:
154 };
155 
158 class OpBuilder : public Builder {
159 public:
161  explicit OpBuilder(MLIRContext *ctx) : Builder(ctx) {}
162 
164  explicit OpBuilder(Region *region) : Builder(region->getContext()) {
165  if (!region->empty())
166  setInsertionPoint(&region->front(), region->front().begin());
167  }
168  explicit OpBuilder(Region &region) : OpBuilder(&region) {}
169 
170  virtual ~OpBuilder();
171 
174  explicit OpBuilder(Operation *op) : Builder(op->getContext()) {
175  setInsertionPoint(op);
176  }
177 
178  explicit OpBuilder(Block *block) : OpBuilder(block, block->end()) {}
179 
180  OpBuilder(Block *block, Block::iterator insertPoint)
181  : OpBuilder(block->getParent()) {
182  setInsertionPoint(block, insertPoint);
183  }
184 
186  class InsertPoint {
187  public:
189  InsertPoint() = default;
190 
192  InsertPoint(Block *insertBlock, Block::iterator insertPt)
193  : block(insertBlock), point(insertPt) {}
194 
196  bool isSet() const { return (block != nullptr); }
197 
198  Block *getBlock() const { return block; }
199  Block::iterator getPoint() const { return point; }
200 
201  private:
202  Block *block = nullptr;
203  Block::iterator point;
204  };
205 
208  public:
210  : builder(builder), ip(builder.saveInsertionPoint()) {}
211  ~InsertionGuard() { builder.restoreInsertionPoint(ip); }
212 
213  private:
214  OpBuilder &builder;
216  };
217 
222  this->block = nullptr;
223  insertPoint = Block::iterator();
224  }
225 
228  return InsertPoint(getInsertionBlock(), getInsertionPoint());
229  }
230 
233  if (ip.isSet())
234  setInsertionPoint(ip.getBlock(), ip.getPoint());
235  else
236  clearInsertionPoint();
237  }
238 
240  void setInsertionPoint(Block *block, Block::iterator insertPoint) {
241  // TODO: check that insertPoint is in this rather than some other block.
242  this->block = block;
243  this->insertPoint = insertPoint;
244  }
245 
249  setInsertionPoint(op->getBlock(), Block::iterator(op));
250  }
251 
255  setInsertionPoint(op->getBlock(), ++Block::iterator(op));
256  }
257 
260  setInsertionPoint(block, block->begin());
261  }
262 
265  setInsertionPoint(block, block->end());
266  }
267 
270  Block *getInsertionBlock() const { return block; }
271 
273  Block::iterator getInsertionPoint() const { return insertPoint; }
274 
276  virtual Operation *insert(Operation *op);
277 
280  Block *createBlock(Region *parent, Region::iterator insertPt = {});
281 
284  Block *createBlock(Block *insertBefore);
285 
287  Block *getBlock() const { return block; }
288 
290  Operation *createOperation(const OperationState &state);
291 
293  template <typename OpTy, typename... Args>
294  OpTy create(Location location, Args &&... args) {
295  OperationState state(location, OpTy::getOperationName());
296  OpTy::build(this, state, std::forward<Args>(args)...);
297  auto *op = createOperation(state);
298  auto result = dyn_cast<OpTy>(op);
299  assert(result && "Builder didn't return the right type");
300  return result;
301  }
302 
306  template <typename OpTy, typename... Args>
308  Args &&... args) {
309  // Create the operation without using 'createOperation' as we don't want to
310  // insert it yet.
311  OperationState state(location, OpTy::getOperationName());
312  OpTy::build(this, state, std::forward<Args>(args)...);
313  Operation *op = Operation::create(state);
314 
315  // Fold the operation. If successful destroy it, otherwise insert it.
316  if (succeeded(tryFold(op, results)))
317  op->destroy();
318  else
319  insert(op);
320  }
321 
323  template <typename OpTy, typename... Args>
324  typename std::enable_if<OpTy::template hasTrait<OpTrait::OneResult>(),
325  Value>::type
326  createOrFold(Location location, Args &&... args) {
327  SmallVector<Value, 1> results;
328  createOrFold<OpTy>(results, location, std::forward<Args>(args)...);
329  return results.front();
330  }
331 
333  template <typename OpTy, typename... Args>
334  typename std::enable_if<OpTy::template hasTrait<OpTrait::ZeroResult>(),
335  OpTy>::type
336  createOrFold(Location location, Args &&... args) {
337  auto op = create<OpTy>(location, std::forward<Args>(args)...);
338  SmallVector<Value, 0> unused;
339  tryFold(op.getOperation(), unused);
340 
341  // Folding cannot remove a zero-result operation, so for convenience we
342  // continue to return it.
343  return op;
344  }
345 
349  LogicalResult tryFold(Operation *op, SmallVectorImpl<Value> &results);
350 
357  return insert(op.clone(mapper));
358  }
359  Operation *clone(Operation &op) { return insert(op.clone()); }
360 
365  return insert(op.cloneWithoutRegions(mapper));
366  }
368  return insert(op.cloneWithoutRegions());
369  }
370  template <typename OpT> OpT cloneWithoutRegions(OpT op) {
371  return cast<OpT>(cloneWithoutRegions(*op.getOperation()));
372  }
373 
374 private:
375  Block *block = nullptr;
376  Block::iterator insertPoint;
377 };
378 
379 } // namespace mlir
380 
381 #endif
Location getUnknownLoc()
Definition: Builders.cpp:31
Definition: Attributes.h:456
OpBuilder(Region &region)
Definition: Builders.h:168
Definition: InferTypeOpInterface.cpp:20
Operation * clone(Operation &op)
Definition: Builders.h:359
AffineMap getEmptyAffineMap()
Returns a zero result affine map with no dimensions or symbols: () -> ().
Definition: Builders.cpp:256
InsertionGuard(OpBuilder &builder)
Definition: Builders.h:209
Definition: Region.h:23
iterator begin()
Definition: Block.h:110
MLIRContext * getContext() const
Definition: Builders.h:52
AffineMap getMultiDimIdentityMap(unsigned rank)
Definition: Builders.cpp:268
Block * getInsertionBlock() const
Definition: Builders.h:270
Definition: Operation.h:27
Ty getType(Args... args)
Get or construct an instance of the type &#39;ty&#39; with provided arguments.
Definition: Builders.h:78
Integer types can have arbitrary bitwidth up to a large fixed limit.
Definition: StandardTypes.h:82
AffineMap getSingleDimShiftAffineMap(int64_t shift)
Definition: Builders.cpp:281
Block::iterator getPoint() const
Definition: Builders.h:199
Attribute getZeroAttr(Type type)
Definition: Builders.cpp:213
Definition: Attributes.h:139
Definition: Attributes.h:129
Block represents an ordered list of Operations.
Definition: Block.h:21
Block & front()
Definition: Region.h:54
OpBuilder(MLIRContext *ctx)
Create a builder with the given context.
Definition: Builders.h:161
Definition: Attributes.h:491
void setInsertionPoint(Block *block, Block::iterator insertPoint)
Set the insertion point to the specified location.
Definition: Builders.h:240
Operation * cloneWithoutRegions(Operation &op)
Definition: Builders.h:367
Location getFileLineColLoc(Identifier filename, unsigned line, unsigned column)
Definition: Builders.cpp:33
Operation * cloneWithoutRegions(Operation &op, BlockAndValueMapping &mapper)
Definition: Builders.h:364
AffineExpr getAffineSymbolExpr(unsigned position)
Definition: Builders.cpp:248
FloatType getF16Type()
Definition: Builders.cpp:48
void createOrFold(SmallVectorImpl< Value > &results, Location location, Args &&... args)
Definition: Builders.h:307
Function types map from a list of inputs to a list of results.
Definition: Types.h:190
BlockListType::iterator iterator
Definition: Region.h:41
Definition: Identifier.h:26
NoneType getNoneType()
Definition: Builders.cpp:71
FloatAttr getF64FloatAttr(double value)
Definition: Builders.cpp:125
Definition: Attributes.h:269
FlatSymbolRefAttr getSymbolRefAttr(Operation *value)
Definition: Builders.cpp:153
Definition: StandardTypes.h:113
FloatType getF32Type()
Definition: Builders.cpp:50
bool succeeded(LogicalResult result)
Definition: LogicalResult.h:39
Definition: Attributes.h:198
NamedAttribute getNamedAttr(StringRef name, Attribute val)
Definition: Builders.cpp:77
ArrayAttr getI64ArrayAttr(ArrayRef< int64_t > values)
Definition: Builders.cpp:174
Block * getBlock()
Returns the operation block that contains this operation.
Definition: Operation.h:97
Identifier getIdentifier(StringRef str)
Definition: Builders.cpp:23
void destroy()
Destroys this operation and its subclass data.
Definition: Operation.cpp:242
Definition: LLVM.h:34
TupleType getTupleType(ArrayRef< Type > elementTypes)
Definition: Builders.cpp:67
IntegerAttr getI16IntegerAttr(int16_t value)
Definition: Builders.cpp:107
Definition: Location.h:52
std::pair< Identifier, Attribute > NamedAttribute
Definition: Attributes.h:264
FloatAttr getF16FloatAttr(float value)
Definition: Builders.cpp:133
ArrayAttr getIndexArrayAttr(ArrayRef< int64_t > values)
Definition: Builders.cpp:180
Block * getBlock() const
Returns the current block of the builder.
Definition: Builders.h:287
void setInsertionPointAfter(Operation *op)
Definition: Builders.h:254
std::enable_if< OpTy::template hasTrait< OpTrait::OneResult >), Value >::type createOrFold(Location location, Args &&... args)
Overload to create or fold a single result operation.
Definition: Builders.h:326
ArrayAttr getAffineMapArrayAttr(ArrayRef< AffineMap > values)
Definition: Builders.cpp:207
FloatAttr getFloatAttr(Type type, double value)
Definition: Builders.cpp:137
IntegerAttr getI32IntegerAttr(int32_t value)
Definition: Builders.cpp:103
Definition: LogicalResult.h:18
Definition: LLVM.h:37
OpListType::iterator iterator
Definition: Block.h:107
OpTy create(Location location, Args &&... args)
Create an operation of specific op type at the current insertion point.
Definition: Builders.h:294
bool empty()
Definition: Region.h:49
InsertPoint(Block *insertBlock, Block::iterator insertPt)
Creates a new insertion point at the given location.
Definition: Builders.h:192
IntegerAttr getIntegerAttr(Type type, int64_t value)
Definition: Builders.cpp:115
IntegerAttr getI64IntegerAttr(int64_t value)
Definition: Builders.cpp:91
iterator end()
Definition: Block.h:111
UnitAttr getUnitAttr()
Definition: Builders.cpp:81
IntegerAttr getI8IntegerAttr(int8_t value)
Definition: Builders.cpp:111
Definition: Attributes.h:53
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: Attributes.h:243
DictionaryAttr getDictionaryAttr(ArrayRef< NamedAttribute > value)
Definition: Builders.cpp:87
OpT cloneWithoutRegions(OpT op)
Definition: Builders.h:370
IntegerType getIntegerType(unsigned width)
Definition: Builders.cpp:58
Definition: AffineExpr.h:66
Location getFusedLoc(ArrayRef< Location > locs, Attribute metadata=Attribute())
Definition: Builders.cpp:38
Definition: Attributes.h:343
ArrayAttr getI32ArrayAttr(ArrayRef< int32_t > values)
Definition: Builders.cpp:168
IntegerType getI1Type()
Definition: Builders.cpp:56
Definition: Attributes.h:428
Definition: StandardTypes.h:481
Definition: OperationSupport.h:261
Definition: Module.h:29
Definition: AffineMap.h:37
Block * getBlock() const
Definition: Builders.h:198
InsertPoint saveInsertionPoint() const
Return a saved insertion point.
Definition: Builders.h:227
FloatType getBF16Type()
Definition: Builders.cpp:46
ValueBuilder< mlir::LLVM::ConstantOp > constant
Definition: LinalgToLLVM.cpp:56
Builder(MLIRContext *context)
Definition: Builders.h:49
void setInsertionPoint(Operation *op)
Definition: Builders.h:248
AffineMap getSymbolIdentityMap()
Definition: Builders.cpp:276
Definition: Types.h:84
Definition: Value.h:38
Definition: BlockAndValueMapping.h:26
void clearInsertionPoint()
Definition: Builders.h:221
ArrayAttr getF32ArrayAttr(ArrayRef< float > values)
Definition: Builders.cpp:189
static Operation * create(Location location, OperationName name, ArrayRef< Type > resultTypes, ArrayRef< Value > operands, ArrayRef< NamedAttribute > attributes, ArrayRef< Block *> successors, unsigned numRegions, bool resizableOperandList)
Create a new Operation with the specific fields.
Definition: Operation.cpp:71
Definition: LLVM.h:35
Definition: Attributes.h:302
void setInsertionPointToStart(Block *block)
Sets the insertion point to the start of the specified block.
Definition: Builders.h:259
AffineExpr getAffineConstantExpr(int64_t constant)
Definition: Builders.cpp:252
RAII guard to reset the insertion point of the builder when destroyed.
Definition: Builders.h:207
AffineMap getShiftedAffineMap(AffineMap map, int64_t shift)
Definition: Builders.cpp:287
Definition: Builders.h:47
IndexType getIndexType()
Definition: Builders.cpp:54
AffineMap getDimIdentityMap()
Definition: Builders.cpp:263
This class represents a saved insertion point.
Definition: Builders.h:186
FloatType getF64Type()
Definition: Builders.cpp:52
BoolAttr getBoolAttr(bool value)
Definition: Builders.cpp:83
Operation * clone(Operation &op, BlockAndValueMapping &mapper)
Definition: Builders.h:356
Definition: MLIRContext.h:34
DenseIntElementsAttr getI32VectorAttr(ArrayRef< int32_t > values)
Definition: Builders.cpp:95
AffineExpr getAffineDimExpr(unsigned position)
Definition: Builders.cpp:244
Operation * clone(BlockAndValueMapping &mapper)
Definition: Operation.cpp:692
FunctionType getFunctionType(ArrayRef< Type > inputs, ArrayRef< Type > results)
Definition: Builders.cpp:62
void setInsertionPointToEnd(Block *block)
Sets the insertion point to the end of the specified block.
Definition: Builders.h:264
AffineMap getConstantAffineMap(int64_t val)
Definition: Builders.cpp:258
OpBuilder(Operation *op)
Definition: Builders.h:174
MLIRContext * context
Definition: Builders.h:153
OpBuilder(Block *block, Block::iterator insertPoint)
Definition: Builders.h:180
Definition: Attributes.h:539
OpBuilder(Region *region)
Create a builder and set the insertion point to the start of the region.
Definition: Builders.h:164
Block::iterator getInsertionPoint() const
Returns the current insertion point of the builder.
Definition: Builders.h:273
FloatAttr getF32FloatAttr(float value)
Definition: Builders.cpp:129
Definition: StandardTypes.h:70
OpBuilder(Block *block)
Definition: Builders.h:178
void restoreInsertionPoint(InsertPoint ip)
Restore the insert point to a previously saved point.
Definition: Builders.h:232
Definition: Builders.h:158
ArrayAttr getArrayAttr(ArrayRef< Attribute > value)
Definition: Builders.cpp:149
Operation * cloneWithoutRegions(BlockAndValueMapping &mapper)
Definition: Operation.cpp:636
std::enable_if< OpTy::template hasTrait< OpTrait::ZeroResult >), OpTy >::type createOrFold(Location location, Args &&... args)
Overload to create or fold a zero result operation.
Definition: Builders.h:336
~InsertionGuard()
Definition: Builders.h:211
Definition: StandardTypes.h:521
bool isSet() const
Returns true if this insert point is set.
Definition: Builders.h:196
Definition: Attributes.h:1012
StringAttr getStringAttr(StringRef bytes)
Definition: Builders.cpp:145
ArrayAttr getF64ArrayAttr(ArrayRef< double > values)
Definition: Builders.cpp:195
ArrayAttr getStrArrayAttr(ArrayRef< StringRef > values)
Definition: Builders.cpp:201