MLIR 22.0.0git
Builders.h
Go to the documentation of this file.
1//===- Builders.h - Helpers for constructing MLIR Classes -------*- 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_IR_BUILDERS_H
10#define MLIR_IR_BUILDERS_H
11
13#include "llvm/Support/Compiler.h"
14#include <optional>
15
16namespace mlir {
17
18class AffineExpr;
19class IRMapping;
20class UnknownLoc;
21class FileLineColLoc;
22class FileLineColRange;
23class Type;
24class IntegerType;
25class FloatType;
26class FunctionType;
27class GraphType;
28class IndexType;
29class MemRefType;
30class VectorType;
31class RankedTensorType;
32class UnrankedTensorType;
33class TupleType;
34class NoneType;
35class BoolAttr;
36class IntegerAttr;
37class FloatAttr;
38class StringAttr;
39class TypeAttr;
40class ArrayAttr;
41class SymbolRefAttr;
42class ElementsAttr;
45class AffineMapAttr;
46class AffineMap;
47class UnitAttr;
48
49/// This class is a general helper class for creating context-global objects
50/// like types, attributes, and affine expressions.
51class Builder {
52public:
54 explicit Builder(Operation *op) : Builder(op->getContext()) {}
55
56 MLIRContext *getContext() const { return context; }
57
58 // Locations.
61 Attribute metadata = Attribute());
62
63 // Types.
64 FloatType getF8E8M0Type();
65 FloatType getBF16Type();
66 FloatType getF16Type();
67 FloatType getTF32Type();
68 FloatType getF32Type();
69 FloatType getF64Type();
70 FloatType getF80Type();
71 FloatType getF128Type();
72
73 IndexType getIndexType();
74
75 IntegerType getI1Type();
76 IntegerType getI2Type();
77 IntegerType getI4Type();
78 IntegerType getI8Type();
79 IntegerType getI16Type();
80 IntegerType getI32Type();
81 IntegerType getI64Type();
82 IntegerType getIntegerType(unsigned width);
83 IntegerType getIntegerType(unsigned width, bool isSigned);
84 FunctionType getFunctionType(TypeRange inputs, TypeRange results);
85 GraphType getGraphType(TypeRange inputs, TypeRange results);
86 TupleType getTupleType(TypeRange elementTypes);
87 NoneType getNoneType();
88
89 /// Get or construct an instance of the type `Ty` with provided arguments.
90 template <typename Ty, typename... Args>
91 Ty getType(Args &&...args) {
92 return Ty::get(context, std::forward<Args>(args)...);
93 }
94
95 /// Get or construct an instance of the attribute `Attr` with provided
96 /// arguments.
97 template <typename Attr, typename... Args>
98 Attr getAttr(Args &&...args) {
99 return Attr::get(context, std::forward<Args>(args)...);
100 }
101
102 // Attributes.
103 NamedAttribute getNamedAttr(StringRef name, Attribute val);
104
105 UnitAttr getUnitAttr();
106 BoolAttr getBoolAttr(bool value);
107 DictionaryAttr getDictionaryAttr(ArrayRef<NamedAttribute> value);
108 IntegerAttr getIntegerAttr(Type type, int64_t value);
109 IntegerAttr getIntegerAttr(Type type, const APInt &value);
110 FloatAttr getFloatAttr(Type type, double value);
111 FloatAttr getFloatAttr(Type type, const APFloat &value);
112 StringAttr getStringAttr(const Twine &bytes);
114
115 // Returns a 0-valued attribute of the given `type`. This function only
116 // supports boolean, integer, and 16-/32-/64-bit float types, and vector or
117 // ranked tensor of them. Returns null attribute otherwise.
118 TypedAttr getZeroAttr(Type type);
119 // Returns a 1-valued attribute of the given `type`.
120 // Type constraints are the same as `getZeroAttr`.
121 TypedAttr getOneAttr(Type type);
122
123 // Convenience methods for fixed types.
124 FloatAttr getF16FloatAttr(float value);
125 FloatAttr getF32FloatAttr(float value);
126 FloatAttr getF64FloatAttr(double value);
127
128 IntegerAttr getI8IntegerAttr(int8_t value);
129 IntegerAttr getI16IntegerAttr(int16_t value);
130 IntegerAttr getI32IntegerAttr(int32_t value);
131 IntegerAttr getI64IntegerAttr(int64_t value);
132 IntegerAttr getIndexAttr(int64_t value);
133
134 /// Signed and unsigned integer attribute getters.
135 IntegerAttr getSI32IntegerAttr(int32_t value);
136 IntegerAttr getUI32IntegerAttr(uint32_t value);
137
138 /// Vector-typed DenseIntElementsAttr getters. `values` must not be empty.
143
146
147 /// Tensor-typed DenseIntElementsAttr getters. `values` can be empty.
148 /// These are generally preferable for representing general lists of integers
149 /// as attributes.
153
154 /// Tensor-typed DenseArrayAttr getters.
162
172
173 // Affine expressions and affine maps.
174 AffineExpr getAffineDimExpr(unsigned position);
175 AffineExpr getAffineSymbolExpr(unsigned position);
177
178 // Special cases of affine maps and integer sets
179 /// Returns a zero result affine map with no dimensions or symbols: () -> ().
181 /// Returns a single constant result affine map with 0 dimensions and 0
182 /// symbols. One constant result: () -> (val).
184 // One dimension id identity map: (i) -> (i).
186 // Multi-dimensional identity map: (d0, d1, d2) -> (d0, d1, d2).
187 AffineMap getMultiDimIdentityMap(unsigned rank);
188 // One symbol identity map: ()[s] -> (s).
190
191 /// Returns a map that shifts its (single) input dimension by 'shift'.
192 /// (d0) -> (d0 + shift)
194
195 /// Returns an affine map that is a translation (shift) of all result
196 /// expressions in 'map' by 'shift'.
197 /// Eg: input: (d0, d1)[s0] -> (d0, d1 + s0), shift = 2
198 /// returns: (d0, d1)[s0] -> (d0 + 2, d1 + s0 + 2)
200
201protected:
203};
204
205/// This class helps build Operations. Operations that are created are
206/// automatically inserted at an insertion point. The builder is copyable.
207class OpBuilder : public Builder {
208public:
209 class InsertPoint;
210 struct Listener;
211
212 /// Create a builder with the given context.
213 explicit OpBuilder(MLIRContext *ctx, Listener *listener = nullptr)
214 : Builder(ctx), listener(listener) {}
215
216 /// Create a builder and set the insertion point to the start of the region.
217 explicit OpBuilder(Region *region, Listener *listener = nullptr)
218 : OpBuilder(region->getContext(), listener) {
219 if (!region->empty())
221 }
222 explicit OpBuilder(Region &region, Listener *listener = nullptr)
223 : OpBuilder(&region, listener) {}
224
225 /// Create a builder and set insertion point to the given operation, which
226 /// will cause subsequent insertions to go right before it.
227 explicit OpBuilder(Operation *op, Listener *listener = nullptr)
228 : OpBuilder(op->getContext(), listener) {
230 }
231
232 OpBuilder(Block *block, Block::iterator insertPoint,
233 Listener *listener = nullptr)
234 : OpBuilder(block->getParent()->getContext(), listener) {
235 setInsertionPoint(block, insertPoint);
236 }
237
238 /// Create a builder and set the insertion point to before the first operation
239 /// in the block but still inside the block.
240 static OpBuilder atBlockBegin(Block *block, Listener *listener = nullptr) {
241 return OpBuilder(block, block->begin(), listener);
242 }
243
244 /// Create a builder and set the insertion point to after the last operation
245 /// in the block but still inside the block.
246 static OpBuilder atBlockEnd(Block *block, Listener *listener = nullptr) {
247 return OpBuilder(block, block->end(), listener);
248 }
249
250 /// Create a builder and set the insertion point to before the block
251 /// terminator.
253 Listener *listener = nullptr) {
254 auto *terminator = block->getTerminator();
255 assert(terminator != nullptr && "the block has no terminator");
256 return OpBuilder(block, Block::iterator(terminator), listener);
257 }
258
259 //===--------------------------------------------------------------------===//
260 // Listeners
261 //===--------------------------------------------------------------------===//
262
263 /// Base class for listeners.
265 /// The kind of listener.
266 enum class Kind {
267 /// OpBuilder::Listener or user-derived class.
269
270 /// RewriterBase::Listener or user-derived class.
272 };
273
274 Kind getKind() const { return kind; }
275
276 protected:
277 ListenerBase(Kind kind) : kind(kind) {}
278
279 private:
280 const Kind kind;
281 };
282
283 /// This class represents a listener that may be used to hook into various
284 /// actions within an OpBuilder.
285 struct Listener : public ListenerBase {
287
288 virtual ~Listener() = default;
289
290 /// Notify the listener that the specified operation was inserted.
291 ///
292 /// * If the operation was moved, then `previous` is the previous location
293 /// of the op.
294 /// * If the operation was unlinked before it was inserted, then `previous`
295 /// is empty.
296 ///
297 /// Note: Creating an (unlinked) op does not trigger this notification.
298 virtual void notifyOperationInserted(Operation *op, InsertPoint previous) {}
299
300 /// Notify the listener that the specified block was inserted.
301 ///
302 /// * If the block was moved, then `previous` and `previousIt` are the
303 /// previous location of the block.
304 /// * If the block was unlinked before it was inserted, then `previous`
305 /// is "nullptr".
306 ///
307 /// Note: Creating an (unlinked) block does not trigger this notification.
308 virtual void notifyBlockInserted(Block *block, Region *previous,
309 Region::iterator previousIt) {}
310
311 protected:
312 Listener(Kind kind) : ListenerBase(kind) {}
313 };
314
315 /// Sets the listener of this builder to the one provided.
316 void setListener(Listener *newListener) { listener = newListener; }
317
318 /// Returns the current listener of this builder, or nullptr if this builder
319 /// doesn't have a listener.
320 Listener *getListener() const { return listener; }
321
322 //===--------------------------------------------------------------------===//
323 // Insertion Point Management
324 //===--------------------------------------------------------------------===//
325
326 /// This class represents a saved insertion point.
328 public:
329 /// Creates a new insertion point which doesn't point to anything.
330 InsertPoint() = default;
331
332 /// Creates a new insertion point at the given location.
333 InsertPoint(Block *insertBlock, Block::iterator insertPt)
334 : block(insertBlock), point(insertPt) {}
335
336 /// Returns true if this insert point is set.
337 bool isSet() const { return (block != nullptr); }
338
339 Block *getBlock() const { return block; }
340 Block::iterator getPoint() const { return point; }
341
342 private:
343 Block *block = nullptr;
344 Block::iterator point;
345 };
346
347 /// RAII guard to reset the insertion point of the builder when destroyed.
349 public:
351 : builder(&builder), ip(builder.saveInsertionPoint()) {}
352
354 if (builder)
355 builder->restoreInsertionPoint(ip);
356 }
357
360
361 /// Implement the move constructor to clear the builder field of `other`.
362 /// That way it does not restore the insertion point upon destruction as
363 /// that should be done exclusively by the just constructed InsertionGuard.
365 : builder(other.builder), ip(other.ip) {
366 other.builder = nullptr;
367 }
368
370
371 private:
372 OpBuilder *builder;
374 };
375
376 /// Reset the insertion point to no location. Creating an operation without a
377 /// set insertion point is an error, but this can still be useful when the
378 /// current insertion point a builder refers to is being removed.
380 this->block = nullptr;
381 insertPoint = Block::iterator();
382 }
383
384 /// Return a saved insertion point.
388
389 /// Restore the insert point to a previously saved point.
391 if (ip.isSet())
393 else
395 }
396
397 /// Set the insertion point to the specified location.
398 void setInsertionPoint(Block *block, Block::iterator insertPoint) {
399 // TODO: check that insertPoint is in this rather than some other block.
400 this->block = block;
401 this->insertPoint = insertPoint;
402 }
403
404 /// Sets the insertion point to the specified operation, which will cause
405 /// subsequent insertions to go right before it.
409
410 /// Sets the insertion point to the node after the specified operation, which
411 /// will cause subsequent insertions to go right after it.
415
416 /// Sets the insertion point to the node after the specified value. If value
417 /// has a defining operation, sets the insertion point to the node after such
418 /// defining operation. This will cause subsequent insertions to go right
419 /// after it. Otherwise, value is a BlockArgument. Sets the insertion point to
420 /// the start of its block.
422 if (Operation *op = val.getDefiningOp()) {
424 } else {
425 auto blockArg = llvm::cast<BlockArgument>(val);
426 setInsertionPointToStart(blockArg.getOwner());
427 }
428 }
429
430 /// Sets the insertion point to the start of the specified block.
432 setInsertionPoint(block, block->begin());
433 }
434
435 /// Sets the insertion point to the end of the specified block.
437 setInsertionPoint(block, block->end());
438 }
439
440 /// Return the block the current insertion point belongs to. Note that the
441 /// insertion point is not necessarily the end of the block.
442 Block *getInsertionBlock() const { return block; }
443
444 /// Returns the current insertion point of the builder.
445 Block::iterator getInsertionPoint() const { return insertPoint; }
446
447 /// Returns the current block of the builder.
448 Block *getBlock() const { return block; }
449
450 //===--------------------------------------------------------------------===//
451 // Block Creation
452 //===--------------------------------------------------------------------===//
453
454 /// Add new block with 'argTypes' arguments and set the insertion point to the
455 /// end of it. The block is inserted at the provided insertion point of
456 /// 'parent'. `locs` contains the locations of the inserted arguments, and
457 /// should match the size of `argTypes`.
458 Block *createBlock(Region *parent, Region::iterator insertPt = {},
459 TypeRange argTypes = {}, ArrayRef<Location> locs = {});
460
461 /// Add new block with 'argTypes' arguments and set the insertion point to the
462 /// end of it. The block is placed before 'insertBefore'. `locs` contains the
463 /// locations of the inserted arguments, and should match the size of
464 /// `argTypes`.
465 Block *createBlock(Block *insertBefore, TypeRange argTypes = {},
466 ArrayRef<Location> locs = {});
467
468 //===--------------------------------------------------------------------===//
469 // Operation Creation
470 //===--------------------------------------------------------------------===//
471
472 /// Insert the given operation at the current insertion point and return it.
473 Operation *insert(Operation *op);
474
475 /// Creates an operation given the fields represented as an OperationState.
476 Operation *create(const OperationState &state);
477
478 /// Creates an operation with the given fields.
479 Operation *create(Location loc, StringAttr opName, ValueRange operands,
480 TypeRange types = {},
481 ArrayRef<NamedAttribute> attributes = {},
482 BlockRange successors = {},
483 MutableArrayRef<std::unique_ptr<Region>> regions = {});
484
485private:
486 /// Helper for sanity checking preconditions for create* methods below.
487 template <typename OpT>
488 RegisteredOperationName getCheckRegisteredInfo(MLIRContext *ctx) {
489 std::optional<RegisteredOperationName> opName =
491 if (LLVM_UNLIKELY(!opName)) {
492 llvm::report_fatal_error(
493 "Building op `" + OpT::getOperationName() +
494 "` but it isn't known in this MLIRContext: the dialect may not "
495 "be loaded or this operation hasn't been added by the dialect. See "
496 "also https://mlir.llvm.org/getting_started/Faq/"
497 "#registered-loaded-dependent-whats-up-with-dialects-management");
498 }
499 return *opName;
500 }
501
502public:
503 /// Create an operation of specific op type at the current insertion point.
504 template <typename OpTy, typename... Args>
505 [[deprecated("Use OpTy::create instead")]]
506 OpTy create(Location location, Args &&...args) {
507 OperationState state(location,
508 getCheckRegisteredInfo<OpTy>(location.getContext()));
509 OpTy::build(*this, state, std::forward<Args>(args)...);
510 auto *op = create(state);
511 auto result = dyn_cast<OpTy>(op);
512 assert(result && "builder didn't return the right type");
513 return result;
514 }
515
516 /// Create an operation of specific op type at the current insertion point,
517 /// and immediately try to fold it. This functions populates 'results' with
518 /// the results of the operation.
519 ///
520 /// Note: This performs opportunistic eager folding during IR construction.
521 /// The folders are designed to operate efficiently on canonical IR, which
522 /// this API does not enforce. Complete folding isn't only expected in the
523 /// context of canonicalization which intertwine folders with pattern
524 /// rewrites until fixed-point.
525 template <typename OpTy, typename... Args>
527 Args &&...args) {
528 // Create the operation without using 'create' as we want to control when
529 // the listener is notified.
530 OperationState state(location,
531 getCheckRegisteredInfo<OpTy>(location.getContext()));
532 OpTy::build(*this, state, std::forward<Args>(args)...);
533 Operation *op = Operation::create(state);
534 if (block)
535 block->getOperations().insert(insertPoint, op);
536
537 // Attempt to fold the operation.
538 if (succeeded(tryFold(op, results)) && !results.empty()) {
539 // Erase the operation, if the fold removed the need for this operation.
540 // Note: The fold already populated the results in this case.
541 op->erase();
542 return;
543 }
544
545 ResultRange opResults = op->getResults();
546 results.assign(opResults.begin(), opResults.end());
547 if (block && listener)
548 listener->notifyOperationInserted(op, /*previous=*/{});
549 }
550
551 /// Overload to create or fold a single result operation.
552 template <typename OpTy, typename... Args>
553 std::enable_if_t<OpTy::template hasTrait<OpTrait::OneResult>(), Value>
554 createOrFold(Location location, Args &&...args) {
555 SmallVector<Value, 1> results;
556 createOrFold<OpTy>(results, location, std::forward<Args>(args)...);
557 return results.front();
558 }
559
560 /// Overload to create or fold a zero result operation.
561 template <typename OpTy, typename... Args>
562 std::enable_if_t<OpTy::template hasTrait<OpTrait::ZeroResults>(), OpTy>
563 createOrFold(Location location, Args &&...args) {
564 auto op = OpTy::create(*this, location, std::forward<Args>(args)...);
566 (void)tryFold(op.getOperation(), unused);
567
568 // Folding cannot remove a zero-result operation, so for convenience we
569 // continue to return it.
570 return op;
571 }
572
573 /// Attempts to fold the given operation and places new results within
574 /// `results`. Returns success if the operation was folded, failure otherwise.
575 /// If the fold was in-place, `results` will not be filled. Optionally, newly
576 /// materialized constant operations can be returned to the caller.
577 ///
578 /// Note: This function does not erase the operation on a successful fold.
579 LogicalResult
581 SmallVectorImpl<Operation *> *materializedConstants = nullptr);
582
583 /// Creates a deep copy of the specified operation, remapping any operands
584 /// that use values outside of the operation using the map that is provided
585 /// ( leaving them alone if no entry is present). Replaces references to
586 /// cloned sub-operations to the corresponding operation that is copied,
587 /// and adds those mappings to the map.
588 Operation *clone(Operation &op, IRMapping &mapper);
590
591 /// Creates a deep copy of this operation but keep the operation regions
592 /// empty. Operands are remapped using `mapper` (if present), and `mapper` is
593 /// updated to contain the results.
595 return insert(op.cloneWithoutRegions(mapper));
596 }
600 template <typename OpT>
602 return cast<OpT>(cloneWithoutRegions(*op.getOperation()));
603 }
604
605 /// Clone the blocks that belong to "region" before the given position in
606 /// another region "parent". The two regions must be different. The caller is
607 /// responsible for creating or updating the operation transferring flow of
608 /// control to the region and passing it the correct block arguments.
609 void cloneRegionBefore(Region &region, Region &parent,
610 Region::iterator before, IRMapping &mapping);
611 void cloneRegionBefore(Region &region, Region &parent,
612 Region::iterator before);
613 void cloneRegionBefore(Region &region, Block *before);
614
615protected:
616 /// The optional listener for events of this builder.
618
619private:
620 /// The current block this builder is inserting into.
621 Block *block = nullptr;
622 /// The insertion point within the block that this builder is inserting
623 /// before.
624 Block::iterator insertPoint;
625};
626
627/// ImplicitLocOpBuilder maintains a 'current location', allowing use of the
628/// create<> method without specifying the location. It is otherwise the same
629/// as OpBuilder.
631public:
632 /// OpBuilder has a bunch of convenience constructors - we support them all
633 /// with the additional Location.
634 template <typename... T>
635 ImplicitLocOpBuilder(Location loc, T &&...operands)
636 : OpBuilder(std::forward<T>(operands)...), curLoc(loc) {}
637
638 /// Create a builder and set the insertion point to before the first operation
639 /// in the block but still inside the block.
641 Listener *listener = nullptr) {
642 return ImplicitLocOpBuilder(loc, block, block->begin(), listener);
643 }
644
645 /// Create a builder and set the insertion point to after the last operation
646 /// in the block but still inside the block.
648 Listener *listener = nullptr) {
649 return ImplicitLocOpBuilder(loc, block, block->end(), listener);
650 }
651
652 /// Create a builder and set the insertion point to before the block
653 /// terminator.
655 Listener *listener = nullptr) {
656 auto *terminator = block->getTerminator();
657 assert(terminator != nullptr && "the block has no terminator");
658 return ImplicitLocOpBuilder(loc, block, Block::iterator(terminator),
659 listener);
660 }
661
662 /// Accessors for the implied location.
663 Location getLoc() const { return curLoc; }
664 void setLoc(Location loc) { curLoc = loc; }
665
666 // We allow clients to use the explicit-loc version of create as well.
667 using OpBuilder::create;
669
670 /// Create an operation of specific op type at the current insertion point and
671 /// location.
672 template <typename OpTy, typename... Args>
673 OpTy create(Args &&...args) {
674 return OpTy::create(*this, curLoc, std::forward<Args>(args)...);
675 }
676
677 /// Create an operation of specific op type at the current insertion point,
678 /// and immediately try to fold it. This functions populates 'results' with
679 /// the results after folding the operation.
680 template <typename OpTy, typename... Args>
681 void createOrFold(llvm::SmallVectorImpl<Value> &results, Args &&...args) {
682 OpBuilder::createOrFold<OpTy>(results, curLoc, std::forward<Args>(args)...);
683 }
684
685 /// Overload to create or fold a single result operation.
686 template <typename OpTy, typename... Args>
687 std::enable_if_t<OpTy::template hasTrait<mlir::OpTrait::OneResult>(), Value>
688 createOrFold(Args &&...args) {
689 return OpBuilder::createOrFold<OpTy>(curLoc, std::forward<Args>(args)...);
690 }
691
692 /// Overload to create or fold a zero result operation.
693 template <typename OpTy, typename... Args>
694 std::enable_if_t<OpTy::template hasTrait<mlir::OpTrait::ZeroResults>(), OpTy>
695 createOrFold(Args &&...args) {
696 return OpBuilder::createOrFold<OpTy>(curLoc, std::forward<Args>(args)...);
697 }
698
699 /// This builder can also be used to emit diagnostics to the current location.
701 emitError(const llvm::Twine &message = llvm::Twine()) {
702 return mlir::emitError(curLoc, message);
703 }
705 emitWarning(const llvm::Twine &message = llvm::Twine()) {
706 return mlir::emitWarning(curLoc, message);
707 }
709 emitRemark(const llvm::Twine &message = llvm::Twine()) {
710 return mlir::emitRemark(curLoc, message);
711 }
712
713private:
714 Location curLoc;
715};
716
717} // namespace mlir
718
719#endif
ArrayAttr()
Base type for affine expression.
Definition AffineExpr.h:68
A multi-dimensional affine map Affine map's are immutable like Type's, and they are uniqued.
Definition AffineMap.h:46
Attributes are known-constant values of operations.
Definition Attributes.h:25
Block represents an ordered list of Operations.
Definition Block.h:33
OpListType::iterator iterator
Definition Block.h:140
Special case of IntegerAttr to represent boolean integers, i.e., signless i1 integers.
IntegerAttr getIndexAttr(int64_t value)
Definition Builders.cpp:108
AffineMap getSingleDimShiftAffineMap(int64_t shift)
Returns a map that shifts its (single) input dimension by 'shift'.
Definition Builders.cpp:401
IntegerType getI16Type()
Definition Builders.cpp:61
UnitAttr getUnitAttr()
Definition Builders.cpp:98
ArrayAttr getIndexArrayAttr(ArrayRef< int64_t > values)
Definition Builders.cpp:287
DenseF64ArrayAttr getDenseF64ArrayAttr(ArrayRef< double > values)
Definition Builders.cpp:175
IntegerType getI2Type()
Definition Builders.cpp:55
FloatType getF80Type()
Definition Builders.cpp:47
FloatType getF128Type()
Definition Builders.cpp:49
DenseI8ArrayAttr getDenseI8ArrayAttr(ArrayRef< int8_t > values)
Definition Builders.cpp:155
IntegerAttr getI32IntegerAttr(int32_t value)
Definition Builders.cpp:200
DenseI32ArrayAttr getDenseI32ArrayAttr(ArrayRef< int32_t > values)
Definition Builders.cpp:163
DenseIntElementsAttr getBoolVectorAttr(ArrayRef< bool > values)
Vector-typed DenseIntElementsAttr getters. values must not be empty.
Definition Builders.cpp:116
FloatType getF32Type()
Definition Builders.cpp:43
FloatType getTF32Type()
Definition Builders.cpp:41
TupleType getTupleType(TypeRange elementTypes)
Definition Builders.cpp:84
IntegerAttr getIntegerAttr(Type type, int64_t value)
Definition Builders.cpp:228
FloatAttr getF64FloatAttr(double value)
Definition Builders.cpp:242
AffineMap getShiftedAffineMap(AffineMap map, int64_t shift)
Returns an affine map that is a translation (shift) of all result expressions in 'map' by 'shift'.
Definition Builders.cpp:407
ArrayAttr getI32ArrayAttr(ArrayRef< int32_t > values)
Definition Builders.cpp:276
DenseI64ArrayAttr getDenseI64ArrayAttr(ArrayRef< int64_t > values)
Definition Builders.cpp:167
FloatAttr getF16FloatAttr(float value)
Definition Builders.cpp:250
AffineMap getDimIdentityMap()
Definition Builders.cpp:383
AffineMap getMultiDimIdentityMap(unsigned rank)
Definition Builders.cpp:387
IntegerAttr getI16IntegerAttr(int16_t value)
Definition Builders.cpp:217
DenseI16ArrayAttr getDenseI16ArrayAttr(ArrayRef< int16_t > values)
Definition Builders.cpp:159
AffineExpr getAffineSymbolExpr(unsigned position)
Definition Builders.cpp:368
DenseFPElementsAttr getF32VectorAttr(ArrayRef< float > values)
Definition Builders.cpp:140
FloatAttr getFloatAttr(Type type, double value)
Definition Builders.cpp:254
AffineExpr getAffineConstantExpr(int64_t constant)
Definition Builders.cpp:372
DenseIntElementsAttr getI32TensorAttr(ArrayRef< int32_t > values)
Tensor-typed DenseIntElementsAttr getters.
Definition Builders.cpp:179
FunctionType getFunctionType(TypeRange inputs, TypeRange results)
Definition Builders.cpp:76
IntegerType getI64Type()
Definition Builders.cpp:65
IntegerType getI32Type()
Definition Builders.cpp:63
IntegerAttr getI64IntegerAttr(int64_t value)
Definition Builders.cpp:112
IntegerType getIntegerType(unsigned width)
Definition Builders.cpp:67
NoneType getNoneType()
Definition Builders.cpp:88
DenseIntElementsAttr getI64TensorAttr(ArrayRef< int64_t > values)
Definition Builders.cpp:186
Ty getType(Args &&...args)
Get or construct an instance of the type Ty with provided arguments.
Definition Builders.h:91
BoolAttr getBoolAttr(bool value)
Definition Builders.cpp:100
IntegerType getI4Type()
Definition Builders.cpp:57
StringAttr getStringAttr(const Twine &bytes)
Definition Builders.cpp:262
MLIRContext * context
Definition Builders.h:202
Builder(MLIRContext *context)
Definition Builders.h:53
AffineMap getEmptyAffineMap()
Returns a zero result affine map with no dimensions or symbols: () -> ().
Definition Builders.cpp:376
Builder(Operation *op)
Definition Builders.h:54
IntegerAttr getSI32IntegerAttr(int32_t value)
Signed and unsigned integer attribute getters.
Definition Builders.cpp:207
GraphType getGraphType(TypeRange inputs, TypeRange results)
Definition Builders.cpp:80
TypedAttr getZeroAttr(Type type)
Definition Builders.cpp:324
FloatType getF16Type()
Definition Builders.cpp:39
Location getFusedLoc(ArrayRef< Location > locs, Attribute metadata=Attribute())
Definition Builders.cpp:27
FloatType getBF16Type()
Definition Builders.cpp:37
AffineExpr getAffineDimExpr(unsigned position)
Definition Builders.cpp:364
DenseIntElementsAttr getIndexTensorAttr(ArrayRef< int64_t > values)
Definition Builders.cpp:193
AffineMap getConstantAffineMap(int64_t val)
Returns a single constant result affine map with 0 dimensions and 0 symbols.
Definition Builders.cpp:378
ArrayAttr getTypeArrayAttr(TypeRange values)
Definition Builders.cpp:312
FloatType getF8E8M0Type()
Definition Builders.cpp:35
DenseIntElementsAttr getI32VectorAttr(ArrayRef< int32_t > values)
Definition Builders.cpp:122
DenseF32ArrayAttr getDenseF32ArrayAttr(ArrayRef< float > values)
Definition Builders.cpp:171
DenseIntElementsAttr getI64VectorAttr(ArrayRef< int64_t > values)
Definition Builders.cpp:128
AffineMap getSymbolIdentityMap()
Definition Builders.cpp:396
ArrayAttr getF64ArrayAttr(ArrayRef< double > values)
Definition Builders.cpp:300
IntegerType getI1Type()
Definition Builders.cpp:53
DenseFPElementsAttr getF64VectorAttr(ArrayRef< double > values)
Definition Builders.cpp:145
Location getUnknownLoc()
Definition Builders.cpp:25
ArrayAttr getArrayAttr(ArrayRef< Attribute > value)
Definition Builders.cpp:266
MLIRContext * getContext() const
Definition Builders.h:56
DenseBoolArrayAttr getDenseBoolArrayAttr(ArrayRef< bool > values)
Tensor-typed DenseArrayAttr getters.
Definition Builders.cpp:151
ArrayAttr getI64ArrayAttr(ArrayRef< int64_t > values)
Definition Builders.cpp:281
IndexType getIndexType()
Definition Builders.cpp:51
IntegerType getI8Type()
Definition Builders.cpp:59
FloatAttr getF32FloatAttr(float value)
Definition Builders.cpp:246
DictionaryAttr getDictionaryAttr(ArrayRef< NamedAttribute > value)
Definition Builders.cpp:104
NamedAttribute getNamedAttr(StringRef name, Attribute val)
Definition Builders.cpp:94
IntegerAttr getUI32IntegerAttr(uint32_t value)
Definition Builders.cpp:212
IntegerAttr getI8IntegerAttr(int8_t value)
Definition Builders.cpp:221
ArrayAttr getF32ArrayAttr(ArrayRef< float > values)
Definition Builders.cpp:294
FloatType getF64Type()
Definition Builders.cpp:45
ArrayAttr getBoolArrayAttr(ArrayRef< bool > values)
Definition Builders.cpp:270
ArrayAttr getStrArrayAttr(ArrayRef< StringRef > values)
Definition Builders.cpp:306
DenseIntElementsAttr getIndexVectorAttr(ArrayRef< int64_t > values)
Definition Builders.cpp:134
ArrayAttr getAffineMapArrayAttr(ArrayRef< AffineMap > values)
Definition Builders.cpp:318
Attr getAttr(Args &&...args)
Get or construct an instance of the attribute Attr with provided arguments.
Definition Builders.h:98
TypedAttr getOneAttr(Type type)
Definition Builders.cpp:342
An attribute that represents a reference to a dense vector or tensor object.
An attribute that represents a reference to a dense float vector or tensor object.
An attribute that represents a reference to a dense integer vector or tensor object.
An instance of this location represents a tuple of file, line number, and column number.
Definition Location.h:174
This is a utility class for mapping one set of IR entities to another.
Definition IRMapping.h:26
std::enable_if_t< OpTy::template hasTrait< mlir::OpTrait::OneResult >(), Value > createOrFold(Args &&...args)
Overload to create or fold a single result operation.
Definition Builders.h:688
void setLoc(Location loc)
Definition Builders.h:664
Location getLoc() const
Accessors for the implied location.
Definition Builders.h:663
mlir::InFlightDiagnostic emitWarning(const llvm::Twine &message=llvm::Twine())
Definition Builders.h:705
static ImplicitLocOpBuilder atBlockTerminator(Location loc, Block *block, Listener *listener=nullptr)
Create a builder and set the insertion point to before the block terminator.
Definition Builders.h:654
ImplicitLocOpBuilder(Location loc, T &&...operands)
OpBuilder has a bunch of convenience constructors - we support them all with the additional Location.
Definition Builders.h:635
static ImplicitLocOpBuilder atBlockBegin(Location loc, Block *block, Listener *listener=nullptr)
Create a builder and set the insertion point to before the first operation in the block but still ins...
Definition Builders.h:640
std::enable_if_t< OpTy::template hasTrait< mlir::OpTrait::ZeroResults >(), OpTy > createOrFold(Args &&...args)
Overload to create or fold a zero result operation.
Definition Builders.h:695
mlir::InFlightDiagnostic emitError(const llvm::Twine &message=llvm::Twine())
This builder can also be used to emit diagnostics to the current location.
Definition Builders.h:701
mlir::InFlightDiagnostic emitRemark(const llvm::Twine &message=llvm::Twine())
Definition Builders.h:709
OpTy create(Args &&...args)
Create an operation of specific op type at the current insertion point and location.
Definition Builders.h:673
void createOrFold(llvm::SmallVectorImpl< Value > &results, Args &&...args)
Create an operation of specific op type at the current insertion point, and immediately try to fold i...
Definition Builders.h:681
static ImplicitLocOpBuilder atBlockEnd(Location loc, Block *block, Listener *listener=nullptr)
Create a builder and set the insertion point to after the last operation in the block but still insid...
Definition Builders.h:647
This class represents a diagnostic that is inflight and set to be reported.
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
Definition Location.h:76
MLIRContext * getContext() const
Return the context this location is uniqued in.
Definition Location.h:86
MLIRContext is the top-level object for a collection of MLIR operations.
Definition MLIRContext.h:63
NamedAttribute represents a combination of a name and an Attribute value.
Definition Attributes.h:164
This class represents a saved insertion point.
Definition Builders.h:327
InsertPoint()=default
Creates a new insertion point which doesn't point to anything.
Block::iterator getPoint() const
Definition Builders.h:340
bool isSet() const
Returns true if this insert point is set.
Definition Builders.h:337
InsertPoint(Block *insertBlock, Block::iterator insertPt)
Creates a new insertion point at the given location.
Definition Builders.h:333
Block * getBlock() const
Definition Builders.h:339
InsertionGuard & operator=(const InsertionGuard &)=delete
InsertionGuard(OpBuilder &builder)
Definition Builders.h:350
InsertionGuard(InsertionGuard &&other) noexcept
Implement the move constructor to clear the builder field of other.
Definition Builders.h:364
InsertionGuard(const InsertionGuard &)=delete
InsertionGuard & operator=(InsertionGuard &&other)=delete
This class helps build Operations.
Definition Builders.h:207
InsertPoint saveInsertionPoint() const
Return a saved insertion point.
Definition Builders.h:385
static OpBuilder atBlockBegin(Block *block, Listener *listener=nullptr)
Create a builder and set the insertion point to before the first operation in the block but still ins...
Definition Builders.h:240
OpBuilder(Region *region, Listener *listener=nullptr)
Create a builder and set the insertion point to the start of the region.
Definition Builders.h:217
Block::iterator getInsertionPoint() const
Returns the current insertion point of the builder.
Definition Builders.h:445
std::enable_if_t< OpTy::template hasTrait< OpTrait::ZeroResults >(), OpTy > createOrFold(Location location, Args &&...args)
Overload to create or fold a zero result operation.
Definition Builders.h:563
Block * createBlock(Region *parent, Region::iterator insertPt={}, TypeRange argTypes={}, ArrayRef< Location > locs={})
Add new block with 'argTypes' arguments and set the insertion point to the end of it.
Definition Builders.cpp:430
Operation * cloneWithoutRegions(Operation &op)
Definition Builders.h:597
OpT cloneWithoutRegions(OpT op)
Definition Builders.h:601
OpBuilder(MLIRContext *ctx, Listener *listener=nullptr)
Create a builder with the given context.
Definition Builders.h:213
void clearInsertionPoint()
Reset the insertion point to no location.
Definition Builders.h:379
static OpBuilder atBlockEnd(Block *block, Listener *listener=nullptr)
Create a builder and set the insertion point to after the last operation in the block but still insid...
Definition Builders.h:246
Block * getBlock() const
Returns the current block of the builder.
Definition Builders.h:448
Operation * clone(Operation &op, IRMapping &mapper)
Creates a deep copy of the specified operation, remapping any operands that use values outside of the...
Definition Builders.cpp:562
void setListener(Listener *newListener)
Sets the listener of this builder to the one provided.
Definition Builders.h:316
void setInsertionPointToStart(Block *block)
Sets the insertion point to the start of the specified block.
Definition Builders.h:431
void setInsertionPoint(Block *block, Block::iterator insertPoint)
Set the insertion point to the specified location.
Definition Builders.h:398
void setInsertionPoint(Operation *op)
Sets the insertion point to the specified operation, which will cause subsequent insertions to go rig...
Definition Builders.h:406
Listener * getListener() const
Returns the current listener of this builder, or nullptr if this builder doesn't have a listener.
Definition Builders.h:320
static OpBuilder atBlockTerminator(Block *block, Listener *listener=nullptr)
Create a builder and set the insertion point to before the block terminator.
Definition Builders.h:252
void setInsertionPointToEnd(Block *block)
Sets the insertion point to the end of the specified block.
Definition Builders.h:436
void restoreInsertionPoint(InsertPoint ip)
Restore the insert point to a previously saved point.
Definition Builders.h:390
OpBuilder(Region &region, Listener *listener=nullptr)
Definition Builders.h:222
void cloneRegionBefore(Region &region, Region &parent, Region::iterator before, IRMapping &mapping)
Clone the blocks that belong to "region" before the given position in another region "parent".
Definition Builders.cpp:589
OpBuilder(Block *block, Block::iterator insertPoint, Listener *listener=nullptr)
Definition Builders.h:232
OpTy create(Location location, Args &&...args)
Create an operation of specific op type at the current insertion point.
Definition Builders.h:506
OpBuilder(Operation *op, Listener *listener=nullptr)
Create a builder and set insertion point to the given operation, which will cause subsequent insertio...
Definition Builders.h:227
Block * getInsertionBlock() const
Return the block the current insertion point belongs to.
Definition Builders.h:442
LogicalResult tryFold(Operation *op, SmallVectorImpl< Value > &results, SmallVectorImpl< Operation * > *materializedConstants=nullptr)
Attempts to fold the given operation and places new results within results.
Definition Builders.cpp:473
Listener * listener
The optional listener for events of this builder.
Definition Builders.h:617
std::enable_if_t< OpTy::template hasTrait< OpTrait::OneResult >(), Value > createOrFold(Location location, Args &&...args)
Overload to create or fold a single result operation.
Definition Builders.h:554
void createOrFold(SmallVectorImpl< Value > &results, Location location, Args &&...args)
Create an operation of specific op type at the current insertion point, and immediately try to fold i...
Definition Builders.h:526
void setInsertionPointAfterValue(Value val)
Sets the insertion point to the node after the specified value.
Definition Builders.h:421
Operation * create(const OperationState &state)
Creates an operation given the fields represented as an OperationState.
Definition Builders.cpp:457
void setInsertionPointAfter(Operation *op)
Sets the insertion point to the node after the specified operation, which will cause subsequent inser...
Definition Builders.h:412
Operation * cloneWithoutRegions(Operation &op, IRMapping &mapper)
Creates a deep copy of this operation but keep the operation regions empty.
Definition Builders.h:594
Operation * insert(Operation *op)
Insert the given operation at the current insertion point and return it.
Definition Builders.cpp:421
Operation is the basic unit of execution within MLIR.
Definition Operation.h:88
Block * getBlock()
Returns the operation block that contains this operation.
Definition Operation.h:213
static Operation * create(Location location, OperationName name, TypeRange resultTypes, ValueRange operands, NamedAttrList &&attributes, OpaqueProperties properties, BlockRange successors, unsigned numRegions)
Create a new Operation with the specific fields.
Definition Operation.cpp:67
Operation * cloneWithoutRegions(IRMapping &mapper)
Create a partial copy of this operation without traversing into attached regions.
result_range getResults()
Definition Operation.h:415
void erase()
Remove this operation from its parent block and delete it.
This class contains a list of basic blocks and a link to the parent operation it is attached to.
Definition Region.h:26
Block & front()
Definition Region.h:65
bool empty()
Definition Region.h:60
BlockListType::iterator iterator
Definition Region.h:52
static std::optional< RegisteredOperationName > lookup(StringRef name, MLIRContext *ctx)
Lookup the registered operation information for the given operation.
This class implements the result iterators for the Operation class.
Definition ValueRange.h:247
static TypeID get()
Construct a type info object for the given type T.
Definition TypeID.h:245
This class provides an abstraction over the various different ranges of value types.
Definition TypeRange.h:37
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
Definition Types.h:74
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
Definition Value.h:96
Operation * getDefiningOp() const
If this value is the result of an operation, return the operation that defines it.
Definition Value.cpp:18
Include the generated interface declarations.
InFlightDiagnostic emitWarning(Location loc)
Utility method to emit a warning message using this location.
detail::DenseArrayAttrImpl< int64_t > DenseI64ArrayAttr
detail::DenseArrayAttrImpl< int8_t > DenseI8ArrayAttr
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
detail::DenseArrayAttrImpl< int32_t > DenseI32ArrayAttr
InFlightDiagnostic emitRemark(Location loc)
Utility method to emit a remark message using this location.
detail::DenseArrayAttrImpl< double > DenseF64ArrayAttr
detail::DenseArrayAttrImpl< bool > DenseBoolArrayAttr
detail::DenseArrayAttrImpl< float > DenseF32ArrayAttr
detail::DenseArrayAttrImpl< int16_t > DenseI16ArrayAttr
Kind
The kind of listener.
Definition Builders.h:266
@ RewriterBaseListener
RewriterBase::Listener or user-derived class.
Definition Builders.h:271
@ OpBuilderListener
OpBuilder::Listener or user-derived class.
Definition Builders.h:268
This class represents a listener that may be used to hook into various actions within an OpBuilder.
Definition Builders.h:285
virtual void notifyBlockInserted(Block *block, Region *previous, Region::iterator previousIt)
Notify the listener that the specified block was inserted.
Definition Builders.h:308
virtual ~Listener()=default
virtual void notifyOperationInserted(Operation *op, InsertPoint previous)
Notify the listener that the specified operation was inserted.
Definition Builders.h:298
This represents an operation in an abstracted form, suitable for use with the builder APIs.