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