MLIR  21.0.0git
Value.h
Go to the documentation of this file.
1 //===- Value.h - Base of the SSA Value hierarchy ----------------*- 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 // This file defines generic Value type and manipulation utilities.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef MLIR_IR_VALUE_H
14 #define MLIR_IR_VALUE_H
15 
16 #include "mlir/IR/Types.h"
17 #include "mlir/IR/UseDefLists.h"
18 #include "mlir/Support/LLVM.h"
19 #include "llvm/Support/PointerLikeTypeTraits.h"
20 
21 namespace mlir {
22 class AsmState;
23 class Block;
24 class BlockArgument;
25 class Operation;
26 class OpOperand;
27 class OpPrintingFlags;
28 class OpResult;
29 class Region;
30 class Value;
31 
32 //===----------------------------------------------------------------------===//
33 // Value
34 //===----------------------------------------------------------------------===//
35 
36 namespace detail {
37 
38 /// The base class for all derived Value classes. It contains all of the
39 /// components that are shared across Value classes.
40 class alignas(8) ValueImpl : public IRObjectWithUseList<OpOperand> {
41 public:
42  /// The enumeration represents the various different kinds of values the
43  /// internal representation may take. We use all of the bits from Type that we
44  /// can to store indices inline.
45  enum class Kind {
46  /// The first N kinds are all inline operation results. An inline operation
47  /// result means that the kind represents the result number. This removes
48  /// the need to store an additional index value. The derived class here is
49  /// an `OpResultImpl`.
50  InlineOpResult = 0,
51 
52  /// The next kind represents a 'out-of-line' operation result. This is for
53  /// results with numbers larger than we can represent inline. The derived
54  /// class here is an `OpResultImpl`.
56 
57  /// The last kind represents a block argument. The derived class here is an
58  /// `BlockArgumentImpl`.
59  BlockArgument = 7
60  };
61 
62  /// Return the type of this value.
63  Type getType() const { return typeAndKind.getPointer(); }
64 
65  /// Set the type of this value.
66  void setType(Type type) { return typeAndKind.setPointer(type); }
67 
68  /// Return the kind of this value.
69  Kind getKind() const { return typeAndKind.getInt(); }
70 
71 protected:
72  ValueImpl(Type type, Kind kind) : typeAndKind(type, kind) {}
73 
74  /// Expose a few methods explicitly for the debugger to call for
75  /// visualization.
76 #ifndef NDEBUG
77  LLVM_DUMP_METHOD Type debug_getType() const { return getType(); }
78  LLVM_DUMP_METHOD Kind debug_getKind() const { return getKind(); }
79 
80 #endif
81 
82  /// The type of this result and the kind.
83  llvm::PointerIntPair<Type, 3, Kind> typeAndKind;
84 };
85 } // namespace detail
86 
87 /// This class represents an instance of an SSA value in the MLIR system,
88 /// representing a computable value that has a type and a set of users. An SSA
89 /// value is either a BlockArgument or the result of an operation. Note: This
90 /// class has value-type semantics and is just a simple wrapper around a
91 /// ValueImpl that is either owner by a block(in the case of a BlockArgument) or
92 /// an Operation(in the case of an OpResult).
93 /// As most IR constructs, this isn't const-correct, but we keep method
94 /// consistent and as such method that immediately modify this Value aren't
95 /// marked `const` (include modifying the Value use-list).
96 class Value {
97 public:
98  constexpr Value(detail::ValueImpl *impl = nullptr) : impl(impl) {}
99 
100  explicit operator bool() const { return impl; }
101  bool operator==(const Value &other) const { return impl == other.impl; }
102  bool operator!=(const Value &other) const { return !(*this == other); }
103 
104  /// Return the type of this value.
105  Type getType() const { return impl->getType(); }
106 
107  /// Utility to get the associated MLIRContext that this value is defined in.
108  MLIRContext *getContext() const { return getType().getContext(); }
109 
110  /// Mutate the type of this Value to be of the specified type.
111  ///
112  /// Note that this is an extremely dangerous operation which can create
113  /// completely invalid IR very easily. It is strongly recommended that you
114  /// recreate IR objects with the right types instead of mutating them in
115  /// place.
116  void setType(Type newType) { impl->setType(newType); }
117 
118  /// If this value is the result of an operation, return the operation that
119  /// defines it.
120  Operation *getDefiningOp() const;
121 
122  /// If this value is the result of an operation of type OpTy, return the
123  /// operation that defines it.
124  template <typename OpTy>
125  OpTy getDefiningOp() const {
126  return llvm::dyn_cast_or_null<OpTy>(getDefiningOp());
127  }
128 
129  /// Return the location of this value.
130  Location getLoc() const;
131  void setLoc(Location loc);
132 
133  /// Return the Region in which this Value is defined.
135 
136  /// Return the Block in which this Value is defined.
138 
139  //===--------------------------------------------------------------------===//
140  // UseLists
141  //===--------------------------------------------------------------------===//
142 
143  /// Drop all uses of this object from their respective owners.
144  void dropAllUses() { return impl->dropAllUses(); }
145 
146  /// Replace all uses of 'this' value with the new value, updating anything in
147  /// the IR that uses 'this' to use the other value instead. When this returns
148  /// there are zero uses of 'this'.
149  void replaceAllUsesWith(Value newValue) {
150  impl->replaceAllUsesWith(newValue);
151  }
152 
153  /// Replace all uses of 'this' value with 'newValue', updating anything in the
154  /// IR that uses 'this' to use the other value instead except if the user is
155  /// listed in 'exceptions' .
156  void replaceAllUsesExcept(Value newValue,
157  const SmallPtrSetImpl<Operation *> &exceptions);
158 
159  /// Replace all uses of 'this' value with 'newValue', updating anything in the
160  /// IR that uses 'this' to use the other value instead except if the user is
161  /// 'exceptedUser'.
162  void replaceAllUsesExcept(Value newValue, Operation *exceptedUser);
163 
164  /// Replace all uses of 'this' value with 'newValue' if the given callback
165  /// returns true.
166  void replaceUsesWithIf(Value newValue,
167  function_ref<bool(OpOperand &)> shouldReplace);
168 
169  /// Returns true if the value is used outside of the given block.
170  bool isUsedOutsideOfBlock(Block *block) const;
171 
172  /// Shuffle the use list order according to the provided indices. It is
173  /// responsibility of the caller to make sure that the indices map the current
174  /// use-list chain to another valid use-list chain.
175  void shuffleUseList(ArrayRef<unsigned> indices);
176 
177  //===--------------------------------------------------------------------===//
178  // Uses
179 
180  /// This class implements an iterator over the uses of a value.
183 
184  use_iterator use_begin() const { return impl->use_begin(); }
185  use_iterator use_end() const { return use_iterator(); }
186 
187  /// Returns a range of all uses, which is useful for iterating over all uses.
188  use_range getUses() const { return {use_begin(), use_end()}; }
189 
190  /// This method computes the number of uses of this Value.
191  ///
192  /// This is a linear time operation. Use hasOneUse, hasNUses, or
193  /// hasNUsesOrMore to check for specific values.
194  unsigned getNumUses() const;
195 
196  /// Returns true if this value has exactly one use.
197  bool hasOneUse() const { return impl->hasOneUse(); }
198 
199  /// Return true if this Value has exactly n uses.
200  bool hasNUses(unsigned n) const;
201 
202  /// Return true if this value has n uses or more.
203  ///
204  /// This is logically equivalent to getNumUses() >= N.
205  bool hasNUsesOrMore(unsigned n) const;
206 
207  /// Returns true if this value has no uses.
208  bool use_empty() const { return impl->use_empty(); }
209 
210  //===--------------------------------------------------------------------===//
211  // Users
212 
215 
216  user_iterator user_begin() const { return use_begin(); }
217  user_iterator user_end() const { return use_end(); }
218  user_range getUsers() const { return {user_begin(), user_end()}; }
219 
220  //===--------------------------------------------------------------------===//
221  // Utilities
222 
223  void print(raw_ostream &os) const;
224  void print(raw_ostream &os, const OpPrintingFlags &flags) const;
225  void print(raw_ostream &os, AsmState &state) const;
226  void dump() const;
227 
228  /// Print this value as if it were an operand.
229  void printAsOperand(raw_ostream &os, AsmState &state) const;
230  void printAsOperand(raw_ostream &os, const OpPrintingFlags &flags) const;
231 
232  /// Methods for supporting PointerLikeTypeTraits.
233  void *getAsOpaquePointer() const { return impl; }
234  static Value getFromOpaquePointer(const void *pointer) {
235  return reinterpret_cast<detail::ValueImpl *>(const_cast<void *>(pointer));
236  }
237  detail::ValueImpl *getImpl() const { return impl; }
238 
239  friend ::llvm::hash_code hash_value(Value arg);
240 
241 protected:
242  /// A pointer to the internal implementation of the value.
244 };
245 
246 inline raw_ostream &operator<<(raw_ostream &os, Value value) {
247  value.print(os);
248  return os;
249 }
250 
251 //===----------------------------------------------------------------------===//
252 // OpOperand
253 //===----------------------------------------------------------------------===//
254 
255 /// This class represents an operand of an operation. Instances of this class
256 /// contain a reference to a specific `Value`.
257 class OpOperand : public IROperand<OpOperand, Value> {
258 public:
259  /// Provide the use list that is attached to the given value.
261  return value.getImpl();
262  }
263 
264  /// Return which operand this is in the OpOperand list of the Operation.
265  unsigned getOperandNumber();
266 
267  /// Set the current value being used by this operand.
268  void assign(Value value) { set(value); }
269 
270 private:
271  /// Keep the constructor private and accessible to the OperandStorage class
272  /// only to avoid hard-to-debug typo/programming mistakes.
273  friend class OperandStorage;
275 };
276 
277 //===----------------------------------------------------------------------===//
278 // BlockArgument
279 //===----------------------------------------------------------------------===//
280 
281 namespace detail {
282 /// The internal implementation of a BlockArgument.
283 class BlockArgumentImpl : public ValueImpl {
284 public:
285  static bool classof(const ValueImpl *value) {
286  return value->getKind() == ValueImpl::Kind::BlockArgument;
287  }
288 
289 private:
290  BlockArgumentImpl(Type type, Block *owner, int64_t index, Location loc)
291  : ValueImpl(type, Kind::BlockArgument), owner(owner), index(index),
292  loc(loc) {}
293 
294  /// The owner of this argument.
295  Block *owner;
296 
297  /// The position in the argument list.
298  int64_t index;
299 
300  /// The source location of this argument.
301  Location loc;
302 
303  /// Allow access to owner and constructor.
304  friend BlockArgument;
305 };
306 } // namespace detail
307 
308 /// This class represents an argument of a Block.
309 class BlockArgument : public Value {
310 public:
311  using Value::Value;
312 
313  static bool classof(Value value) {
314  return llvm::isa<detail::BlockArgumentImpl>(value.getImpl());
315  }
316 
317  /// Returns the block that owns this argument.
318  Block *getOwner() const { return getImpl()->owner; }
319 
320  /// Returns the number of this argument.
321  unsigned getArgNumber() const { return getImpl()->index; }
322 
323  /// Return the location for this argument.
324  Location getLoc() const { return getImpl()->loc; }
325  void setLoc(Location loc) { getImpl()->loc = loc; }
326 
327 private:
328  /// Allocate a new argument with the given type and owner.
329  static BlockArgument create(Type type, Block *owner, int64_t index,
330  Location loc) {
331  return new detail::BlockArgumentImpl(type, owner, index, loc);
332  }
333 
334  /// Destroy and deallocate this argument.
335  void destroy() { delete getImpl(); }
336 
337  /// Get a raw pointer to the internal implementation.
338  detail::BlockArgumentImpl *getImpl() const {
339  return reinterpret_cast<detail::BlockArgumentImpl *>(impl);
340  }
341 
342  /// Cache the position in the block argument list.
343  void setArgNumber(int64_t index) { getImpl()->index = index; }
344 
345  /// Allow access to `create`, `destroy` and `setArgNumber`.
346  friend Block;
347 
348  /// Allow access to 'getImpl'.
349  friend Value;
350 };
351 
352 //===----------------------------------------------------------------------===//
353 // OpResult
354 //===----------------------------------------------------------------------===//
355 
356 namespace detail {
357 /// This class provides the implementation for an operation result.
358 class alignas(8) OpResultImpl : public ValueImpl {
359 public:
360  using ValueImpl::ValueImpl;
361 
362  static bool classof(const ValueImpl *value) {
363  return value->getKind() != ValueImpl::Kind::BlockArgument;
364  }
365 
366  /// Returns the parent operation of this result.
367  Operation *getOwner() const;
368 
369  /// Returns the result number of this op result.
370  unsigned getResultNumber() const;
371 
372  /// Returns the next operation result at `offset` after this result. This
373  /// method is useful when indexing the result storage of an operation, given
374  /// that there is more than one kind of operation result (with the different
375  /// kinds having different sizes) and that operations are stored in reverse
376  /// order.
377  OpResultImpl *getNextResultAtOffset(intptr_t offset);
378 
379  /// Returns the maximum number of results that can be stored inline.
380  static unsigned getMaxInlineResults() {
381  return static_cast<unsigned>(Kind::OutOfLineOpResult);
382  }
383 };
384 
385 /// This class provides the implementation for an operation result whose index
386 /// can be represented "inline" in the underlying ValueImpl.
387 struct InlineOpResult : public OpResultImpl {
388 public:
389  InlineOpResult(Type type, unsigned resultNo)
390  : OpResultImpl(type, static_cast<ValueImpl::Kind>(resultNo)) {
391  assert(resultNo < getMaxInlineResults());
392  }
393 
394  /// Return the result number of this op result.
395  unsigned getResultNumber() const { return static_cast<unsigned>(getKind()); }
396 
397  static bool classof(const OpResultImpl *value) {
398  return value->getKind() != ValueImpl::Kind::OutOfLineOpResult;
399  }
400 };
401 
402 /// This class provides the implementation for an operation result whose index
403 /// cannot be represented "inline", and thus requires an additional index field.
405 public:
409 
410  static bool classof(const OpResultImpl *value) {
411  return value->getKind() == ValueImpl::Kind::OutOfLineOpResult;
412  }
413 
414  /// Return the result number of this op result.
415  unsigned getResultNumber() const {
417  }
418 
419  /// The trailing result number, or the offset from the beginning of the
420  /// `OutOfLineOpResult` array.
421  uint64_t outOfLineIndex;
422 };
423 
424 /// Return the result number of this op result.
425 inline unsigned OpResultImpl::getResultNumber() const {
426  if (const auto *outOfLineResult = dyn_cast<OutOfLineOpResult>(this))
427  return outOfLineResult->getResultNumber();
428  return cast<InlineOpResult>(this)->getResultNumber();
429 }
430 
431 /// TypedValue is a Value with a statically know type.
432 /// TypedValue can be null/empty
433 template <typename Ty>
434 struct TypedValue : Value {
435  using Value::Value;
436 
437  static bool classof(Value value) { return llvm::isa<Ty>(value.getType()); }
438 
439  /// Return the known Type
440  Ty getType() const { return llvm::cast<Ty>(Value::getType()); }
441  void setType(Ty ty) { Value::setType(ty); }
442 };
443 
444 } // namespace detail
445 
446 /// This is a value defined by a result of an operation.
447 class OpResult : public Value {
448 public:
449  using Value::Value;
450 
451  static bool classof(Value value) {
452  return llvm::isa<detail::OpResultImpl>(value.getImpl());
453  }
454 
455  /// Returns the operation that owns this result.
456  Operation *getOwner() const { return getImpl()->getOwner(); }
457 
458  /// Returns the number of this result.
459  unsigned getResultNumber() const { return getImpl()->getResultNumber(); }
460 
461 private:
462  /// Get a raw pointer to the internal implementation.
463  detail::OpResultImpl *getImpl() const {
464  return reinterpret_cast<detail::OpResultImpl *>(impl);
465  }
466 
467  /// Given a number of operation results, returns the number that need to be
468  /// stored inline.
469  static unsigned getNumInline(unsigned numResults);
470 
471  /// Given a number of operation results, returns the number that need to be
472  /// stored as trailing.
473  static unsigned getNumTrailing(unsigned numResults);
474 
475  /// Allow access to constructor.
476  friend Operation;
477 };
478 
479 /// Make Value hashable.
480 inline ::llvm::hash_code hash_value(Value arg) {
482 }
483 
484 template <typename Ty, typename Value = mlir::Value>
485 /// If Ty is mlir::Type this will select `Value` instead of having a wrapper
486 /// around it. This helps resolve ambiguous conversion issues.
487 using TypedValue = std::conditional_t<std::is_same_v<Ty, mlir::Type>,
489 
490 } // namespace mlir
491 
492 namespace llvm {
493 
494 template <>
495 struct DenseMapInfo<mlir::Value> {
497  void *pointer = llvm::DenseMapInfo<void *>::getEmptyKey();
498  return mlir::Value::getFromOpaquePointer(pointer);
499  }
502  return mlir::Value::getFromOpaquePointer(pointer);
503  }
504  static unsigned getHashValue(mlir::Value val) {
505  return mlir::hash_value(val);
506  }
507  static bool isEqual(mlir::Value lhs, mlir::Value rhs) { return lhs == rhs; }
508 };
509 template <>
510 struct DenseMapInfo<mlir::BlockArgument> : public DenseMapInfo<mlir::Value> {
512  void *pointer = llvm::DenseMapInfo<void *>::getEmptyKey();
513  return reinterpret_cast<mlir::detail::BlockArgumentImpl *>(pointer);
514  }
517  return reinterpret_cast<mlir::detail::BlockArgumentImpl *>(pointer);
518  }
519 };
520 template <>
521 struct DenseMapInfo<mlir::OpResult> : public DenseMapInfo<mlir::Value> {
523  void *pointer = llvm::DenseMapInfo<void *>::getEmptyKey();
524  return reinterpret_cast<mlir::detail::OpResultImpl *>(pointer);
525  }
528  return reinterpret_cast<mlir::detail::OpResultImpl *>(pointer);
529  }
530 };
531 template <typename T>
533  : public DenseMapInfo<mlir::Value> {
535  void *pointer = llvm::DenseMapInfo<void *>::getEmptyKey();
536  return reinterpret_cast<mlir::detail::ValueImpl *>(pointer);
537  }
540  return reinterpret_cast<mlir::detail::ValueImpl *>(pointer);
541  }
542 };
543 
544 /// Allow stealing the low bits of a value.
545 template <>
546 struct PointerLikeTypeTraits<mlir::Value> {
547 public:
548  static inline void *getAsVoidPointer(mlir::Value value) {
549  return const_cast<void *>(value.getAsOpaquePointer());
550  }
551  static inline mlir::Value getFromVoidPointer(void *pointer) {
552  return mlir::Value::getFromOpaquePointer(pointer);
553  }
554  enum {
555  NumLowBitsAvailable =
556  PointerLikeTypeTraits<mlir::detail::ValueImpl *>::NumLowBitsAvailable
557  };
558 };
559 template <>
560 struct PointerLikeTypeTraits<mlir::BlockArgument>
561  : public PointerLikeTypeTraits<mlir::Value> {
562 public:
563  static inline mlir::BlockArgument getFromVoidPointer(void *pointer) {
564  return reinterpret_cast<mlir::detail::BlockArgumentImpl *>(pointer);
565  }
566 };
567 template <>
568 struct PointerLikeTypeTraits<mlir::OpResult>
569  : public PointerLikeTypeTraits<mlir::Value> {
570 public:
571  static inline mlir::OpResult getFromVoidPointer(void *pointer) {
572  return reinterpret_cast<mlir::detail::OpResultImpl *>(pointer);
573  }
574 };
575 template <typename T>
576 struct PointerLikeTypeTraits<mlir::detail::TypedValue<T>>
577  : public PointerLikeTypeTraits<mlir::Value> {
578 public:
579  static inline mlir::detail::TypedValue<T> getFromVoidPointer(void *pointer) {
580  return reinterpret_cast<mlir::detail::ValueImpl *>(pointer);
581  }
582 };
583 
584 /// Add support for llvm style casts. We provide a cast between To and From if
585 /// From is mlir::Value or derives from it.
586 template <typename To, typename From>
587 struct CastInfo<
588  To, From,
589  std::enable_if_t<std::is_same_v<mlir::Value, std::remove_const_t<From>> ||
590  std::is_base_of_v<mlir::Value, From>>>
592  DefaultDoCastIfPossible<To, From, CastInfo<To, From>> {
593  /// Arguments are taken as mlir::Value here and not as `From`, because
594  /// when casting from an intermediate type of the hierarchy to one of its
595  /// children, the val.getKind() inside T::classof will use the static
596  /// getKind() of the parent instead of the non-static ValueImpl::getKind()
597  /// that returns the dynamic type. This means that T::classof would end up
598  /// comparing the static Kind of the children to the static Kind of its
599  /// parent, making it impossible to downcast from the parent to the child.
600  static inline bool isPossible(mlir::Value ty) {
601  /// Return a constant true instead of a dynamic true when casting to self or
602  /// up the hierarchy.
603  if constexpr (std::is_base_of_v<To, From>) {
604  return true;
605  } else {
606  return To::classof(ty);
607  }
608  }
609  static inline To doCast(mlir::Value value) { return To(value.getImpl()); }
610 };
611 
612 } // namespace llvm
613 
614 #endif
union mlir::linalg::@1203::ArityGroupAndKind::Kind kind
This class provides management for the lifetime of the state used when printing the IR.
Definition: AsmState.h:542
This class represents an argument of a Block.
Definition: Value.h:309
Block * getOwner() const
Returns the block that owns this argument.
Definition: Value.h:318
Location getLoc() const
Return the location for this argument.
Definition: Value.h:324
unsigned getArgNumber() const
Returns the number of this argument.
Definition: Value.h:321
static bool classof(Value value)
Definition: Value.h:313
void setLoc(Location loc)
Definition: Value.h:325
Block represents an ordered list of Operations.
Definition: Block.h:33
This class represents a single IR object that contains a use list.
Definition: UseDefLists.h:195
A reference to a value, suitable for use as an operand of an operation.
Definition: UseDefLists.h:127
void set(Value newValue)
Set the current value being used by this operand.
Definition: UseDefLists.h:163
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
Definition: Location.h:76
MLIRContext is the top-level object for a collection of MLIR operations.
Definition: MLIRContext.h:60
This class represents an operand of an operation.
Definition: Value.h:257
unsigned getOperandNumber()
Return which operand this is in the OpOperand list of the Operation.
Definition: Value.cpp:228
friend class OperandStorage
Keep the constructor private and accessible to the OperandStorage class only to avoid hard-to-debug t...
Definition: Value.h:273
static IRObjectWithUseList< OpOperand > * getUseList(Value value)
Provide the use list that is attached to the given value.
Definition: Value.h:260
void assign(Value value)
Set the current value being used by this operand.
Definition: Value.h:268
Set of flags used to control the behavior of the various IR print methods (e.g.
This is a value defined by a result of an operation.
Definition: Value.h:447
Operation * getOwner() const
Returns the operation that owns this result.
Definition: Value.h:456
static bool classof(Value value)
Definition: Value.h:451
unsigned getResultNumber() const
Returns the number of this result.
Definition: Value.h:459
Operation is the basic unit of execution within MLIR.
Definition: Operation.h:88
This class contains a list of basic blocks and a link to the parent operation it is attached to.
Definition: Region.h:26
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
Definition: Types.h:74
MLIRContext * getContext() const
Return the MLIRContext in which this type was uniqued.
Definition: Types.cpp:35
An iterator over the users of an IRObject.
Definition: UseDefLists.h:344
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
Definition: Value.h:96
bool use_empty() const
Returns true if this value has no uses.
Definition: Value.h:208
constexpr Value(detail::ValueImpl *impl=nullptr)
Definition: Value.h:98
void dump() const
use_iterator use_end() const
Definition: Value.h:185
void setLoc(Location loc)
Definition: Value.cpp:33
void dropAllUses()
Drop all uses of this object from their respective owners.
Definition: Value.h:144
detail::ValueImpl * getImpl() const
Definition: Value.h:237
static Value getFromOpaquePointer(const void *pointer)
Definition: Value.h:234
bool hasNUsesOrMore(unsigned n) const
Return true if this value has n uses or more.
Definition: Value.cpp:62
detail::ValueImpl * impl
A pointer to the internal implementation of the value.
Definition: Value.h:243
void replaceUsesWithIf(Value newValue, function_ref< bool(OpOperand &)> shouldReplace)
Replace all uses of 'this' value with 'newValue' if the given callback returns true.
Definition: Value.cpp:93
void setType(Type newType)
Mutate the type of this Value to be of the specified type.
Definition: Value.h:116
void print(raw_ostream &os) const
MLIRContext * getContext() const
Utility to get the associated MLIRContext that this value is defined in.
Definition: Value.h:108
Type getType() const
Return the type of this value.
Definition: Value.h:105
void shuffleUseList(ArrayRef< unsigned > indices)
Shuffle the use list order according to the provided indices.
Definition: Value.cpp:108
use_range getUses() const
Returns a range of all uses, which is useful for iterating over all uses.
Definition: Value.h:188
bool operator==(const Value &other) const
Definition: Value.h:101
bool operator!=(const Value &other) const
Definition: Value.h:102
user_iterator user_begin() const
Definition: Value.h:216
void * getAsOpaquePointer() const
Methods for supporting PointerLikeTypeTraits.
Definition: Value.h:233
OpTy getDefiningOp() const
If this value is the result of an operation of type OpTy, return the operation that defines it.
Definition: Value.h:125
user_iterator user_end() const
Definition: Value.h:217
Block * getParentBlock()
Return the Block in which this Value is defined.
Definition: Value.cpp:48
void replaceAllUsesExcept(Value newValue, const SmallPtrSetImpl< Operation * > &exceptions)
Replace all uses of 'this' value with 'newValue', updating anything in the IR that uses 'this' to use...
Definition: Value.cpp:73
void printAsOperand(raw_ostream &os, AsmState &state) const
Print this value as if it were an operand.
ValueUseIterator< OpOperand > use_iterator
This class implements an iterator over the uses of a value.
Definition: Value.h:181
unsigned getNumUses() const
This method computes the number of uses of this Value.
Definition: Value.cpp:54
bool hasNUses(unsigned n) const
Return true if this Value has exactly n uses.
Definition: Value.cpp:58
void replaceAllUsesWith(Value newValue)
Replace all uses of 'this' value with the new value, updating anything in the IR that uses 'this' to ...
Definition: Value.h:149
user_range getUsers() const
Definition: Value.h:218
bool hasOneUse() const
Returns true if this value has exactly one use.
Definition: Value.h:197
bool isUsedOutsideOfBlock(Block *block) const
Returns true if the value is used outside of the given block.
Definition: Value.cpp:101
Location getLoc() const
Return the location of this value.
Definition: Value.cpp:26
Operation * getDefiningOp() const
If this value is the result of an operation, return the operation that defines it.
Definition: Value.cpp:20
friend ::llvm::hash_code hash_value(Value arg)
Make Value hashable.
Definition: Value.h:480
Region * getParentRegion()
Return the Region in which this Value is defined.
Definition: Value.cpp:41
use_iterator use_begin() const
Definition: Value.h:184
The internal implementation of a BlockArgument.
Definition: Value.h:283
static bool classof(const ValueImpl *value)
Definition: Value.h:285
This class provides the implementation for an operation result.
Definition: Value.h:358
unsigned getResultNumber() const
Returns the result number of this op result.
Definition: Value.h:425
OpResultImpl * getNextResultAtOffset(intptr_t offset)
Returns the next operation result at offset after this result.
Definition: Value.cpp:146
Operation * getOwner() const
Returns the parent operation of this result.
Definition: Value.cpp:117
static bool classof(const ValueImpl *value)
Definition: Value.h:362
static unsigned getMaxInlineResults()
Returns the maximum number of results that can be stored inline.
Definition: Value.h:380
This class provides the implementation for an operation result whose index cannot be represented "inl...
Definition: Value.h:404
uint64_t outOfLineIndex
The trailing result number, or the offset from the beginning of the OutOfLineOpResult array.
Definition: Value.h:421
static bool classof(const OpResultImpl *value)
Definition: Value.h:410
unsigned getResultNumber() const
Return the result number of this op result.
Definition: Value.h:415
OutOfLineOpResult(Type type, uint64_t outOfLineIndex)
Definition: Value.h:406
The base class for all derived Value classes.
Definition: Value.h:40
Kind
The enumeration represents the various different kinds of values the internal representation may take...
Definition: Value.h:45
@ OutOfLineOpResult
The next kind represents a 'out-of-line' operation result.
@ BlockArgument
The last kind represents a block argument.
ValueImpl(Type type, Kind kind)
Definition: Value.h:72
llvm::PointerIntPair< Type, 3, Kind > typeAndKind
The type of this result and the kind.
Definition: Value.h:83
LLVM_DUMP_METHOD Kind debug_getKind() const
Definition: Value.h:78
void setType(Type type)
Set the type of this value.
Definition: Value.h:66
LLVM_DUMP_METHOD Type debug_getType() const
Expose a few methods explicitly for the debugger to call for visualization.
Definition: Value.h:77
Type getType() const
Return the type of this value.
Definition: Value.h:63
Kind getKind() const
Return the kind of this value.
Definition: Value.h:69
The OpAsmOpInterface, see OpAsmInterface.td for more details.
Definition: CallGraph.h:229
Include the generated interface declarations.
std::conditional_t< std::is_same_v< Ty, mlir::Type >, mlir::Value, detail::TypedValue< Ty > > TypedValue
If Ty is mlir::Type this will select Value instead of having a wrapper around it.
Definition: Value.h:488
inline ::llvm::hash_code hash_value(Value arg)
Make Value hashable.
Definition: Value.h:480
inline ::llvm::hash_code hash_value(AffineExpr arg)
Make AffineExpr hashable.
Definition: AffineExpr.h:247
raw_ostream & operator<<(raw_ostream &os, const AliasResult &result)
Definition: AliasAnalysis.h:78
static bool isPossible(mlir::Value ty)
Arguments are taken as mlir::Value here and not as From, because when casting from an intermediate ty...
Definition: Value.h:600
static mlir::BlockArgument getEmptyKey()
Definition: Value.h:511
static mlir::BlockArgument getTombstoneKey()
Definition: Value.h:515
static mlir::OpResult getEmptyKey()
Definition: Value.h:522
static mlir::OpResult getTombstoneKey()
Definition: Value.h:526
static mlir::Value getEmptyKey()
Definition: Value.h:496
static unsigned getHashValue(mlir::Value val)
Definition: Value.h:504
static bool isEqual(mlir::Value lhs, mlir::Value rhs)
Definition: Value.h:507
static mlir::Value getTombstoneKey()
Definition: Value.h:500
static mlir::detail::TypedValue< T > getEmptyKey()
Definition: Value.h:534
static mlir::detail::TypedValue< T > getTombstoneKey()
Definition: Value.h:538
static mlir::BlockArgument getFromVoidPointer(void *pointer)
Definition: Value.h:563
static mlir::OpResult getFromVoidPointer(void *pointer)
Definition: Value.h:571
static mlir::Value getFromVoidPointer(void *pointer)
Definition: Value.h:551
static void * getAsVoidPointer(mlir::Value value)
Definition: Value.h:548
static mlir::detail::TypedValue< T > getFromVoidPointer(void *pointer)
Definition: Value.h:579
This class provides the implementation for an operation result whose index can be represented "inline...
Definition: Value.h:387
unsigned getResultNumber() const
Return the result number of this op result.
Definition: Value.h:395
static bool classof(const OpResultImpl *value)
Definition: Value.h:397
InlineOpResult(Type type, unsigned resultNo)
Definition: Value.h:389
TypedValue is a Value with a statically know type.
Definition: Value.h:434
static bool classof(Value value)
Definition: Value.h:437
Ty getType() const
Return the known Type.
Definition: Value.h:440
void setType(Ty ty)
Definition: Value.h:441