My Project
OperationSupport.h
Go to the documentation of this file.
1 //===- OperationSupport.h ---------------------------------------*- 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 // This file defines a number of support types that Operation and related
10 // classes build on top of.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef MLIR_IR_OPERATION_SUPPORT_H
15 #define MLIR_IR_OPERATION_SUPPORT_H
16 
17 #include "mlir/IR/Attributes.h"
18 #include "mlir/IR/Identifier.h"
19 #include "mlir/IR/Location.h"
20 #include "mlir/IR/Types.h"
21 #include "mlir/IR/Value.h"
23 #include "llvm/ADT/PointerUnion.h"
24 #include "llvm/Support/TrailingObjects.h"
25 #include <memory>
26 
27 namespace mlir {
28 class Block;
29 class Dialect;
30 class Operation;
31 struct OperationState;
32 class OpAsmParser;
33 class OpAsmParserResult;
34 class OpAsmPrinter;
35 class OpFoldResult;
36 class ParseResult;
37 class Pattern;
38 class Region;
39 class RewritePattern;
40 class Type;
41 class Value;
42 class ValueRange;
43 
50 template <typename OpTy> using OperandAdaptor = typename OpTy::OperandAdaptor;
51 
53 
54 //===----------------------------------------------------------------------===//
55 // AbstractOperation
56 //===----------------------------------------------------------------------===//
57 
58 enum class OperationProperty {
62  Commutative = 0x1,
63 
66  NoSideEffect = 0x2,
67 
70  Terminator = 0x4,
71 
76  IsolatedFromAbove = 0x8,
77 };
78 
84 public:
85  using OperationProperties = uint32_t;
86 
88  const StringRef name;
89 
92 
94  bool (&classof)(Operation *op);
95 
97  ParseResult (&parseAssembly)(OpAsmParser &parser, OperationState &result);
98 
100  void (&printAssembly)(Operation *op, OpAsmPrinter &p);
101 
105  LogicalResult (&verifyInvariants)(Operation *op);
106 
126  LogicalResult (&foldHook)(Operation *op, ArrayRef<Attribute> operands,
128 
131  void (&getCanonicalizationPatterns)(OwningRewritePatternList &results,
132  MLIRContext *context);
133 
135  bool hasProperty(OperationProperty property) const {
136  return opProperties & static_cast<OperationProperties>(property);
137  }
138 
142  template <typename T> typename T::Concept *getInterface() const {
143  return reinterpret_cast<typename T::Concept *>(
144  getRawInterface(T::getInterfaceID()));
145  }
146 
148  template <template <typename T> class Trait> bool hasTrait() const {
149  return hasRawTrait(ClassID::getID<Trait>());
150  }
151 
154  static const AbstractOperation *lookup(StringRef opName,
155  MLIRContext *context);
156 
159  template <typename T> static AbstractOperation get(Dialect &dialect) {
160  return AbstractOperation(
161  T::getOperationName(), dialect, T::getOperationProperties(), T::classof,
162  T::parseAssembly, T::printAssembly, T::verifyInvariants, T::foldHook,
163  T::getCanonicalizationPatterns, T::getRawInterface, T::hasTrait);
164  }
165 
166 private:
168  StringRef name, Dialect &dialect, OperationProperties opProperties,
169  bool (&classof)(Operation *op),
170  ParseResult (&parseAssembly)(OpAsmParser &parser, OperationState &result),
171  void (&printAssembly)(Operation *op, OpAsmPrinter &p),
172  LogicalResult (&verifyInvariants)(Operation *op),
173  LogicalResult (&foldHook)(Operation *op, ArrayRef<Attribute> operands,
175  void (&getCanonicalizationPatterns)(OwningRewritePatternList &results,
176  MLIRContext *context),
177  void *(&getRawInterface)(ClassID *interfaceID),
178  bool (&hasTrait)(ClassID *traitID))
179  : name(name), dialect(dialect), classof(classof),
180  parseAssembly(parseAssembly), printAssembly(printAssembly),
181  verifyInvariants(verifyInvariants), foldHook(foldHook),
182  getCanonicalizationPatterns(getCanonicalizationPatterns),
183  opProperties(opProperties), getRawInterface(getRawInterface),
184  hasRawTrait(hasTrait) {}
185 
187  const OperationProperties opProperties;
188 
192  void *(&getRawInterface)(ClassID *interfaceID);
193 
196  bool (&hasRawTrait)(ClassID *traitID);
197 };
198 
199 //===----------------------------------------------------------------------===//
200 // OperationName
201 //===----------------------------------------------------------------------===//
202 
204 public:
205  using RepresentationUnion =
207 
208  OperationName(AbstractOperation *op) : representation(op) {}
209  OperationName(StringRef name, MLIRContext *context);
210 
212  StringRef getDialect() const;
213 
215  StringRef getStringRef() const;
216 
219  const AbstractOperation *getAbstractOperation() const;
220 
221  void print(raw_ostream &os) const;
222  void dump() const;
223 
224  void *getAsOpaquePointer() const {
225  return static_cast<void *>(representation.getOpaqueValue());
226  }
227  static OperationName getFromOpaquePointer(void *pointer);
228 
229 private:
230  RepresentationUnion representation;
231  OperationName(RepresentationUnion representation)
232  : representation(representation) {}
233 };
234 
235 inline raw_ostream &operator<<(raw_ostream &os, OperationName identifier) {
236  identifier.print(os);
237  return os;
238 }
239 
240 inline bool operator==(OperationName lhs, OperationName rhs) {
241  return lhs.getAsOpaquePointer() == rhs.getAsOpaquePointer();
242 }
243 
244 inline bool operator!=(OperationName lhs, OperationName rhs) {
245  return lhs.getAsOpaquePointer() != rhs.getAsOpaquePointer();
246 }
247 
248 // Make operation names hashable.
249 inline llvm::hash_code hash_value(OperationName arg) {
250  return llvm::hash_value(arg.getAsOpaquePointer());
251 }
252 
253 //===----------------------------------------------------------------------===//
254 // OperationState
255 //===----------------------------------------------------------------------===//
256 
273  bool resizableOperandList = false;
274 
275 public:
276  OperationState(Location location, StringRef name);
277 
278  OperationState(Location location, OperationName name);
279 
280  OperationState(Location location, StringRef name, ValueRange operands,
281  ArrayRef<Type> types, ArrayRef<NamedAttribute> attributes,
282  ArrayRef<Block *> successors = {},
284  bool resizableOperandList = false);
285 
286  void addOperands(ValueRange newOperands);
287 
288  void addTypes(ArrayRef<Type> newTypes) {
289  types.append(newTypes.begin(), newTypes.end());
290  }
291 
293  void addAttribute(StringRef name, Attribute attr) {
294  addAttribute(Identifier::get(name, getContext()), attr);
295  }
296 
298  void addAttribute(Identifier name, Attribute attr) {
299  attributes.push_back({name, attr});
300  }
301 
304  attributes.append(newAttributes.begin(), newAttributes.end());
305  }
306 
307  void addSuccessor(Block *successor, ValueRange succOperands);
308 
312  Region *addRegion();
313 
317  void addRegion(std::unique_ptr<Region> &&region);
318 
320  void setOperandListToResizable(bool isResizable = true) {
321  resizableOperandList = isResizable;
322  }
323 
325  MLIRContext *getContext() { return location->getContext(); }
326 };
327 
328 //===----------------------------------------------------------------------===//
329 // OperandStorage
330 //===----------------------------------------------------------------------===//
331 
332 namespace detail {
336  ResizableStorage(OpOperand *opBegin, unsigned numOperands)
337  : firstOpAndIsDynamic(opBegin, false), capacity(numOperands) {}
338 
339  ~ResizableStorage() { cleanupStorage(); }
340 
342  void cleanupStorage() {
343  // If the storage is dynamic, then we need to free the storage.
344  if (isStorageDynamic())
345  free(firstOpAndIsDynamic.getPointer());
346  }
347 
349  void setDynamicStorage(OpOperand *opBegin) {
351  cleanupStorage();
352  firstOpAndIsDynamic.setPointerAndInt(opBegin, true);
353  }
354 
356  OpOperand *getPointer() { return firstOpAndIsDynamic.getPointer(); }
357 
360  bool isStorageDynamic() const { return firstOpAndIsDynamic.getInt(); }
361 
364  llvm::PointerIntPair<OpOperand *, 1, bool> firstOpAndIsDynamic;
365 
366  // The maximum number of operands that can be currently held by the storage.
367  unsigned capacity;
368 };
369 
375 class OperandStorage final
376  : private llvm::TrailingObjects<OperandStorage, ResizableStorage,
377  OpOperand> {
378 public:
379  OperandStorage(unsigned numOperands, bool resizable)
380  : numOperands(numOperands), resizable(resizable) {
381  // Initialize the resizable storage.
382  if (resizable) {
383  new (&getResizableStorage())
384  ResizableStorage(getTrailingObjects<OpOperand>(), numOperands);
385  }
386  }
387 
389  // Manually destruct the operands.
390  for (auto &operand : getOperands())
391  operand.~OpOperand();
392 
393  // If the storage is resizable then destruct the utility.
394  if (resizable)
395  getResizableStorage().~ResizableStorage();
396  }
397 
400  void setOperands(Operation *owner, ValueRange operands);
401 
403  void eraseOperand(unsigned index);
404 
407  return {getRawOperands(), size()};
408  }
409 
411  unsigned size() const { return numOperands; }
412 
414  static size_t additionalAllocSize(unsigned numOperands, bool resizable) {
415  return additionalSizeToAlloc<ResizableStorage, OpOperand>(resizable ? 1 : 0,
416  numOperands);
417  }
418 
420  bool isResizable() const { return resizable; }
421 
422 private:
424  void clear() { numOperands = 0; }
425 
427  OpOperand *getRawOperands() {
428  return resizable ? getResizableStorage().getPointer()
429  : getTrailingObjects<OpOperand>();
430  }
431 
433  ResizableStorage &getResizableStorage() {
434  assert(resizable);
435  return *getTrailingObjects<ResizableStorage>();
436  }
437 
439  void grow(ResizableStorage &resizeUtil, size_t minSize);
440 
442  unsigned numOperands : 31;
443 
445  bool resizable : 1;
446 
447  // This stuff is used by the TrailingObjects template.
448  friend llvm::TrailingObjects<OperandStorage, ResizableStorage, OpOperand>;
449  size_t numTrailingObjects(OverloadToken<ResizableStorage>) const {
450  return resizable ? 1 : 0;
451  }
452 };
453 } // end namespace detail
454 
455 //===----------------------------------------------------------------------===//
456 // TrailingOpResult
457 //===----------------------------------------------------------------------===//
458 
459 namespace detail {
465 };
466 } // end namespace detail
467 
468 //===----------------------------------------------------------------------===//
469 // OpPrintingFlags
470 //===----------------------------------------------------------------------===//
471 
475 public:
476  OpPrintingFlags();
477  OpPrintingFlags(llvm::NoneType) : OpPrintingFlags() {}
478 
484  OpPrintingFlags &elideLargeElementsAttrs(int64_t largeElementLimit = 16);
485 
489  OpPrintingFlags &enableDebugInfo(bool prettyForm = false);
490 
492  OpPrintingFlags &printGenericOpForm();
493 
498  OpPrintingFlags &useLocalScope();
499 
501  bool shouldElideElementsAttr(ElementsAttr attr) const;
502 
504  bool shouldPrintDebugInfo() const;
505 
507  bool shouldPrintDebugInfoPrettyForm() const;
508 
510  bool shouldPrintGenericOpForm() const;
511 
513  bool shouldUseLocalScope() const;
514 
515 private:
518  Optional<int64_t> elementsAttrElementLimit;
519 
521  bool printDebugInfoFlag : 1;
522  bool printDebugInfoPrettyFormFlag : 1;
523 
525  bool printGenericOpFormFlag : 1;
526 
528  bool printLocalScope : 1;
529 };
530 
531 //===----------------------------------------------------------------------===//
532 // Operation Value-Iterators
533 //===----------------------------------------------------------------------===//
534 
535 //===----------------------------------------------------------------------===//
536 // ValueTypeRange
537 
539 template <typename ValueIteratorT>
540 class ValueTypeIterator final
541  : public llvm::mapped_iterator<ValueIteratorT, Type (*)(Value)> {
542  static Type unwrap(Value value) { return value.getType(); }
543 
544 public:
545  using reference = Type;
546 
548  Type operator*() const { return unwrap(*this->I); }
549 
551  ValueTypeIterator(ValueIteratorT it)
552  : llvm::mapped_iterator<ValueIteratorT, Type (*)(Value)>(it, &unwrap) {}
553 };
554 
555 //===----------------------------------------------------------------------===//
556 // OperandRange
557 
559 class OperandRange final
560  : public detail::indexed_accessor_range_base<OperandRange, OpOperand *,
561  Value, Value, Value> {
562 public:
564  OperandRange(Operation *op);
565 
568  iterator_range<type_iterator> getTypes() const { return {begin(), end()}; }
569 
570 private:
572  static OpOperand *offset_base(OpOperand *object, ptrdiff_t index) {
573  return object + index;
574  }
576  static Value dereference_iterator(OpOperand *object, ptrdiff_t index) {
577  return object[index].get();
578  }
579 
581  friend RangeBaseT;
582 };
583 
584 //===----------------------------------------------------------------------===//
585 // ResultRange
586 
588 class ResultRange final
589  : public indexed_accessor_range<ResultRange, Operation *, OpResult,
590  OpResult, OpResult> {
591 public:
593  OpResult>::indexed_accessor_range;
594  ResultRange(Operation *op);
595 
598  iterator_range<type_iterator> getTypes() const { return {begin(), end()}; }
599 
600 private:
602  static OpResult dereference(Operation *op, ptrdiff_t index);
603 
605  friend indexed_accessor_range<ResultRange, Operation *, OpResult, OpResult,
606  OpResult>;
607 };
608 
609 //===----------------------------------------------------------------------===//
610 // ValueRange
611 
612 namespace detail {
616  ValueRangeOwner(const Value *owner) : ptr(owner), startIndex(0) {}
617  ValueRangeOwner(OpOperand *owner) : ptr(owner), startIndex(0) {}
618  ValueRangeOwner(Operation *owner, unsigned startIndex)
619  : ptr(owner), startIndex(startIndex) {}
620  bool operator==(const ValueRangeOwner &rhs) const { return ptr == rhs.ptr; }
621 
629 
631  unsigned startIndex;
632 };
633 } // end namespace detail
634 
640 class ValueRange final
642  ValueRange, detail::ValueRangeOwner, Value, Value, Value> {
643 public:
645 
646  template <typename Arg,
647  typename = typename std::enable_if_t<
648  std::is_constructible<ArrayRef<Value>, Arg>::value &&
649  !std::is_convertible<Arg, Value>::value>>
650  ValueRange(Arg &&arg) : ValueRange(ArrayRef<Value>(std::forward<Arg>(arg))) {}
651  ValueRange(const Value &value) : ValueRange(&value, /*count=*/1) {}
652  ValueRange(const std::initializer_list<Value> &values)
653  : ValueRange(ArrayRef<Value>(values)) {}
655  : ValueRange(OperandRange(values)) {}
657  : ValueRange(ResultRange(values)) {}
659  ValueRange(OperandRange values);
660  ValueRange(ResultRange values);
661 
664  iterator_range<type_iterator> getTypes() const { return {begin(), end()}; }
665 
666 private:
668 
670  static OwnerT offset_base(const OwnerT &owner, ptrdiff_t index);
672  static Value dereference_iterator(const OwnerT &owner, ptrdiff_t index);
673 
675  friend RangeBaseT;
676 };
677 } // end namespace mlir
678 
679 namespace llvm {
680 // Identifiers hash just like pointers, there is no need to hash the bytes.
681 template <> struct DenseMapInfo<mlir::OperationName> {
685  }
689  }
690  static unsigned getHashValue(mlir::OperationName Val) {
692  }
694  return LHS == RHS;
695  }
696 };
697 
701 template <> struct PointerLikeTypeTraits<mlir::OperationName> {
702 public:
703  static inline void *getAsVoidPointer(mlir::OperationName I) {
704  return const_cast<void *>(I.getAsOpaquePointer());
705  }
706  static inline mlir::OperationName getFromVoidPointer(void *P) {
708  }
709  enum {
710  NumLowBitsAvailable = PointerLikeTypeTraits<
711  mlir::OperationName::RepresentationUnion>::NumLowBitsAvailable
712  };
713 };
714 
715 } // end namespace llvm
716 
717 #endif
void addAttribute(Identifier name, Attribute attr)
Add an attribute with the specified name.
Definition: OperationSupport.h:298
Definition: InferTypeOpInterface.cpp:20
Definition: Region.h:23
ValueRange(const Value &value)
Definition: OperationSupport.h:651
Definition: STLExtras.h:293
void print(raw_ostream &os) const
Definition: AsmPrinter.cpp:44
~OperandStorage()
Definition: OperationSupport.h:388
Definition: STLExtras.h:95
Definition: PassRegistry.cpp:413
Definition: Operation.h:27
SmallVector< Block *, 1 > successors
Successors of this operation and their respective operands.
Definition: OperationSupport.h:269
MLIRContext * getContext()
Get the context held by this operation state.
Definition: OperationSupport.h:325
static mlir::OperationName getEmptyKey()
Definition: OperationSupport.h:682
void * getAsOpaquePointer() const
Definition: OperationSupport.h:224
This is a value defined by a result of an operation.
Definition: Value.h:287
Definition: Attributes.h:139
ValueTypeIterator(ValueIteratorT it)
Initializes the type iterator to the specified value iterator.
Definition: OperationSupport.h:551
Block represents an ordered list of Operations.
Definition: Block.h:21
~ResizableStorage()
Definition: OperationSupport.h:339
Definition: LLVM.h:45
bool operator==(const ValueRangeOwner &rhs) const
Definition: OperationSupport.h:620
bool operator!=(IntInfty lhs, IntInfty rhs)
Definition: SDBM.h:94
static Identifier get(StringRef str, MLIRContext *context)
Return an identifier for the specified string.
Definition: MLIRContext.cpp:426
Definition: Identifier.h:26
static OperationName getFromOpaquePointer(void *pointer)
Definition: Operation.cpp:62
This class implements the result iterators for the Operation class.
Definition: OperationSupport.h:588
bool isResizable() const
Returns if this storage is resizable.
Definition: OperationSupport.h:420
Definition: OpImplementation.h:214
Definition: LLVM.h:40
ValueRangeOwner(OpOperand *owner)
Definition: OperationSupport.h:617
PointerUnion< const Value *, OpOperand *, void * > ptr
Definition: OperationSupport.h:628
ValueRangeOwner(const Value *owner)
Definition: OperationSupport.h:616
bool isStorageDynamic() const
Definition: OperationSupport.h:360
Definition: LLVM.h:34
SmallVector< Value, 4 > operands
Definition: OperationSupport.h:264
Definition: Location.h:52
bool hasProperty(OperationProperty property) const
Returns whether the operation has a particular property.
Definition: OperationSupport.h:135
ResizableStorage(OpOperand *opBegin, unsigned numOperands)
Definition: OperationSupport.h:336
Location location
Definition: OperationSupport.h:262
This class implements iteration on the types of a given range of values.
Definition: OperationSupport.h:540
Definition: LogicalResult.h:18
static unsigned getHashValue(mlir::OperationName Val)
Definition: OperationSupport.h:690
Definition: LLVM.h:37
llvm::PointerIntPair< OpOperand *, 1, bool > firstOpAndIsDynamic
Definition: OperationSupport.h:364
void cleanupStorage()
Cleanup any allocated storage.
Definition: OperationSupport.h:342
Type getType() const
Return the type of this value.
Definition: Value.cpp:34
static mlir::OperationName getFromVoidPointer(void *P)
Definition: OperationSupport.h:706
MLIRContext * getContext() const
Return the context this attribute belongs to.
Definition: Attributes.cpp:46
static void * getAsVoidPointer(mlir::OperationName I)
Definition: OperationSupport.h:703
OperationName(AbstractOperation *op)
Definition: OperationSupport.h:208
Definition: Attributes.h:53
iterator_range< type_iterator > getTypes() const
Definition: OperationSupport.h:598
Definition: LLVM.h:38
void addAttributes(ArrayRef< NamedAttribute > newAttributes)
Add an array of named attributes.
Definition: OperationSupport.h:303
Type operator*() const
Provide a const dereference method.
Definition: OperationSupport.h:548
Definition: Dialect.h:39
T::Concept * getInterface() const
Definition: OperationSupport.h:142
void addTypes(ArrayRef< Type > newTypes)
Definition: OperationSupport.h:288
Definition: OperationSupport.h:83
Definition: OpImplementation.h:32
static bool isEqual(mlir::OperationName LHS, mlir::OperationName RHS)
Definition: OperationSupport.h:693
ValueRangeOwner(Operation *owner, unsigned startIndex)
Definition: OperationSupport.h:618
This class provides the implementation for a trailing operation result.
Definition: OperationSupport.h:461
Definition: OperationSupport.h:261
static size_t additionalAllocSize(unsigned numOperands, bool resizable)
Returns the additional size necessary for allocating this object.
Definition: OperationSupport.h:414
unsigned size() const
Return the number of operands held in the storage.
Definition: OperationSupport.h:411
void setOperandListToResizable(bool isResizable=true)
Sets the operand list of the operation as resizable.
Definition: OperationSupport.h:320
ValueRange(iterator_range< ResultRange::iterator > values)
Definition: OperationSupport.h:656
bool operator==(IntInfty lhs, IntInfty rhs)
Definition: SDBM.h:90
Definition: Types.h:84
bool hasTrait() const
Returns if the operation has a particular trait.
Definition: OperationSupport.h:148
uint32_t OperationProperties
Definition: OperationSupport.h:85
unsigned capacity
Definition: OperationSupport.h:367
Definition: Value.h:38
void addAttribute(StringRef name, Attribute attr)
Add an attribute with the specified name.
Definition: OperationSupport.h:293
ValueRange(iterator_range< OperandRange::iterator > values)
Definition: OperationSupport.h:654
inline ::llvm::hash_code hash_value(AffineExpr arg)
Make AffineExpr hashable.
Definition: AffineExpr.h:201
OperationName name
Definition: OperationSupport.h:263
ValueRange(Arg &&arg)
Definition: OperationSupport.h:650
Definition: LLVM.h:35
Definition: OperationSupport.h:474
Definition: PatternMatch.h:418
Definition: LLVM.h:50
iterator_range< type_iterator > getTypes() const
Definition: OperationSupport.h:664
Definition: OperationSupport.h:615
Definition: MLIRContext.h:34
void print(OpAsmPrinter &p, AffineIfOp op)
Definition: AffineOps.cpp:1671
A reference to a value, suitable for use as an operand of an operation.
Definition: UseDefLists.h:330
This class implements the operand iterators for the Operation class.
Definition: OperationSupport.h:559
OpOperand * getPointer()
Returns the current storage pointer.
Definition: OperationSupport.h:356
const StringRef name
This is the name of the operation.
Definition: OperationSupport.h:88
Definition: StandardTypes.h:63
Dialect & dialect
This is the dialect that this operation belongs to.
Definition: OperationSupport.h:91
OperationProperty
Definition: OperationSupport.h:58
MutableArrayRef< OpOperand > getOperands()
Get the operation operands held by the storage.
Definition: OperationSupport.h:406
llvm::hash_code hash_value(OperationName arg)
Definition: OperationSupport.h:249
typename OpTy::OperandAdaptor OperandAdaptor
Definition: OperationSupport.h:50
SmallVector< std::unique_ptr< Region >, 1 > regions
Regions that the op will hold.
Definition: OperationSupport.h:271
raw_ostream & operator<<(raw_ostream &os, SubViewOp::Range &range)
Definition: Ops.cpp:2759
uint64_t trailingResultNumber
Definition: OperationSupport.h:464
ValueRange(const std::initializer_list< Value > &values)
Definition: OperationSupport.h:652
unsigned startIndex
Ths start index into the range. This is only used for Operation* owners.
Definition: OperationSupport.h:631
Definition: OpDefinition.h:36
SmallVector< NamedAttribute, 4 > attributes
Definition: OperationSupport.h:267
Definition: OperationSupport.h:203
Definition: Attributes.h:559
static mlir::OperationName getTombstoneKey()
Definition: OperationSupport.h:686
Definition: OperationSupport.h:640
OperandStorage(unsigned numOperands, bool resizable)
Definition: OperationSupport.h:379
iterator_range< type_iterator > getTypes() const
Definition: OperationSupport.h:568
OpPrintingFlags(llvm::NoneType)
Definition: OperationSupport.h:477
Definition: OperationSupport.h:335
Definition: LLVM.h:41
SmallVector< Type, 4 > types
Types of the results of this operation.
Definition: OperationSupport.h:266
void setDynamicStorage(OpOperand *opBegin)
Sets the storage pointer to a new dynamically allocated block.
Definition: OperationSupport.h:349
Definition: OperationSupport.h:375