//===- llvm/Value.h - Definition of the Value class -------------*- C++ -*-===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
//
 
// This file declares the Value class.
 
//
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_IR_VALUE_H
 
#define LLVM_IR_VALUE_H
 
 
 
#include "llvm-c/Types.h"
 
#include "llvm/ADT/STLExtras.h"
 
#include "llvm/ADT/StringRef.h"
 
#include "llvm/ADT/iterator_range.h"
 
#include "llvm/IR/Use.h"
 
#include "llvm/Support/Alignment.h"
 
#include "llvm/Support/CBindingWrapping.h"
 
#include "llvm/Support/Casting.h"
 
#include <cassert>
 
#include <iterator>
 
#include <memory>
 
 
 
namespace llvm {
 
 
 
class APInt;
 
class Argument;
 
class BasicBlock;
 
class Constant;
 
class ConstantData;
 
class ConstantAggregate;
 
class DataLayout;
 
class Function;
 
class GlobalAlias;
 
class GlobalIFunc;
 
class GlobalObject;
 
class GlobalValue;
 
class GlobalVariable;
 
class InlineAsm;
 
class Instruction;
 
class LLVMContext;
 
class MDNode;
 
class Module;
 
class ModuleSlotTracker;
 
class raw_ostream;
 
template<typename ValueTy> class StringMapEntry;
 
class Twine;
 
class Type;
 
class User;
 
 
 
using ValueName = StringMapEntry<Value *>;
 
 
 
//===----------------------------------------------------------------------===//
 
//                                 Value Class
 
//===----------------------------------------------------------------------===//
 
 
 
/// LLVM Value Representation
 
///
 
/// This is a very important LLVM class. It is the base class of all values
 
/// computed by a program that may be used as operands to other values. Value is
 
/// the super class of other important classes such as Instruction and Function.
 
/// All Values have a Type. Type is not a subclass of Value. Some values can
 
/// have a name and they belong to some Module.  Setting the name on the Value
 
/// automatically updates the module's symbol table.
 
///
 
/// Every value has a "use list" that keeps track of which other Values are
 
/// using this Value.  A Value can also have an arbitrary number of ValueHandle
 
/// objects that watch it and listen to RAUW and Destroy events.  See
 
/// llvm/IR/ValueHandle.h for details.
 
class Value {
 
  Type *VTy;
 
  Use *UseList;
 
 
 
  friend class ValueAsMetadata; // Allow access to IsUsedByMD.
 
  friend class ValueHandleBase;
 
 
 
  const unsigned char SubclassID;   // Subclass identifier (for isa/dyn_cast)
 
  unsigned char HasValueHandle : 1; // Has a ValueHandle pointing to this?
 
 
 
protected:
 
  /// Hold subclass data that can be dropped.
 
  ///
 
  /// This member is similar to SubclassData, however it is for holding
 
  /// information which may be used to aid optimization, but which may be
 
  /// cleared to zero without affecting conservative interpretation.
 
  unsigned char SubclassOptionalData : 7;
 
 
 
private:
 
  /// Hold arbitrary subclass data.
 
  ///
 
  /// This member is defined by this class, but is not used for anything.
 
  /// Subclasses can use it to hold whatever state they find useful.  This
 
  /// field is initialized to zero by the ctor.
 
  unsigned short SubclassData;
 
 
 
protected:
 
  /// The number of operands in the subclass.
 
  ///
 
  /// This member is defined by this class, but not used for anything.
 
  /// Subclasses can use it to store their number of operands, if they have
 
  /// any.
 
  ///
 
  /// This is stored here to save space in User on 64-bit hosts.  Since most
 
  /// instances of Value have operands, 32-bit hosts aren't significantly
 
  /// affected.
 
  ///
 
  /// Note, this should *NOT* be used directly by any class other than User.
 
  /// User uses this value to find the Use list.
 
  enum : unsigned { NumUserOperandsBits = 27 };
 
  unsigned NumUserOperands : NumUserOperandsBits;
 
 
 
  // Use the same type as the bitfield above so that MSVC will pack them.
 
  unsigned IsUsedByMD : 1;
 
  unsigned HasName : 1;
 
  unsigned HasMetadata : 1; // Has metadata attached to this?
 
  unsigned HasHungOffUses : 1;
 
  unsigned HasDescriptor : 1;
 
 
 
private:
 
  template <typename UseT> // UseT == 'Use' or 'const Use'
 
  class use_iterator_impl {
 
    friend class Value;
 
 
 
    UseT *U;
 
 
 
    explicit use_iterator_impl(UseT *u) : U(u) {}
 
 
 
  public:
 
    using iterator_category = std::forward_iterator_tag;
 
    using value_type = UseT *;
 
    using difference_type = std::ptrdiff_t;
 
    using pointer = value_type *;
 
    using reference = value_type &;
 
 
 
    use_iterator_impl() : U() {}
 
 
 
    bool operator==(const use_iterator_impl &x) const { return U == x.U; }
 
    bool operator!=(const use_iterator_impl &x) const { return !operator==(x); }
 
 
 
    use_iterator_impl &operator++() { // Preincrement
 
      assert(U && "Cannot increment end iterator!");
 
      U = U->getNext();
 
      return *this;
 
    }
 
 
 
    use_iterator_impl operator++(int) { // Postincrement
 
      auto tmp = *this;
 
      ++*this;
 
      return tmp;
 
    }
 
 
 
    UseT &operator*() const {
 
      assert(U && "Cannot dereference end iterator!");
 
      return *U;
 
    }
 
 
 
    UseT *operator->() const { return &operator*(); }
 
 
 
    operator use_iterator_impl<const UseT>() const {
 
      return use_iterator_impl<const UseT>(U);
 
    }
 
  };
 
 
 
  template <typename UserTy> // UserTy == 'User' or 'const User'
 
  class user_iterator_impl {
 
    use_iterator_impl<Use> UI;
 
    explicit user_iterator_impl(Use *U) : UI(U) {}
 
    friend class Value;
 
 
 
  public:
 
    using iterator_category = std::forward_iterator_tag;
 
    using value_type = UserTy *;
 
    using difference_type = std::ptrdiff_t;
 
    using pointer = value_type *;
 
    using reference = value_type &;
 
 
 
    user_iterator_impl() = default;
 
 
 
    bool operator==(const user_iterator_impl &x) const { return UI == x.UI; }
 
    bool operator!=(const user_iterator_impl &x) const { return !operator==(x); }
 
 
 
    /// Returns true if this iterator is equal to user_end() on the value.
 
    bool atEnd() const { return *this == user_iterator_impl(); }
 
 
 
    user_iterator_impl &operator++() { // Preincrement
 
      ++UI;
 
      return *this;
 
    }
 
 
 
    user_iterator_impl operator++(int) { // Postincrement
 
      auto tmp = *this;
 
      ++*this;
 
      return tmp;
 
    }
 
 
 
    // Retrieve a pointer to the current User.
 
    UserTy *operator*() const {
 
      return UI->getUser();
 
    }
 
 
 
    UserTy *operator->() const { return operator*(); }
 
 
 
    operator user_iterator_impl<const UserTy>() const {
 
      return user_iterator_impl<const UserTy>(*UI);
 
    }
 
 
 
    Use &getUse() const { return *UI; }
 
  };
 
 
 
protected:
 
  Value(Type *Ty, unsigned scid);
 
 
 
  /// Value's destructor should be virtual by design, but that would require
 
  /// that Value and all of its subclasses have a vtable that effectively
 
  /// duplicates the information in the value ID. As a size optimization, the
 
  /// destructor has been protected, and the caller should manually call
 
  /// deleteValue.
 
  ~Value(); // Use deleteValue() to delete a generic Value.
 
 
 
public:
 
  Value(const Value &) = delete;
 
  Value &operator=(const Value &) = delete;
 
 
 
  /// Delete a pointer to a generic Value.
 
  void deleteValue();
 
 
 
  /// Support for debugging, callable in GDB: V->dump()
 
  void dump() const;
 
 
 
  /// Implement operator<< on Value.
 
  /// @{
 
  void print(raw_ostream &O, bool IsForDebug = false) const;
 
  void print(raw_ostream &O, ModuleSlotTracker &MST,
 
             bool IsForDebug = false) const;
 
  /// @}
 
 
 
  /// Print the name of this Value out to the specified raw_ostream.
 
  ///
 
  /// This is useful when you just want to print 'int %reg126', not the
 
  /// instruction that generated it. If you specify a Module for context, then
 
  /// even constanst get pretty-printed; for example, the type of a null
 
  /// pointer is printed symbolically.
 
  /// @{
 
  void printAsOperand(raw_ostream &O, bool PrintType = true,
 
                      const Module *M = nullptr) const;
 
  void printAsOperand(raw_ostream &O, bool PrintType,
 
                      ModuleSlotTracker &MST) const;
 
  /// @}
 
 
 
  /// All values are typed, get the type of this value.
 
  Type *getType() const { return VTy; }
 
 
 
  /// All values hold a context through their type.
 
  LLVMContext &getContext() const;
 
 
 
  // All values can potentially be named.
 
  bool hasName() const { return HasName; }
 
  ValueName *getValueName() const;
 
  void setValueName(ValueName *VN);
 
 
 
private:
 
  void destroyValueName();
 
  enum class ReplaceMetadataUses { No, Yes };
 
  void doRAUW(Value *New, ReplaceMetadataUses);
 
  void setNameImpl(const Twine &Name);
 
 
 
public:
 
  /// Return a constant reference to the value's name.
 
  ///
 
  /// This guaranteed to return the same reference as long as the value is not
 
  /// modified.  If the value has a name, this does a hashtable lookup, so it's
 
  /// not free.
 
  StringRef getName() const;
 
 
 
  /// Change the name of the value.
 
  ///
 
  /// Choose a new unique name if the provided name is taken.
 
  ///
 
  /// \param Name The new name; or "" if the value's name should be removed.
 
  void setName(const Twine &Name);
 
 
 
  /// Transfer the name from V to this value.
 
  ///
 
  /// After taking V's name, sets V's name to empty.
 
  ///
 
  /// \note It is an error to call V->takeName(V).
 
  void takeName(Value *V);
 
 
 
#ifndef NDEBUG
 
  std::string getNameOrAsOperand() const;
 
#endif
 
 
 
  /// Change all uses of this to point to a new Value.
 
  ///
 
  /// Go through the uses list for this definition and make each use point to
 
  /// "V" instead of "this".  After this completes, 'this's use list is
 
  /// guaranteed to be empty.
 
  void replaceAllUsesWith(Value *V);
 
 
 
  /// Change non-metadata uses of this to point to a new Value.
 
  ///
 
  /// Go through the uses list for this definition and make each use point to
 
  /// "V" instead of "this". This function skips metadata entries in the list.
 
  void replaceNonMetadataUsesWith(Value *V);
 
 
 
  /// Go through the uses list for this definition and make each use point
 
  /// to "V" if the callback ShouldReplace returns true for the given Use.
 
  /// Unlike replaceAllUsesWith() this function does not support basic block
 
  /// values.
 
  void replaceUsesWithIf(Value *New,
 
                         llvm::function_ref<bool(Use &U)> ShouldReplace);
 
 
 
  /// replaceUsesOutsideBlock - Go through the uses list for this definition and
 
  /// make each use point to "V" instead of "this" when the use is outside the
 
  /// block. 'This's use list is expected to have at least one element.
 
  /// Unlike replaceAllUsesWith() this function does not support basic block
 
  /// values.
 
  void replaceUsesOutsideBlock(Value *V, BasicBlock *BB);
 
 
 
  //----------------------------------------------------------------------
 
  // Methods for handling the chain of uses of this Value.
 
  //
 
  // Materializing a function can introduce new uses, so these methods come in
 
  // two variants:
 
  // The methods that start with materialized_ check the uses that are
 
  // currently known given which functions are materialized. Be very careful
 
  // when using them since you might not get all uses.
 
  // The methods that don't start with materialized_ assert that modules is
 
  // fully materialized.
 
  void assertModuleIsMaterializedImpl() const;
 
  // This indirection exists so we can keep assertModuleIsMaterializedImpl()
 
  // around in release builds of Value.cpp to be linked with other code built
 
  // in debug mode. But this avoids calling it in any of the release built code.
 
  void assertModuleIsMaterialized() const {
 
#ifndef NDEBUG
 
    assertModuleIsMaterializedImpl();
 
#endif
 
  }
 
 
 
  bool use_empty() const {
 
    assertModuleIsMaterialized();
 
    return UseList == nullptr;
 
  }
 
 
 
  bool materialized_use_empty() const {
 
    return UseList == nullptr;
 
  }
 
 
 
  using use_iterator = use_iterator_impl<Use>;
 
  using const_use_iterator = use_iterator_impl<const Use>;
 
 
 
  use_iterator materialized_use_begin() { return use_iterator(UseList); }
 
  const_use_iterator materialized_use_begin() const {
 
    return const_use_iterator(UseList);
 
  }
 
  use_iterator use_begin() {
 
    assertModuleIsMaterialized();
 
    return materialized_use_begin();
 
  }
 
  const_use_iterator use_begin() const {
 
    assertModuleIsMaterialized();
 
    return materialized_use_begin();
 
  }
 
  use_iterator use_end() { return use_iterator(); }
 
  const_use_iterator use_end() const { return const_use_iterator(); }
 
  iterator_range<use_iterator> materialized_uses() {
 
    return make_range(materialized_use_begin(), use_end());
 
  }
 
  iterator_range<const_use_iterator> materialized_uses() const {
 
    return make_range(materialized_use_begin(), use_end());
 
  }
 
  iterator_range<use_iterator> uses() {
 
    assertModuleIsMaterialized();
 
    return materialized_uses();
 
  }
 
  iterator_range<const_use_iterator> uses() const {
 
    assertModuleIsMaterialized();
 
    return materialized_uses();
 
  }
 
 
 
  bool user_empty() const {
 
    assertModuleIsMaterialized();
 
    return UseList == nullptr;
 
  }
 
 
 
  using user_iterator = user_iterator_impl<User>;
 
  using const_user_iterator = user_iterator_impl<const User>;
 
 
 
  user_iterator materialized_user_begin() { return user_iterator(UseList); }
 
  const_user_iterator materialized_user_begin() const {
 
    return const_user_iterator(UseList);
 
  }
 
  user_iterator user_begin() {
 
    assertModuleIsMaterialized();
 
    return materialized_user_begin();
 
  }
 
  const_user_iterator user_begin() const {
 
    assertModuleIsMaterialized();
 
    return materialized_user_begin();
 
  }
 
  user_iterator user_end() { return user_iterator(); }
 
  const_user_iterator user_end() const { return const_user_iterator(); }
 
  User *user_back() {
 
    assertModuleIsMaterialized();
 
    return *materialized_user_begin();
 
  }
 
  const User *user_back() const {
 
    assertModuleIsMaterialized();
 
    return *materialized_user_begin();
 
  }
 
  iterator_range<user_iterator> materialized_users() {
 
    return make_range(materialized_user_begin(), user_end());
 
  }
 
  iterator_range<const_user_iterator> materialized_users() const {
 
    return make_range(materialized_user_begin(), user_end());
 
  }
 
  iterator_range<user_iterator> users() {
 
    assertModuleIsMaterialized();
 
    return materialized_users();
 
  }
 
  iterator_range<const_user_iterator> users() const {
 
    assertModuleIsMaterialized();
 
    return materialized_users();
 
  }
 
 
 
  /// Return true if there is exactly one use of this value.
 
  ///
 
  /// This is specialized because it is a common request and does not require
 
  /// traversing the whole use list.
 
  bool hasOneUse() const { return hasSingleElement(uses()); }
 
 
 
  /// Return true if this Value has exactly N uses.
 
  bool hasNUses(unsigned N) const;
 
 
 
  /// Return true if this value has N uses or more.
 
  ///
 
  /// This is logically equivalent to getNumUses() >= N.
 
  bool hasNUsesOrMore(unsigned N) const;
 
 
 
  /// Return true if there is exactly one user of this value.
 
  ///
 
  /// Note that this is not the same as "has one use". If a value has one use,
 
  /// then there certainly is a single user. But if value has several uses,
 
  /// it is possible that all uses are in a single user, or not.
 
  ///
 
  /// This check is potentially costly, since it requires traversing,
 
  /// in the worst case, the whole use list of a value.
 
  bool hasOneUser() const;
 
 
 
  /// Return true if there is exactly one use of this value that cannot be
 
  /// dropped.
 
  Use *getSingleUndroppableUse();
 
  const Use *getSingleUndroppableUse() const {
 
    return const_cast<Value *>(this)->getSingleUndroppableUse();
 
  }
 
 
 
  /// Return true if there is exactly one unique user of this value that cannot be
 
  /// dropped (that user can have multiple uses of this value).
 
  User *getUniqueUndroppableUser();
 
  const User *getUniqueUndroppableUser() const {
 
    return const_cast<Value *>(this)->getUniqueUndroppableUser();
 
  }
 
 
 
  /// Return true if there this value.
 
  ///
 
  /// This is specialized because it is a common request and does not require
 
  /// traversing the whole use list.
 
  bool hasNUndroppableUses(unsigned N) const;
 
 
 
  /// Return true if this value has N uses or more.
 
  ///
 
  /// This is logically equivalent to getNumUses() >= N.
 
  bool hasNUndroppableUsesOrMore(unsigned N) const;
 
 
 
  /// Remove every uses that can safely be removed.
 
  ///
 
  /// This will remove for example uses in llvm.assume.
 
  /// This should be used when performing want to perform a tranformation but
 
  /// some Droppable uses pervent it.
 
  /// This function optionally takes a filter to only remove some droppable
 
  /// uses.
 
  void dropDroppableUses(llvm::function_ref<bool(const Use *)> ShouldDrop =
 
                             [](const Use *) { return true; });
 
 
 
  /// Remove every use of this value in \p User that can safely be removed.
 
  void dropDroppableUsesIn(User &Usr);
 
 
 
  /// Remove the droppable use \p U.
 
  static void dropDroppableUse(Use &U);
 
 
 
  /// Check if this value is used in the specified basic block.
 
  bool isUsedInBasicBlock(const BasicBlock *BB) const;
 
 
 
  /// This method computes the number of uses of this Value.
 
  ///
 
  /// This is a linear time operation.  Use hasOneUse, hasNUses, or
 
  /// hasNUsesOrMore to check for specific values.
 
  unsigned getNumUses() const;
 
 
 
  /// This method should only be used by the Use class.
 
  void addUse(Use &U) { U.addToList(&UseList); }
 
 
 
  /// Concrete subclass of this.
 
  ///
 
  /// An enumeration for keeping track of the concrete subclass of Value that
 
  /// is actually instantiated. Values of this enumeration are kept in the
 
  /// Value classes SubclassID field. They are used for concrete type
 
  /// identification.
 
  enum ValueTy {
 
#define HANDLE_VALUE(Name) Name##Val,
 
#include "llvm/IR/Value.def"
 
 
 
    // Markers:
 
#define HANDLE_CONSTANT_MARKER(Marker, Constant) Marker = Constant##Val,
 
#include "llvm/IR/Value.def"
 
  };
 
 
 
  /// Return an ID for the concrete type of this object.
 
  ///
 
  /// This is used to implement the classof checks.  This should not be used
 
  /// for any other purpose, as the values may change as LLVM evolves.  Also,
 
  /// note that for instructions, the Instruction's opcode is added to
 
  /// InstructionVal. So this means three things:
 
  /// # there is no value with code InstructionVal (no opcode==0).
 
  /// # there are more possible values for the value type than in ValueTy enum.
 
  /// # the InstructionVal enumerator must be the highest valued enumerator in
 
  ///   the ValueTy enum.
 
  unsigned getValueID() const {
 
    return SubclassID;
 
  }
 
 
 
  /// Return the raw optional flags value contained in this value.
 
  ///
 
  /// This should only be used when testing two Values for equivalence.
 
  unsigned getRawSubclassOptionalData() const {
 
    return SubclassOptionalData;
 
  }
 
 
 
  /// Clear the optional flags contained in this value.
 
  void clearSubclassOptionalData() {
 
    SubclassOptionalData = 0;
 
  }
 
 
 
  /// Check the optional flags for equality.
 
  bool hasSameSubclassOptionalData(const Value *V) const {
 
    return SubclassOptionalData == V->SubclassOptionalData;
 
  }
 
 
 
  /// Return true if there is a value handle associated with this value.
 
  bool hasValueHandle() const { return HasValueHandle; }
 
 
 
  /// Return true if there is metadata referencing this value.
 
  bool isUsedByMetadata() const { return IsUsedByMD; }
 
 
 
protected:
 
  /// Get the current metadata attachments for the given kind, if any.
 
  ///
 
  /// These functions require that the value have at most a single attachment
 
  /// of the given kind, and return \c nullptr if such an attachment is missing.
 
  /// @{
 
  MDNode *getMetadata(unsigned KindID) const;
 
  MDNode *getMetadata(StringRef Kind) const;
 
  /// @}
 
 
 
  /// Appends all attachments with the given ID to \c MDs in insertion order.
 
  /// If the Value has no attachments with the given ID, or if ID is invalid,
 
  /// leaves MDs unchanged.
 
  /// @{
 
  void getMetadata(unsigned KindID, SmallVectorImpl<MDNode *> &MDs) const;
 
  void getMetadata(StringRef Kind, SmallVectorImpl<MDNode *> &MDs) const;
 
  /// @}
 
 
 
  /// Appends all metadata attached to this value to \c MDs, sorting by
 
  /// KindID. The first element of each pair returned is the KindID, the second
 
  /// element is the metadata value. Attachments with the same ID appear in
 
  /// insertion order.
 
  void
 
  getAllMetadata(SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const;
 
 
 
  /// Return true if this value has any metadata attached to it.
 
  bool hasMetadata() const { return (bool)HasMetadata; }
 
 
 
  /// Return true if this value has the given type of metadata attached.
 
  /// @{
 
  bool hasMetadata(unsigned KindID) const {
 
    return getMetadata(KindID) != nullptr;
 
  }
 
  bool hasMetadata(StringRef Kind) const {
 
    return getMetadata(Kind) != nullptr;
 
  }
 
  /// @}
 
 
 
  /// Set a particular kind of metadata attachment.
 
  ///
 
  /// Sets the given attachment to \c MD, erasing it if \c MD is \c nullptr or
 
  /// replacing it if it already exists.
 
  /// @{
 
  void setMetadata(unsigned KindID, MDNode *Node);
 
  void setMetadata(StringRef Kind, MDNode *Node);
 
  /// @}
 
 
 
  /// Add a metadata attachment.
 
  /// @{
 
  void addMetadata(unsigned KindID, MDNode &MD);
 
  void addMetadata(StringRef Kind, MDNode &MD);
 
  /// @}
 
 
 
  /// Erase all metadata attachments with the given kind.
 
  ///
 
  /// \returns true if any metadata was removed.
 
  bool eraseMetadata(unsigned KindID);
 
 
 
  /// Erase all metadata attached to this Value.
 
  void clearMetadata();
 
 
 
public:
 
  /// Return true if this value is a swifterror value.
 
  ///
 
  /// swifterror values can be either a function argument or an alloca with a
 
  /// swifterror attribute.
 
  bool isSwiftError() const;
 
 
 
  /// Strip off pointer casts, all-zero GEPs and address space casts.
 
  ///
 
  /// Returns the original uncasted value.  If this is called on a non-pointer
 
  /// value, it returns 'this'.
 
  const Value *stripPointerCasts() const;
 
  Value *stripPointerCasts() {
 
    return const_cast<Value *>(
 
        static_cast<const Value *>(this)->stripPointerCasts());
 
  }
 
 
 
  /// Strip off pointer casts, all-zero GEPs, address space casts, and aliases.
 
  ///
 
  /// Returns the original uncasted value.  If this is called on a non-pointer
 
  /// value, it returns 'this'.
 
  const Value *stripPointerCastsAndAliases() const;
 
  Value *stripPointerCastsAndAliases() {
 
    return const_cast<Value *>(
 
        static_cast<const Value *>(this)->stripPointerCastsAndAliases());
 
  }
 
 
 
  /// Strip off pointer casts, all-zero GEPs and address space casts
 
  /// but ensures the representation of the result stays the same.
 
  ///
 
  /// Returns the original uncasted value with the same representation. If this
 
  /// is called on a non-pointer value, it returns 'this'.
 
  const Value *stripPointerCastsSameRepresentation() const;
 
  Value *stripPointerCastsSameRepresentation() {
 
    return const_cast<Value *>(static_cast<const Value *>(this)
 
                                   ->stripPointerCastsSameRepresentation());
 
  }
 
 
 
  /// Strip off pointer casts, all-zero GEPs, single-argument phi nodes and
 
  /// invariant group info.
 
  ///
 
  /// Returns the original uncasted value.  If this is called on a non-pointer
 
  /// value, it returns 'this'. This function should be used only in
 
  /// Alias analysis.
 
  const Value *stripPointerCastsForAliasAnalysis() const;
 
  Value *stripPointerCastsForAliasAnalysis() {
 
    return const_cast<Value *>(static_cast<const Value *>(this)
 
                                   ->stripPointerCastsForAliasAnalysis());
 
  }
 
 
 
  /// Strip off pointer casts and all-constant inbounds GEPs.
 
  ///
 
  /// Returns the original pointer value.  If this is called on a non-pointer
 
  /// value, it returns 'this'.
 
  const Value *stripInBoundsConstantOffsets() const;
 
  Value *stripInBoundsConstantOffsets() {
 
    return const_cast<Value *>(
 
              static_cast<const Value *>(this)->stripInBoundsConstantOffsets());
 
  }
 
 
 
  /// Accumulate the constant offset this value has compared to a base pointer.
 
  /// Only 'getelementptr' instructions (GEPs) are accumulated but other
 
  /// instructions, e.g., casts, are stripped away as well.
 
  /// The accumulated constant offset is added to \p Offset and the base
 
  /// pointer is returned.
 
  ///
 
  /// The APInt \p Offset has to have a bit-width equal to the IntPtr type for
 
  /// the address space of 'this' pointer value, e.g., use
 
  /// DataLayout::getIndexTypeSizeInBits(Ty).
 
  ///
 
  /// If \p AllowNonInbounds is true, offsets in GEPs are stripped and
 
  /// accumulated even if the GEP is not "inbounds".
 
  ///
 
  /// If \p AllowInvariantGroup is true then this method also looks through
 
  /// strip.invariant.group and launder.invariant.group intrinsics.
 
  ///
 
  /// If \p ExternalAnalysis is provided it will be used to calculate a offset
 
  /// when a operand of GEP is not constant.
 
  /// For example, for a value \p ExternalAnalysis might try to calculate a
 
  /// lower bound. If \p ExternalAnalysis is successful, it should return true.
 
  ///
 
  /// If this is called on a non-pointer value, it returns 'this' and the
 
  /// \p Offset is not modified.
 
  ///
 
  /// Note that this function will never return a nullptr. It will also never
 
  /// manipulate the \p Offset in a way that would not match the difference
 
  /// between the underlying value and the returned one. Thus, if no constant
 
  /// offset was found, the returned value is the underlying one and \p Offset
 
  /// is unchanged.
 
  const Value *stripAndAccumulateConstantOffsets(
 
      const DataLayout &DL, APInt &Offset, bool AllowNonInbounds,
 
      bool AllowInvariantGroup = false,
 
      function_ref<bool(Value &Value, APInt &Offset)> ExternalAnalysis =
 
          nullptr) const;
 
  Value *stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset,
 
                                           bool AllowNonInbounds,
 
                                           bool AllowInvariantGroup = false) {
 
    return const_cast<Value *>(
 
        static_cast<const Value *>(this)->stripAndAccumulateConstantOffsets(
 
            DL, Offset, AllowNonInbounds, AllowInvariantGroup));
 
  }
 
 
 
  /// This is a wrapper around stripAndAccumulateConstantOffsets with the
 
  /// in-bounds requirement set to false.
 
  const Value *stripAndAccumulateInBoundsConstantOffsets(const DataLayout &DL,
 
                                                         APInt &Offset) const {
 
    return stripAndAccumulateConstantOffsets(DL, Offset,
 
                                             /* AllowNonInbounds */ false);
 
  }
 
  Value *stripAndAccumulateInBoundsConstantOffsets(const DataLayout &DL,
 
                                                   APInt &Offset) {
 
    return stripAndAccumulateConstantOffsets(DL, Offset,
 
                                             /* AllowNonInbounds */ false);
 
  }
 
 
 
  /// Strip off pointer casts and inbounds GEPs.
 
  ///
 
  /// Returns the original pointer value.  If this is called on a non-pointer
 
  /// value, it returns 'this'.
 
  const Value *stripInBoundsOffsets(function_ref<void(const Value *)> Func =
 
                                        [](const Value *) {}) const;
 
  inline Value *stripInBoundsOffsets(function_ref<void(const Value *)> Func =
 
                                  [](const Value *) {}) {
 
    return const_cast<Value *>(
 
        static_cast<const Value *>(this)->stripInBoundsOffsets(Func));
 
  }
 
 
 
  /// Return true if the memory object referred to by V can by freed in the
 
  /// scope for which the SSA value defining the allocation is statically
 
  /// defined.  E.g.  deallocation after the static scope of a value does not
 
  /// count, but a deallocation before that does.
 
  bool canBeFreed() const;
 
 
 
  /// Returns the number of bytes known to be dereferenceable for the
 
  /// pointer value.
 
  ///
 
  /// If CanBeNull is set by this function the pointer can either be null or be
 
  /// dereferenceable up to the returned number of bytes.
 
  ///
 
  /// IF CanBeFreed is true, the pointer is known to be dereferenceable at
 
  /// point of definition only.  Caller must prove that allocation is not
 
  /// deallocated between point of definition and use.
 
  uint64_t getPointerDereferenceableBytes(const DataLayout &DL,
 
                                          bool &CanBeNull,
 
                                          bool &CanBeFreed) const;
 
 
 
  /// Returns an alignment of the pointer value.
 
  ///
 
  /// Returns an alignment which is either specified explicitly, e.g. via
 
  /// align attribute of a function argument, or guaranteed by DataLayout.
 
  Align getPointerAlignment(const DataLayout &DL) const;
 
 
 
  /// Translate PHI node to its predecessor from the given basic block.
 
  ///
 
  /// If this value is a PHI node with CurBB as its parent, return the value in
 
  /// the PHI node corresponding to PredBB.  If not, return ourself.  This is
 
  /// useful if you want to know the value something has in a predecessor
 
  /// block.
 
  const Value *DoPHITranslation(const BasicBlock *CurBB,
 
                                const BasicBlock *PredBB) const;
 
  Value *DoPHITranslation(const BasicBlock *CurBB, const BasicBlock *PredBB) {
 
    return const_cast<Value *>(
 
             static_cast<const Value *>(this)->DoPHITranslation(CurBB, PredBB));
 
  }
 
 
 
  /// The maximum alignment for instructions.
 
  ///
 
  /// This is the greatest alignment value supported by load, store, and alloca
 
  /// instructions, and global values.
 
  static constexpr unsigned MaxAlignmentExponent = 32;
 
  static constexpr uint64_t MaximumAlignment = 1ULL << MaxAlignmentExponent;
 
 
 
  /// Mutate the type of this Value to be of the specified type.
 
  ///
 
  /// Note that this is an extremely dangerous operation which can create
 
  /// completely invalid IR very easily.  It is strongly recommended that you
 
  /// recreate IR objects with the right types instead of mutating them in
 
  /// place.
 
  void mutateType(Type *Ty) {
 
    VTy = Ty;
 
  }
 
 
 
  /// Sort the use-list.
 
  ///
 
  /// Sorts the Value's use-list by Cmp using a stable mergesort.  Cmp is
 
  /// expected to compare two \a Use references.
 
  template <class Compare> void sortUseList(Compare Cmp);
 
 
 
  /// Reverse the use-list.
 
  void reverseUseList();
 
 
 
private:
 
  /// Merge two lists together.
 
  ///
 
  /// Merges \c L and \c R using \c Cmp.  To enable stable sorts, always pushes
 
  /// "equal" items from L before items from R.
 
  ///
 
  /// \return the first element in the list.
 
  ///
 
  /// \note Completely ignores \a Use::Prev (doesn't read, doesn't update).
 
  template <class Compare>
 
  static Use *mergeUseLists(Use *L, Use *R, Compare Cmp) {
 
    Use *Merged;
 
    Use **Next = &Merged;
 
 
 
    while (true) {
 
      if (!L) {
 
        *Next = R;
 
        break;
 
      }
 
      if (!R) {
 
        *Next = L;
 
        break;
 
      }
 
      if (Cmp(*R, *L)) {
 
        *Next = R;
 
        Next = &R->Next;
 
        R = R->Next;
 
      } else {
 
        *Next = L;
 
        Next = &L->Next;
 
        L = L->Next;
 
      }
 
    }
 
 
 
    return Merged;
 
  }
 
 
 
protected:
 
  unsigned short getSubclassDataFromValue() const { return SubclassData; }
 
  void setValueSubclassData(unsigned short D) { SubclassData = D; }
 
};
 
 
 
struct ValueDeleter { void operator()(Value *V) { V->deleteValue(); } };
 
 
 
/// Use this instead of std::unique_ptr<Value> or std::unique_ptr<Instruction>.
 
/// Those don't work because Value and Instruction's destructors are protected,
 
/// aren't virtual, and won't destroy the complete object.
 
using unique_value = std::unique_ptr<Value, ValueDeleter>;
 
 
 
inline raw_ostream &operator<<(raw_ostream &OS, const Value &V) {
 
  V.print(OS);
 
  return OS;
 
}
 
 
 
void Use::set(Value *V) {
 
  if (Val) removeFromList();
 
  Val = V;
 
  if (V) V->addUse(*this);
 
}
 
 
 
Value *Use::operator=(Value *RHS) {
 
  set(RHS);
 
  return RHS;
 
}
 
 
 
const Use &Use::operator=(const Use &RHS) {
 
  set(RHS.Val);
 
  return *this;
 
}
 
 
 
template <class Compare> void Value::sortUseList(Compare Cmp) {
 
  if (!UseList || !UseList->Next)
 
    // No need to sort 0 or 1 uses.
 
    return;
 
 
 
  // Note: this function completely ignores Prev pointers until the end when
 
  // they're fixed en masse.
 
 
 
  // Create a binomial vector of sorted lists, visiting uses one at a time and
 
  // merging lists as necessary.
 
  const unsigned MaxSlots = 32;
 
  Use *Slots[MaxSlots];
 
 
 
  // Collect the first use, turning it into a single-item list.
 
  Use *Next = UseList->Next;
 
  UseList->Next = nullptr;
 
  unsigned NumSlots = 1;
 
  Slots[0] = UseList;
 
 
 
  // Collect all but the last use.
 
  while (Next->Next) {
 
    Use *Current = Next;
 
    Next = Current->Next;
 
 
 
    // Turn Current into a single-item list.
 
    Current->Next = nullptr;
 
 
 
    // Save Current in the first available slot, merging on collisions.
 
    unsigned I;
 
    for (I = 0; I < NumSlots; ++I) {
 
      if (!Slots[I])
 
        break;
 
 
 
      // Merge two lists, doubling the size of Current and emptying slot I.
 
      //
 
      // Since the uses in Slots[I] originally preceded those in Current, send
 
      // Slots[I] in as the left parameter to maintain a stable sort.
 
      Current = mergeUseLists(Slots[I], Current, Cmp);
 
      Slots[I] = nullptr;
 
    }
 
    // Check if this is a new slot.
 
    if (I == NumSlots) {
 
      ++NumSlots;
 
      assert(NumSlots <= MaxSlots && "Use list bigger than 2^32");
 
    }
 
 
 
    // Found an open slot.
 
    Slots[I] = Current;
 
  }
 
 
 
  // Merge all the lists together.
 
  assert(Next && "Expected one more Use");
 
  assert(!Next->Next && "Expected only one Use");
 
  UseList = Next;
 
  for (unsigned I = 0; I < NumSlots; ++I)
 
    if (Slots[I])
 
      // Since the uses in Slots[I] originally preceded those in UseList, send
 
      // Slots[I] in as the left parameter to maintain a stable sort.
 
      UseList = mergeUseLists(Slots[I], UseList, Cmp);
 
 
 
  // Fix the Prev pointers.
 
  for (Use *I = UseList, **Prev = &UseList; I; I = I->Next) {
 
    I->Prev = Prev;
 
    Prev = &I->Next;
 
  }
 
}
 
 
 
// isa - Provide some specializations of isa so that we don't have to include
 
// the subtype header files to test to see if the value is a subclass...
 
//
 
template <> struct isa_impl<Constant, Value> {
 
  static inline bool doit(const Value &Val) {
 
    static_assert(Value::ConstantFirstVal == 0, "Val.getValueID() >= Value::ConstantFirstVal");
 
    return Val.getValueID() <= Value::ConstantLastVal;
 
  }
 
};
 
 
 
template <> struct isa_impl<ConstantData, Value> {
 
  static inline bool doit(const Value &Val) {
 
    return Val.getValueID() >= Value::ConstantDataFirstVal &&
 
           Val.getValueID() <= Value::ConstantDataLastVal;
 
  }
 
};
 
 
 
template <> struct isa_impl<ConstantAggregate, Value> {
 
  static inline bool doit(const Value &Val) {
 
    return Val.getValueID() >= Value::ConstantAggregateFirstVal &&
 
           Val.getValueID() <= Value::ConstantAggregateLastVal;
 
  }
 
};
 
 
 
template <> struct isa_impl<Argument, Value> {
 
  static inline bool doit (const Value &Val) {
 
    return Val.getValueID() == Value::ArgumentVal;
 
  }
 
};
 
 
 
template <> struct isa_impl<InlineAsm, Value> {
 
  static inline bool doit(const Value &Val) {
 
    return Val.getValueID() == Value::InlineAsmVal;
 
  }
 
};
 
 
 
template <> struct isa_impl<Instruction, Value> {
 
  static inline bool doit(const Value &Val) {
 
    return Val.getValueID() >= Value::InstructionVal;
 
  }
 
};
 
 
 
template <> struct isa_impl<BasicBlock, Value> {
 
  static inline bool doit(const Value &Val) {
 
    return Val.getValueID() == Value::BasicBlockVal;
 
  }
 
};
 
 
 
template <> struct isa_impl<Function, Value> {
 
  static inline bool doit(const Value &Val) {
 
    return Val.getValueID() == Value::FunctionVal;
 
  }
 
};
 
 
 
template <> struct isa_impl<GlobalVariable, Value> {
 
  static inline bool doit(const Value &Val) {
 
    return Val.getValueID() == Value::GlobalVariableVal;
 
  }
 
};
 
 
 
template <> struct isa_impl<GlobalAlias, Value> {
 
  static inline bool doit(const Value &Val) {
 
    return Val.getValueID() == Value::GlobalAliasVal;
 
  }
 
};
 
 
 
template <> struct isa_impl<GlobalIFunc, Value> {
 
  static inline bool doit(const Value &Val) {
 
    return Val.getValueID() == Value::GlobalIFuncVal;
 
  }
 
};
 
 
 
template <> struct isa_impl<GlobalValue, Value> {
 
  static inline bool doit(const Value &Val) {
 
    return isa<GlobalObject>(Val) || isa<GlobalAlias>(Val);
 
  }
 
};
 
 
 
template <> struct isa_impl<GlobalObject, Value> {
 
  static inline bool doit(const Value &Val) {
 
    return isa<GlobalVariable>(Val) || isa<Function>(Val) ||
 
           isa<GlobalIFunc>(Val);
 
  }
 
};
 
 
 
// Create wrappers for C Binding types (see CBindingWrapping.h).
 
DEFINE_ISA_CONVERSION_FUNCTIONS(Value, LLVMValueRef)
 
 
 
// Specialized opaque value conversions.
 
inline Value **unwrap(LLVMValueRef *Vals) {
 
  return reinterpret_cast<Value**>(Vals);
 
}
 
 
 
template<typename T>
 
inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
 
#ifndef NDEBUG
 
  for (LLVMValueRef *I = Vals, *E = Vals + Length; I != E; ++I)
 
    unwrap<T>(*I); // For side effect of calling assert on invalid usage.
 
#endif
 
  (void)Length;
 
  return reinterpret_cast<T**>(Vals);
 
}
 
 
 
inline LLVMValueRef *wrap(const Value **Vals) {
 
  return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
 
}
 
 
 
} // end namespace llvm
 
 
 
#endif // LLVM_IR_VALUE_H