13 #ifndef MLIR_IR_USEDEFLISTS_H 14 #define MLIR_IR_USEDEFLISTS_H 17 #include "llvm/ADT/PointerIntPair.h" 18 #include "llvm/ADT/iterator_range.h" 37 assert(
use_empty() &&
"Cannot destroy a value that still has uses!");
50 assert((!newValue ||
this != OperandType::getUseList(newValue)) &&
51 "cannot RAUW a value with itself");
71 return firstUse && firstUse->getNextOperandUsingThisValue() ==
nullptr;
75 bool use_empty()
const {
return firstUse ==
nullptr; }
98 template <
typename DerivedT,
typename IRValueTy>
friend class IROperand;
99 OperandType *firstUse =
nullptr;
108 template <
typename OperandType>
116 assert(
this == OperandType::getUseList(value) &&
117 "value not attached to this use list");
118 for (OperandType &use : llvm::make_early_inc_range(
getUses(value)))
121 using BaseType::dropAllUses;
127 assert(
this == OperandType::getUseList(oldValue) &&
128 "value not attached to this use list");
129 assert((!newValue ||
this != OperandType::getUseList(newValue)) &&
130 "cannot RAUW a value with itself");
131 for (OperandType &use : llvm::make_early_inc_range(
getUses(oldValue)))
155 using BaseType::getUses;
156 using BaseType::hasOneUse;
157 using BaseType::use_begin;
158 using BaseType::use_empty;
159 using BaseType::use_end;
176 using BaseType::getUsers;
177 using BaseType::user_begin;
178 using BaseType::user_end;
190 template <
typename DerivedT,
typename IRValueTy>
class IROperand {
233 *
this = std::move(other);
237 other.removeFromCurrent();
239 other.value =
nullptr;
240 other.back =
nullptr;
253 DerivedT *nextUse =
nullptr;
256 DerivedT **back =
nullptr;
265 void removeFromCurrent() {
270 nextUse->back = back;
273 void insertIntoCurrent() {
274 auto *useList = DerivedT::getUseList(value);
275 back = &useList->firstUse;
276 nextUse = useList->firstUse;
278 nextUse->back = &nextUse;
279 useList->firstUse =
static_cast<DerivedT *
>(
this);
296 unsigned getOperandNumber();
300 unsigned numSuccessorOperands = 0;
319 operator bool()
const {
return impl; }
322 operator Value()
const;
341 void set(
Value value);
344 unsigned getOperandNumber();
355 template <
typename DerivedT,
typename OperandType>
357 :
public llvm::iterator_facade_base<DerivedT, std::forward_iterator_tag,
360 template <
typename T>
362 : current(other.getOperand()) {}
370 using llvm::iterator_facade_base<DerivedT, std::forward_iterator_tag,
371 OperandType>::operator++;
373 assert(current &&
"incrementing past end()!");
374 current = (OperandType *)current->getNextOperandUsingThisValue();
389 template <
typename OperandType>
401 template <
typename OperandType>
412 :
BaseT(it), filterVal(nullptr) {}
414 typename OperandType::ValueType filterVal)
415 :
BaseT(current), filterVal(filterVal) {
419 using BaseT::operator++;
427 void findNextValid() {
430 while (this->current && ((OperandType *)this->current)->
get() != filterVal)
435 typename OperandType::ValueType filterVal;
443 template <
typename UseIteratorT,
typename OperandType>
445 :
public llvm::mapped_iterator<UseIteratorT,
446 Operation *(*)(OperandType &)> {
447 static Operation *unwrap(OperandType &value) {
return value.getOwner(); }
455 :
llvm::mapped_iterator<UseIteratorT,
Operation *(*)(OperandType &)>(
Definition: InferTypeOpInterface.cpp:20
IROperand(Operation *owner)
Definition: UseDefLists.h:194
filtered_use_iterator use_end(ValueType) const
Definition: UseDefLists.h:145
FilteredValueUseIterator(OperandType *current, typename OperandType::ValueType filterVal)
Definition: UseDefLists.h:413
bool has_single_element(ContainerTy &&c)
Returns true of the given range only contains a single element.
Definition: STLExtras.h:336
Definition: PassRegistry.cpp:413
Definition: Operation.h:27
bool use_empty(ValueType value) const
Definition: UseDefLists.h:152
ValueUserIterator< use_iterator, OperandType > user_iterator
Definition: UseDefLists.h:81
Operation * getUser() const
Definition: UseDefLists.h:365
Block represents an ordered list of Operations.
Definition: Block.h:21
FilteredValueUseIterator< OperandType > & operator++()
Definition: UseDefLists.h:420
use_iterator use_end() const
Definition: UseDefLists.h:64
DerivedT * getNextOperandUsingThisValue()
Definition: UseDefLists.h:228
~IROperand()
Definition: UseDefLists.h:223
An iterator over all of the uses of an IR object.
Definition: UseDefLists.h:25
filtered_user_iterator user_end(ValueType value) const
Definition: UseDefLists.h:172
Operation * getOwner()
Return the owner of this operand.
Definition: UseDefLists.h:212
user_range getUsers() const
Returns a range of all users.
Definition: UseDefLists.h:88
Terminator operations can have Block operands to represent successors.
Definition: UseDefLists.h:288
Definition: UseDefLists.h:356
user_iterator user_begin() const
Definition: UseDefLists.h:84
An iterator over all users of a ValueBase.
Definition: UseDefLists.h:27
ValueUseIterator< OperandType > use_iterator
Definition: UseDefLists.h:60
filtered_user_iterator user_begin(ValueType value) const
Definition: UseDefLists.h:169
void replaceAllUsesWith(typename OperandType::ValueType newValue)
Definition: UseDefLists.h:49
OperandType * getFirstUse() const
Definition: UseDefLists.h:95
FilteredValueUseIterator(const ValueUseIterator< OperandType > &it)
Definition: UseDefLists.h:411
bool hasOneUse(ValueType value) const
Definition: UseDefLists.h:149
void dropAllUses()
Drop all uses of this object from their respective owners.
Definition: UseDefLists.h:41
user_iterator user_end() const
Definition: UseDefLists.h:85
This class represents a single IR object that contains a use list.
Definition: UseDefLists.h:34
use_range getUses() const
Returns a range of all uses, which is useful for iterating over all uses.
Definition: UseDefLists.h:67
void replaceAllUsesWith(ValueType oldValue, ValueType newValue)
Definition: UseDefLists.h:126
OpaqueValue(std::nullptr_t=nullptr)
Definition: UseDefLists.h:316
OperandType * getOperand() const
Definition: UseDefLists.h:366
IRObjectWithUseList()
Definition: UseDefLists.h:91
typename OpOperand ::ValueType ValueType
Definition: UseDefLists.h:112
friend class IROperand
Definition: UseDefLists.h:98
bool operator==(const ValueUseIteratorImpl &rhs) const
Definition: UseDefLists.h:378
IROperand(IROperand &&other)
Definition: UseDefLists.h:232
filtered_use_range getUses(ValueType value) const
Definition: UseDefLists.h:146
filtered_use_iterator use_begin(ValueType value) const
Definition: UseDefLists.h:142
~IRObjectWithUseList()
Definition: UseDefLists.h:36
filtered_user_range getUsers(ValueType value) const
Definition: UseDefLists.h:173
void dropAllUses(ValueType value)
Drop all uses of value from their respective owners.
Definition: UseDefLists.h:115
OperandType * current
Definition: UseDefLists.h:383
ValueUseIteratorImpl & operator++()
Definition: UseDefLists.h:372
Operation * operator->()
Definition: UseDefLists.h:457
use_iterator use_begin() const
Definition: UseDefLists.h:63
ValueUseIteratorImpl(OperandType *current=nullptr)
Definition: UseDefLists.h:363
IROperand(Operation *owner, ValueType value)
Definition: UseDefLists.h:195
Definition: UseDefLists.h:109
A reference to a value, suitable for use as an operand of an operation.
Definition: UseDefLists.h:330
ValueUseIteratorImpl(const ValueUseIteratorImpl< T, OperandType > &other)
Definition: UseDefLists.h:361
IROperand & operator=(IROperand &&other)
Definition: UseDefLists.h:235
Definition: UseDefLists.h:26
Definition: UseDefLists.h:190
ValueUserIterator(UseIteratorT it)
Initializes the result type iterator to the specified result iterator.
Definition: UseDefLists.h:454
This class provides an opaque type erased wrapper around a Value.
Definition: UseDefLists.h:312
Operation * getOwner() const
Definition: UseDefLists.h:213
bool hasOneUse() const
Returns true if this value has exactly one use.
Definition: UseDefLists.h:70
bool use_empty() const
Returns true if this value has no uses.
Definition: UseDefLists.h:75
OperandType & operator*() const
Definition: UseDefLists.h:368
void drop()
Remove this use of the operand.
Definition: UseDefLists.h:216