17ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//===-- llvm/User.h - User class definition ---------------------*- C++ -*-===// 27ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 37ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// The LLVM Compiler Infrastructure 47ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 57ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// This file is distributed under the University of Illinois Open Source 67ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// License. See LICENSE.TXT for details. 77ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 87ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//===----------------------------------------------------------------------===// 97ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// This class defines the interface that one who uses a Value must implement. 117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// Each instance of the Value class keeps track of what User's have handles 127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// to it. 137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// * Instructions are the largest class of Users. 157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// * Constants may be users of other constants (think arrays and stuff) 167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 177ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//===----------------------------------------------------------------------===// 187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 197ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#ifndef LLVM_IR_USER_H 207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#define LLVM_IR_USER_H 217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include "llvm/ADT/iterator.h" 237ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include "llvm/ADT/iterator_range.h" 242df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/IR/Use.h" 257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include "llvm/IR/Value.h" 262df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/Support/Casting.h" 272df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/Support/Compiler.h" 287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include "llvm/Support/ErrorHandling.h" 292df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include <cassert> 302df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include <cstddef> 312df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include <cstdint> 322df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include <iterator> 337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensnamespace llvm { 357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capenstemplate <typename T> class ArrayRef; 377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capenstemplate <typename T> class MutableArrayRef; 387ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// \brief Compile-time customization of User operands. 407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// 417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens/// Customizes operand-related allocators and accessors. 427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capenstemplate <class> 437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensstruct OperandTraits; 447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 457ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensclass User : public Value { 467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens template <unsigned> 477ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens friend struct HungoffOperandTraits; 482df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 497ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens virtual void anchor(); 507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 517ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE inline static void * 527ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens allocateFixedOperandUser(size_t, unsigned, unsigned); 537ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensprotected: 557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Allocate a User with an operand pointer co-allocated. 567ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 577ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// This is used for subclasses which need to allocate a variable number 587ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// of operands, ie, 'hung off uses'. 597ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void *operator new(size_t Size); 607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Allocate a User with the operands co-allocated. 627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// This is used for subclasses which have a fixed number of operands. 647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void *operator new(size_t Size, unsigned Us); 657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Allocate a User with the operands co-allocated. If DescBytes is non-zero 677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// then allocate an additional DescBytes bytes before the operands. These 687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// bytes can be accessed by calling getDescriptor. 697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// DescBytes needs to be divisible by sizeof(void *). The allocated 717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// descriptor, if any, is aligned to sizeof(void *) bytes. 727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// This is used for subclasses which have a fixed number of operands. 747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void *operator new(size_t Size, unsigned Us, unsigned DescBytes); 757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens User(Type *ty, unsigned vty, Use *, unsigned NumOps) 777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens : Value(ty, vty) { 787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(NumOps < (1u << NumUserOperandsBits) && "Too many operands"); 797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens NumUserOperands = NumOps; 807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // If we have hung off uses, then the operand list should initially be 817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // null. 827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert((!HasHungOffUses || !getOperandList()) && 837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens "Error in initializing hung off uses for User"); 847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 867ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Allocate the array of Uses, followed by a pointer 877ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// (with bottom bit set) to the User. 887ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param IsPhi identifies callers which are phi nodes and which need 897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// N BasicBlock* allocated along with N 907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void allocHungoffUses(unsigned N, bool IsPhi = false); 917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Grow the number of hung off uses. Note that allocHungoffUses 937ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// should be called if there are no uses. 947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void growHungoffUses(unsigned N, bool IsPhi = false); 957ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 967ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capenspublic: 972df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens User(const User &) = delete; 982df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens ~User() override = default; 992df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Free memory allocated for User and Use objects. 1017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void operator delete(void *Usr); 1027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Placement delete - required by std, but never called. 1037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void operator delete(void*, unsigned) { 1047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens llvm_unreachable("Constructor throws?"); 1057ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1067ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Placement delete - required by std, but never called. 1077ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void operator delete(void*, unsigned, bool) { 1087ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens llvm_unreachable("Constructor throws?"); 1097ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1102df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensprotected: 1127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens template <int Idx, typename U> static Use &OpFrom(const U *that) { 1137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return Idx < 0 1147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens ? OperandTraits<U>::op_end(const_cast<U*>(that))[Idx] 1157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens : OperandTraits<U>::op_begin(const_cast<U*>(that))[Idx]; 1167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1177ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens template <int Idx> Use &Op() { 1187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return OpFrom<Idx>(this); 1197ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens template <int Idx> const Use &Op() const { 1217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return OpFrom<Idx>(this); 1227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1232df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1247ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensprivate: 1257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Use *&getHungOffOperands() { return *(reinterpret_cast<Use **>(this) - 1); } 1267ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Use *getIntrusiveOperands() { 1287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return reinterpret_cast<Use *>(this) - NumUserOperands; 1297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1317ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void setOperandList(Use *NewList) { 1327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(HasHungOffUses && 1337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens "Setting operand list only required for hung off uses"); 1347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens getHungOffOperands() = NewList; 1357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1362df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capenspublic: 1387ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Use *getOperandList() { 1397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return HasHungOffUses ? getHungOffOperands() : getIntrusiveOperands(); 1407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const Use *getOperandList() const { 1427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return const_cast<User *>(this)->getOperandList(); 1437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1442df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1457ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Value *getOperand(unsigned i) const { 1467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(i < NumUserOperands && "getOperand() out of range!"); 1477ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return getOperandList()[i]; 1487ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1492df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void setOperand(unsigned i, Value *Val) { 1517ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(i < NumUserOperands && "setOperand() out of range!"); 1527ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert((!isa<Constant>((const Value*)this) || 1537ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens isa<GlobalValue>((const Value*)this)) && 1547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens "Cannot mutate a constant with setOperand!"); 1557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens getOperandList()[i] = Val; 1567ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1572df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1587ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const Use &getOperandUse(unsigned i) const { 1597ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(i < NumUserOperands && "getOperandUse() out of range!"); 1607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return getOperandList()[i]; 1617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Use &getOperandUse(unsigned i) { 1637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(i < NumUserOperands && "getOperandUse() out of range!"); 1647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return getOperandList()[i]; 1657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens unsigned getNumOperands() const { return NumUserOperands; } 1687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Returns the descriptor co-allocated with this User instance. 1707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens ArrayRef<const uint8_t> getDescriptor() const; 1717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Returns the descriptor co-allocated with this User instance. 1737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens MutableArrayRef<uint8_t> getDescriptor(); 1747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Set the number of operands on a GlobalVariable. 1767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 1777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// GlobalVariable always allocates space for a single operands, but 1787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// doesn't always use it. 1797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 1807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// FIXME: As that the number of operands is used to find the start of 1817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// the allocated memory in operator delete, we need to always think we have 1827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 1 operand before delete. 1837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void setGlobalVariableNumOperands(unsigned NumOps) { 1847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(NumOps <= 1 && "GlobalVariable can only have 0 or 1 operands"); 1857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens NumUserOperands = NumOps; 1867ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1877ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1887ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Subclasses with hung off uses need to manage the operand count 1897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// themselves. In these instances, the operand count isn't used to find the 1907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// OperandList, so there's no issue in having the operand count change. 1917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void setNumHungOffUseOperands(unsigned NumOps) { 1927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(HasHungOffUses && "Must have hung off uses to use this method"); 1937ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(NumOps < (1u << NumUserOperandsBits) && "Too many operands"); 1947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens NumUserOperands = NumOps; 1957ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1967ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1977ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // --------------------------------------------------------------------------- 1987ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // Operand Iterator interface... 1997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // 2007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef Use* op_iterator; 2017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef const Use* const_op_iterator; 2027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef iterator_range<op_iterator> op_range; 2037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef iterator_range<const_op_iterator> const_op_range; 2047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2057ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens op_iterator op_begin() { return getOperandList(); } 2067ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const_op_iterator op_begin() const { return getOperandList(); } 2077ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens op_iterator op_end() { 2087ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return getOperandList() + NumUserOperands; 2097ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const_op_iterator op_end() const { 2117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return getOperandList() + NumUserOperands; 2127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens op_range operands() { 2147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return op_range(op_begin(), op_end()); 2157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const_op_range operands() const { 2177ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return const_op_range(op_begin(), op_end()); 2187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2197ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Iterator for directly iterating over the operand Values. 2217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens struct value_op_iterator 2227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens : iterator_adaptor_base<value_op_iterator, op_iterator, 2237ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens std::random_access_iterator_tag, Value *, 2247ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens ptrdiff_t, Value *, Value *> { 2257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens explicit value_op_iterator(Use *U = nullptr) : iterator_adaptor_base(U) {} 2267ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Value *operator*() const { return *I; } 2287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Value *operator->() const { return operator*(); } 2297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens }; 2307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2317ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens value_op_iterator value_op_begin() { 2327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return value_op_iterator(op_begin()); 2337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens value_op_iterator value_op_end() { 2357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return value_op_iterator(op_end()); 2367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens iterator_range<value_op_iterator> operand_values() { 2387ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return make_range(value_op_begin(), value_op_end()); 2397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Drop all references to operands. 2427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// This function is in charge of "letting go" of all objects that this User 2447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// refers to. This allows one to 'delete' a whole class at a time, even 2457ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// though there may be circular references... First all references are 2467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// dropped, and all use counts go to zero. Then everything is deleted for 2477ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// real. Note that no operations are valid on an object that has "dropped 2487ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// all references", except operator delete. 2497ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void dropAllReferences() { 2507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens for (Use &U : operands()) 2517ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens U.set(nullptr); 2527ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2537ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Replace uses of one Value with another. 2557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2567ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Replaces all references to the "From" definition with references to the 2577ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// "To" definition. 2587ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void replaceUsesOfWith(Value *From, Value *To); 2597ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // Methods for support type inquiry through isa, cast, and dyn_cast: 2617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens static inline bool classof(const Value *V) { 2627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return isa<Instruction>(V) || isa<Constant>(V); 2637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens}; 2657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// Either Use objects, or a Use pointer can be prepended to User. 2662df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensstatic_assert(alignof(Use) >= alignof(User), 2677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens "Alignment is insufficient after objects prepended to User"); 2682df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensstatic_assert(alignof(Use *) >= alignof(User), 2697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens "Alignment is insufficient after objects prepended to User"); 2707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capenstemplate<> struct simplify_type<User::op_iterator> { 2727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef Value* SimpleType; 2737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens static SimpleType getSimplifiedValue(User::op_iterator &Val) { 2747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return Val->get(); 2757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens}; 2777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capenstemplate<> struct simplify_type<User::const_op_iterator> { 2787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef /*const*/ Value* SimpleType; 2797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens static SimpleType getSimplifiedValue(User::const_op_iterator &Val) { 2807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return Val->get(); 2817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens}; 2837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2842df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens} // end namespace llvm 2857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2862df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#endif // LLVM_IR_USER_H 287