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