LCOV - code coverage report
Current view: top level - /usr/lib/llvm-19/include/llvm/IR - Value.h (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 81.8 % 11 9
Test Date: 2026-02-27 04:14:43 Functions: 75.0 % 8 6
Legend: Lines:     hit not hit

            Line data    Source code
       1              : //===- llvm/Value.h - Definition of the Value class -------------*- C++ -*-===//
       2              : //
       3              : // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
       4              : // See https://llvm.org/LICENSE.txt for license information.
       5              : // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
       6              : //
       7              : //===----------------------------------------------------------------------===//
       8              : //
       9              : // This file declares the Value class.
      10              : //
      11              : //===----------------------------------------------------------------------===//
      12              : 
      13              : #ifndef LLVM_IR_VALUE_H
      14              : #define LLVM_IR_VALUE_H
      15              : 
      16              : #include "llvm-c/Types.h"
      17              : #include "llvm/ADT/STLExtras.h"
      18              : #include "llvm/ADT/StringRef.h"
      19              : #include "llvm/ADT/iterator_range.h"
      20              : #include "llvm/IR/Use.h"
      21              : #include "llvm/Support/Alignment.h"
      22              : #include "llvm/Support/CBindingWrapping.h"
      23              : #include "llvm/Support/Casting.h"
      24              : #include <cassert>
      25              : #include <iterator>
      26              : #include <memory>
      27              : 
      28              : namespace llvm {
      29              : 
      30              : class APInt;
      31              : class Argument;
      32              : class BasicBlock;
      33              : class Constant;
      34              : class ConstantData;
      35              : class ConstantAggregate;
      36              : class DataLayout;
      37              : class Function;
      38              : class GlobalAlias;
      39              : class GlobalIFunc;
      40              : class GlobalObject;
      41              : class GlobalValue;
      42              : class GlobalVariable;
      43              : class InlineAsm;
      44              : class Instruction;
      45              : class LLVMContext;
      46              : class MDNode;
      47              : class Module;
      48              : class ModuleSlotTracker;
      49              : class raw_ostream;
      50              : template<typename ValueTy> class StringMapEntry;
      51              : class Twine;
      52              : class Type;
      53              : class User;
      54              : 
      55              : using ValueName = StringMapEntry<Value *>;
      56              : 
      57              : //===----------------------------------------------------------------------===//
      58              : //                                 Value Class
      59              : //===----------------------------------------------------------------------===//
      60              : 
      61              : /// LLVM Value Representation
      62              : ///
      63              : /// This is a very important LLVM class. It is the base class of all values
      64              : /// computed by a program that may be used as operands to other values. Value is
      65              : /// the super class of other important classes such as Instruction and Function.
      66              : /// All Values have a Type. Type is not a subclass of Value. Some values can
      67              : /// have a name and they belong to some Module.  Setting the name on the Value
      68              : /// automatically updates the module's symbol table.
      69              : ///
      70              : /// Every value has a "use list" that keeps track of which other Values are
      71              : /// using this Value.  A Value can also have an arbitrary number of ValueHandle
      72              : /// objects that watch it and listen to RAUW and Destroy events.  See
      73              : /// llvm/IR/ValueHandle.h for details.
      74              : class Value {
      75              :   const unsigned char SubclassID;   // Subclass identifier (for isa/dyn_cast)
      76              :   unsigned char HasValueHandle : 1; // Has a ValueHandle pointing to this?
      77              : 
      78              : protected:
      79              :   /// Hold subclass data that can be dropped.
      80              :   ///
      81              :   /// This member is similar to SubclassData, however it is for holding
      82              :   /// information which may be used to aid optimization, but which may be
      83              :   /// cleared to zero without affecting conservative interpretation.
      84              :   unsigned char SubclassOptionalData : 7;
      85              : 
      86              : private:
      87              :   /// Hold arbitrary subclass data.
      88              :   ///
      89              :   /// This member is defined by this class, but is not used for anything.
      90              :   /// Subclasses can use it to hold whatever state they find useful.  This
      91              :   /// field is initialized to zero by the ctor.
      92              :   unsigned short SubclassData;
      93              : 
      94              : protected:
      95              :   /// The number of operands in the subclass.
      96              :   ///
      97              :   /// This member is defined by this class, but not used for anything.
      98              :   /// Subclasses can use it to store their number of operands, if they have
      99              :   /// any.
     100              :   ///
     101              :   /// This is stored here to save space in User on 64-bit hosts.  Since most
     102              :   /// instances of Value have operands, 32-bit hosts aren't significantly
     103              :   /// affected.
     104              :   ///
     105              :   /// Note, this should *NOT* be used directly by any class other than User.
     106              :   /// User uses this value to find the Use list.
     107              :   enum : unsigned { NumUserOperandsBits = 27 };
     108              :   unsigned NumUserOperands : NumUserOperandsBits;
     109              : 
     110              :   // Use the same type as the bitfield above so that MSVC will pack them.
     111              :   unsigned IsUsedByMD : 1;
     112              :   unsigned HasName : 1;
     113              :   unsigned HasMetadata : 1; // Has metadata attached to this?
     114              :   unsigned HasHungOffUses : 1;
     115              :   unsigned HasDescriptor : 1;
     116              : 
     117              : private:
     118              :   Type *VTy;
     119              :   Use *UseList;
     120              : 
     121              :   friend class ValueAsMetadata; // Allow access to IsUsedByMD.
     122              :   friend class ValueHandleBase; // Allow access to HasValueHandle.
     123              : 
     124              :   template <typename UseT> // UseT == 'Use' or 'const Use'
     125              :   class use_iterator_impl {
     126              :     friend class Value;
     127              : 
     128              :     UseT *U;
     129              : 
     130              :     explicit use_iterator_impl(UseT *u) : U(u) {}
     131              : 
     132              :   public:
     133              :     using iterator_category = std::forward_iterator_tag;
     134              :     using value_type = UseT *;
     135              :     using difference_type = std::ptrdiff_t;
     136              :     using pointer = value_type *;
     137              :     using reference = value_type &;
     138              : 
     139              :     use_iterator_impl() : U() {}
     140              : 
     141              :     bool operator==(const use_iterator_impl &x) const { return U == x.U; }
     142              :     bool operator!=(const use_iterator_impl &x) const { return !operator==(x); }
     143              : 
     144              :     use_iterator_impl &operator++() { // Preincrement
     145              :       assert(U && "Cannot increment end iterator!");
     146              :       U = U->getNext();
     147              :       return *this;
     148              :     }
     149              : 
     150              :     use_iterator_impl operator++(int) { // Postincrement
     151              :       auto tmp = *this;
     152              :       ++*this;
     153              :       return tmp;
     154              :     }
     155              : 
     156              :     UseT &operator*() const {
     157              :       assert(U && "Cannot dereference end iterator!");
     158              :       return *U;
     159              :     }
     160              : 
     161              :     UseT *operator->() const { return &operator*(); }
     162              : 
     163              :     operator use_iterator_impl<const UseT>() const {
     164              :       return use_iterator_impl<const UseT>(U);
     165              :     }
     166              :   };
     167              : 
     168              :   template <typename UserTy> // UserTy == 'User' or 'const User'
     169              :   class user_iterator_impl {
     170              :     use_iterator_impl<Use> UI;
     171              :     explicit user_iterator_impl(Use *U) : UI(U) {}
     172              :     friend class Value;
     173              : 
     174              :   public:
     175              :     using iterator_category = std::forward_iterator_tag;
     176              :     using value_type = UserTy *;
     177              :     using difference_type = std::ptrdiff_t;
     178              :     using pointer = value_type *;
     179              :     using reference = value_type &;
     180              : 
     181              :     user_iterator_impl() = default;
     182              : 
     183              :     bool operator==(const user_iterator_impl &x) const { return UI == x.UI; }
     184              :     bool operator!=(const user_iterator_impl &x) const { return !operator==(x); }
     185              : 
     186              :     /// Returns true if this iterator is equal to user_end() on the value.
     187              :     bool atEnd() const { return *this == user_iterator_impl(); }
     188              : 
     189              :     user_iterator_impl &operator++() { // Preincrement
     190              :       ++UI;
     191              :       return *this;
     192              :     }
     193              : 
     194              :     user_iterator_impl operator++(int) { // Postincrement
     195              :       auto tmp = *this;
     196              :       ++*this;
     197              :       return tmp;
     198              :     }
     199              : 
     200              :     // Retrieve a pointer to the current User.
     201              :     UserTy *operator*() const {
     202              :       return UI->getUser();
     203              :     }
     204              : 
     205              :     UserTy *operator->() const { return operator*(); }
     206              : 
     207              :     operator user_iterator_impl<const UserTy>() const {
     208              :       return user_iterator_impl<const UserTy>(*UI);
     209              :     }
     210              : 
     211              :     Use &getUse() const { return *UI; }
     212              :   };
     213              : 
     214              : protected:
     215              :   Value(Type *Ty, unsigned scid);
     216              : 
     217              :   /// Value's destructor should be virtual by design, but that would require
     218              :   /// that Value and all of its subclasses have a vtable that effectively
     219              :   /// duplicates the information in the value ID. As a size optimization, the
     220              :   /// destructor has been protected, and the caller should manually call
     221              :   /// deleteValue.
     222              :   ~Value(); // Use deleteValue() to delete a generic Value.
     223              : 
     224              : public:
     225              :   Value(const Value &) = delete;
     226              :   Value &operator=(const Value &) = delete;
     227              : 
     228              :   /// Delete a pointer to a generic Value.
     229              :   void deleteValue();
     230              : 
     231              :   /// Support for debugging, callable in GDB: V->dump()
     232              :   void dump() const;
     233              : 
     234              :   /// Implement operator<< on Value.
     235              :   /// @{
     236              :   void print(raw_ostream &O, bool IsForDebug = false) const;
     237              :   void print(raw_ostream &O, ModuleSlotTracker &MST,
     238              :              bool IsForDebug = false) const;
     239              :   /// @}
     240              : 
     241              :   /// Print the name of this Value out to the specified raw_ostream.
     242              :   ///
     243              :   /// This is useful when you just want to print 'int %reg126', not the
     244              :   /// instruction that generated it. If you specify a Module for context, then
     245              :   /// even constants get pretty-printed; for example, the type of a null
     246              :   /// pointer is printed symbolically.
     247              :   /// @{
     248              :   void printAsOperand(raw_ostream &O, bool PrintType = true,
     249              :                       const Module *M = nullptr) const;
     250              :   void printAsOperand(raw_ostream &O, bool PrintType,
     251              :                       ModuleSlotTracker &MST) const;
     252              :   /// @}
     253              : 
     254              :   /// All values are typed, get the type of this value.
     255            0 :   Type *getType() const { return VTy; }
     256              : 
     257              :   /// All values hold a context through their type.
     258              :   LLVMContext &getContext() const;
     259              : 
     260              :   // All values can potentially be named.
     261              :   bool hasName() const { return HasName; }
     262              :   ValueName *getValueName() const;
     263              :   void setValueName(ValueName *VN);
     264              : 
     265              : private:
     266              :   void destroyValueName();
     267              :   enum class ReplaceMetadataUses { No, Yes };
     268              :   void doRAUW(Value *New, ReplaceMetadataUses);
     269              :   void setNameImpl(const Twine &Name);
     270              : 
     271              : public:
     272              :   /// Return a constant reference to the value's name.
     273              :   ///
     274              :   /// This guaranteed to return the same reference as long as the value is not
     275              :   /// modified.  If the value has a name, this does a hashtable lookup, so it's
     276              :   /// not free.
     277              :   StringRef getName() const;
     278              : 
     279              :   /// Change the name of the value.
     280              :   ///
     281              :   /// Choose a new unique name if the provided name is taken.
     282              :   ///
     283              :   /// \param Name The new name; or "" if the value's name should be removed.
     284              :   void setName(const Twine &Name);
     285              : 
     286              :   /// Transfer the name from V to this value.
     287              :   ///
     288              :   /// After taking V's name, sets V's name to empty.
     289              :   ///
     290              :   /// \note It is an error to call V->takeName(V).
     291              :   void takeName(Value *V);
     292              : 
     293              : #ifndef NDEBUG
     294              :   std::string getNameOrAsOperand() const;
     295              : #endif
     296              : 
     297              :   /// Change all uses of this to point to a new Value.
     298              :   ///
     299              :   /// Go through the uses list for this definition and make each use point to
     300              :   /// "V" instead of "this".  After this completes, 'this's use list is
     301              :   /// guaranteed to be empty.
     302              :   void replaceAllUsesWith(Value *V);
     303              : 
     304              :   /// Change non-metadata uses of this to point to a new Value.
     305              :   ///
     306              :   /// Go through the uses list for this definition and make each use point to
     307              :   /// "V" instead of "this". This function skips metadata entries in the list.
     308              :   void replaceNonMetadataUsesWith(Value *V);
     309              : 
     310              :   /// Go through the uses list for this definition and make each use point
     311              :   /// to "V" if the callback ShouldReplace returns true for the given Use.
     312              :   /// Unlike replaceAllUsesWith() this function does not support basic block
     313              :   /// values.
     314              :   void replaceUsesWithIf(Value *New,
     315              :                          llvm::function_ref<bool(Use &U)> ShouldReplace);
     316              : 
     317              :   /// replaceUsesOutsideBlock - Go through the uses list for this definition and
     318              :   /// make each use point to "V" instead of "this" when the use is outside the
     319              :   /// block. 'This's use list is expected to have at least one element.
     320              :   /// Unlike replaceAllUsesWith() this function does not support basic block
     321              :   /// values.
     322              :   void replaceUsesOutsideBlock(Value *V, BasicBlock *BB);
     323              : 
     324              :   //----------------------------------------------------------------------
     325              :   // Methods for handling the chain of uses of this Value.
     326              :   //
     327              :   // Materializing a function can introduce new uses, so these methods come in
     328              :   // two variants:
     329              :   // The methods that start with materialized_ check the uses that are
     330              :   // currently known given which functions are materialized. Be very careful
     331              :   // when using them since you might not get all uses.
     332              :   // The methods that don't start with materialized_ assert that modules is
     333              :   // fully materialized.
     334              :   void assertModuleIsMaterializedImpl() const;
     335              :   // This indirection exists so we can keep assertModuleIsMaterializedImpl()
     336              :   // around in release builds of Value.cpp to be linked with other code built
     337              :   // in debug mode. But this avoids calling it in any of the release built code.
     338              :   void assertModuleIsMaterialized() const {
     339              : #ifndef NDEBUG
     340              :     assertModuleIsMaterializedImpl();
     341              : #endif
     342              :   }
     343              : 
     344              :   bool use_empty() const {
     345              :     assertModuleIsMaterialized();
     346              :     return UseList == nullptr;
     347              :   }
     348              : 
     349              :   bool materialized_use_empty() const {
     350              :     return UseList == nullptr;
     351              :   }
     352              : 
     353              :   using use_iterator = use_iterator_impl<Use>;
     354              :   using const_use_iterator = use_iterator_impl<const Use>;
     355              : 
     356              :   use_iterator materialized_use_begin() { return use_iterator(UseList); }
     357              :   const_use_iterator materialized_use_begin() const {
     358              :     return const_use_iterator(UseList);
     359              :   }
     360              :   use_iterator use_begin() {
     361              :     assertModuleIsMaterialized();
     362              :     return materialized_use_begin();
     363              :   }
     364              :   const_use_iterator use_begin() const {
     365              :     assertModuleIsMaterialized();
     366              :     return materialized_use_begin();
     367              :   }
     368              :   use_iterator use_end() { return use_iterator(); }
     369              :   const_use_iterator use_end() const { return const_use_iterator(); }
     370              :   iterator_range<use_iterator> materialized_uses() {
     371              :     return make_range(materialized_use_begin(), use_end());
     372              :   }
     373              :   iterator_range<const_use_iterator> materialized_uses() const {
     374              :     return make_range(materialized_use_begin(), use_end());
     375              :   }
     376              :   iterator_range<use_iterator> uses() {
     377              :     assertModuleIsMaterialized();
     378              :     return materialized_uses();
     379              :   }
     380              :   iterator_range<const_use_iterator> uses() const {
     381              :     assertModuleIsMaterialized();
     382              :     return materialized_uses();
     383              :   }
     384              : 
     385              :   bool user_empty() const {
     386              :     assertModuleIsMaterialized();
     387              :     return UseList == nullptr;
     388              :   }
     389              : 
     390              :   using user_iterator = user_iterator_impl<User>;
     391              :   using const_user_iterator = user_iterator_impl<const User>;
     392              : 
     393              :   user_iterator materialized_user_begin() { return user_iterator(UseList); }
     394              :   const_user_iterator materialized_user_begin() const {
     395              :     return const_user_iterator(UseList);
     396              :   }
     397              :   user_iterator user_begin() {
     398              :     assertModuleIsMaterialized();
     399              :     return materialized_user_begin();
     400              :   }
     401              :   const_user_iterator user_begin() const {
     402              :     assertModuleIsMaterialized();
     403              :     return materialized_user_begin();
     404              :   }
     405              :   user_iterator user_end() { return user_iterator(); }
     406              :   const_user_iterator user_end() const { return const_user_iterator(); }
     407              :   User *user_back() {
     408              :     assertModuleIsMaterialized();
     409              :     return *materialized_user_begin();
     410              :   }
     411              :   const User *user_back() const {
     412              :     assertModuleIsMaterialized();
     413              :     return *materialized_user_begin();
     414              :   }
     415              :   iterator_range<user_iterator> materialized_users() {
     416              :     return make_range(materialized_user_begin(), user_end());
     417              :   }
     418              :   iterator_range<const_user_iterator> materialized_users() const {
     419              :     return make_range(materialized_user_begin(), user_end());
     420              :   }
     421              :   iterator_range<user_iterator> users() {
     422              :     assertModuleIsMaterialized();
     423              :     return materialized_users();
     424              :   }
     425              :   iterator_range<const_user_iterator> users() const {
     426              :     assertModuleIsMaterialized();
     427              :     return materialized_users();
     428              :   }
     429              : 
     430              :   /// Return true if there is exactly one use of this value.
     431              :   ///
     432              :   /// This is specialized because it is a common request and does not require
     433              :   /// traversing the whole use list.
     434              :   bool hasOneUse() const { return hasSingleElement(uses()); }
     435              : 
     436              :   /// Return true if this Value has exactly N uses.
     437              :   bool hasNUses(unsigned N) const;
     438              : 
     439              :   /// Return true if this value has N uses or more.
     440              :   ///
     441              :   /// This is logically equivalent to getNumUses() >= N.
     442              :   bool hasNUsesOrMore(unsigned N) const;
     443              : 
     444              :   /// Return true if there is exactly one user of this value.
     445              :   ///
     446              :   /// Note that this is not the same as "has one use". If a value has one use,
     447              :   /// then there certainly is a single user. But if value has several uses,
     448              :   /// it is possible that all uses are in a single user, or not.
     449              :   ///
     450              :   /// This check is potentially costly, since it requires traversing,
     451              :   /// in the worst case, the whole use list of a value.
     452              :   bool hasOneUser() const;
     453              : 
     454              :   /// Return true if there is exactly one use of this value that cannot be
     455              :   /// dropped.
     456              :   Use *getSingleUndroppableUse();
     457              :   const Use *getSingleUndroppableUse() const {
     458              :     return const_cast<Value *>(this)->getSingleUndroppableUse();
     459              :   }
     460              : 
     461              :   /// Return true if there is exactly one unique user of this value that cannot be
     462              :   /// dropped (that user can have multiple uses of this value).
     463              :   User *getUniqueUndroppableUser();
     464              :   const User *getUniqueUndroppableUser() const {
     465              :     return const_cast<Value *>(this)->getUniqueUndroppableUser();
     466              :   }
     467              : 
     468              :   /// Return true if there this value.
     469              :   ///
     470              :   /// This is specialized because it is a common request and does not require
     471              :   /// traversing the whole use list.
     472              :   bool hasNUndroppableUses(unsigned N) const;
     473              : 
     474              :   /// Return true if this value has N uses or more.
     475              :   ///
     476              :   /// This is logically equivalent to getNumUses() >= N.
     477              :   bool hasNUndroppableUsesOrMore(unsigned N) const;
     478              : 
     479              :   /// Remove every uses that can safely be removed.
     480              :   ///
     481              :   /// This will remove for example uses in llvm.assume.
     482              :   /// This should be used when performing want to perform a tranformation but
     483              :   /// some Droppable uses pervent it.
     484              :   /// This function optionally takes a filter to only remove some droppable
     485              :   /// uses.
     486              :   void dropDroppableUses(llvm::function_ref<bool(const Use *)> ShouldDrop =
     487              :                              [](const Use *) { return true; });
     488              : 
     489              :   /// Remove every use of this value in \p User that can safely be removed.
     490              :   void dropDroppableUsesIn(User &Usr);
     491              : 
     492              :   /// Remove the droppable use \p U.
     493              :   static void dropDroppableUse(Use &U);
     494              : 
     495              :   /// Check if this value is used in the specified basic block.
     496              :   bool isUsedInBasicBlock(const BasicBlock *BB) const;
     497              : 
     498              :   /// This method computes the number of uses of this Value.
     499              :   ///
     500              :   /// This is a linear time operation.  Use hasOneUse, hasNUses, or
     501              :   /// hasNUsesOrMore to check for specific values.
     502              :   unsigned getNumUses() const;
     503              : 
     504              :   /// This method should only be used by the Use class.
     505              :   void addUse(Use &U) { U.addToList(&UseList); }
     506              : 
     507              :   /// Concrete subclass of this.
     508              :   ///
     509              :   /// An enumeration for keeping track of the concrete subclass of Value that
     510              :   /// is actually instantiated. Values of this enumeration are kept in the
     511              :   /// Value classes SubclassID field. They are used for concrete type
     512              :   /// identification.
     513              :   enum ValueTy {
     514              : #define HANDLE_VALUE(Name) Name##Val,
     515              : #include "llvm/IR/Value.def"
     516              : 
     517              :     // Markers:
     518              : #define HANDLE_CONSTANT_MARKER(Marker, Constant) Marker = Constant##Val,
     519              : #include "llvm/IR/Value.def"
     520              :   };
     521              : 
     522              :   /// Return an ID for the concrete type of this object.
     523              :   ///
     524              :   /// This is used to implement the classof checks.  This should not be used
     525              :   /// for any other purpose, as the values may change as LLVM evolves.  Also,
     526              :   /// note that for instructions, the Instruction's opcode is added to
     527              :   /// InstructionVal. So this means three things:
     528              :   /// # there is no value with code InstructionVal (no opcode==0).
     529              :   /// # there are more possible values for the value type than in ValueTy enum.
     530              :   /// # the InstructionVal enumerator must be the highest valued enumerator in
     531              :   ///   the ValueTy enum.
     532      3408015 :   unsigned getValueID() const {
     533      3408015 :     return SubclassID;
     534              :   }
     535              : 
     536              :   /// Return the raw optional flags value contained in this value.
     537              :   ///
     538              :   /// This should only be used when testing two Values for equivalence.
     539              :   unsigned getRawSubclassOptionalData() const {
     540              :     return SubclassOptionalData;
     541              :   }
     542              : 
     543              :   /// Clear the optional flags contained in this value.
     544              :   void clearSubclassOptionalData() {
     545              :     SubclassOptionalData = 0;
     546              :   }
     547              : 
     548              :   /// Check the optional flags for equality.
     549              :   bool hasSameSubclassOptionalData(const Value *V) const {
     550              :     return SubclassOptionalData == V->SubclassOptionalData;
     551              :   }
     552              : 
     553              :   /// Return true if there is a value handle associated with this value.
     554              :   bool hasValueHandle() const { return HasValueHandle; }
     555              : 
     556              :   /// Return true if there is metadata referencing this value.
     557              :   bool isUsedByMetadata() const { return IsUsedByMD; }
     558              : 
     559              : protected:
     560              :   /// Get the current metadata attachments for the given kind, if any.
     561              :   ///
     562              :   /// These functions require that the value have at most a single attachment
     563              :   /// of the given kind, and return \c nullptr if such an attachment is missing.
     564              :   /// @{
     565              :   MDNode *getMetadata(unsigned KindID) const {
     566              :     if (!HasMetadata)
     567              :       return nullptr;
     568              :     return getMetadataImpl(KindID);
     569              :   }
     570              :   MDNode *getMetadata(StringRef Kind) const;
     571              :   /// @}
     572              : 
     573              :   /// Appends all attachments with the given ID to \c MDs in insertion order.
     574              :   /// If the Value has no attachments with the given ID, or if ID is invalid,
     575              :   /// leaves MDs unchanged.
     576              :   /// @{
     577              :   void getMetadata(unsigned KindID, SmallVectorImpl<MDNode *> &MDs) const;
     578              :   void getMetadata(StringRef Kind, SmallVectorImpl<MDNode *> &MDs) const;
     579              :   /// @}
     580              : 
     581              :   /// Appends all metadata attached to this value to \c MDs, sorting by
     582              :   /// KindID. The first element of each pair returned is the KindID, the second
     583              :   /// element is the metadata value. Attachments with the same ID appear in
     584              :   /// insertion order.
     585              :   void
     586              :   getAllMetadata(SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const;
     587              : 
     588              :   /// Return true if this value has any metadata attached to it.
     589              :   bool hasMetadata() const { return (bool)HasMetadata; }
     590              : 
     591              :   /// Return true if this value has the given type of metadata attached.
     592              :   /// @{
     593              :   bool hasMetadata(unsigned KindID) const {
     594              :     return getMetadata(KindID) != nullptr;
     595              :   }
     596              :   bool hasMetadata(StringRef Kind) const {
     597              :     return getMetadata(Kind) != nullptr;
     598              :   }
     599              :   /// @}
     600              : 
     601              :   /// Set a particular kind of metadata attachment.
     602              :   ///
     603              :   /// Sets the given attachment to \c MD, erasing it if \c MD is \c nullptr or
     604              :   /// replacing it if it already exists.
     605              :   /// @{
     606              :   void setMetadata(unsigned KindID, MDNode *Node);
     607              :   void setMetadata(StringRef Kind, MDNode *Node);
     608              :   /// @}
     609              : 
     610              :   /// Add a metadata attachment.
     611              :   /// @{
     612              :   void addMetadata(unsigned KindID, MDNode &MD);
     613              :   void addMetadata(StringRef Kind, MDNode &MD);
     614              :   /// @}
     615              : 
     616              :   /// Erase all metadata attachments with the given kind.
     617              :   ///
     618              :   /// \returns true if any metadata was removed.
     619              :   bool eraseMetadata(unsigned KindID);
     620              : 
     621              :   /// Erase all metadata attachments matching the given predicate.
     622              :   void eraseMetadataIf(function_ref<bool(unsigned, MDNode *)> Pred);
     623              : 
     624              :   /// Erase all metadata attached to this Value.
     625              :   void clearMetadata();
     626              : 
     627              :   /// Get metadata for the given kind, if any.
     628              :   /// This is an internal function that must only be called after
     629              :   /// checking that `hasMetadata()` returns true.
     630              :   MDNode *getMetadataImpl(unsigned KindID) const;
     631              : 
     632              : public:
     633              :   /// Return true if this value is a swifterror value.
     634              :   ///
     635              :   /// swifterror values can be either a function argument or an alloca with a
     636              :   /// swifterror attribute.
     637              :   bool isSwiftError() const;
     638              : 
     639              :   /// Strip off pointer casts, all-zero GEPs and address space casts.
     640              :   ///
     641              :   /// Returns the original uncasted value.  If this is called on a non-pointer
     642              :   /// value, it returns 'this'.
     643              :   const Value *stripPointerCasts() const;
     644              :   Value *stripPointerCasts() {
     645              :     return const_cast<Value *>(
     646              :         static_cast<const Value *>(this)->stripPointerCasts());
     647              :   }
     648              : 
     649              :   /// Strip off pointer casts, all-zero GEPs, address space casts, and aliases.
     650              :   ///
     651              :   /// Returns the original uncasted value.  If this is called on a non-pointer
     652              :   /// value, it returns 'this'.
     653              :   const Value *stripPointerCastsAndAliases() const;
     654              :   Value *stripPointerCastsAndAliases() {
     655              :     return const_cast<Value *>(
     656              :         static_cast<const Value *>(this)->stripPointerCastsAndAliases());
     657              :   }
     658              : 
     659              :   /// Strip off pointer casts, all-zero GEPs and address space casts
     660              :   /// but ensures the representation of the result stays the same.
     661              :   ///
     662              :   /// Returns the original uncasted value with the same representation. If this
     663              :   /// is called on a non-pointer value, it returns 'this'.
     664              :   const Value *stripPointerCastsSameRepresentation() const;
     665              :   Value *stripPointerCastsSameRepresentation() {
     666              :     return const_cast<Value *>(static_cast<const Value *>(this)
     667              :                                    ->stripPointerCastsSameRepresentation());
     668              :   }
     669              : 
     670              :   /// Strip off pointer casts, all-zero GEPs, single-argument phi nodes and
     671              :   /// invariant group info.
     672              :   ///
     673              :   /// Returns the original uncasted value.  If this is called on a non-pointer
     674              :   /// value, it returns 'this'. This function should be used only in
     675              :   /// Alias analysis.
     676              :   const Value *stripPointerCastsForAliasAnalysis() const;
     677              :   Value *stripPointerCastsForAliasAnalysis() {
     678              :     return const_cast<Value *>(static_cast<const Value *>(this)
     679              :                                    ->stripPointerCastsForAliasAnalysis());
     680              :   }
     681              : 
     682              :   /// Strip off pointer casts and all-constant inbounds GEPs.
     683              :   ///
     684              :   /// Returns the original pointer value.  If this is called on a non-pointer
     685              :   /// value, it returns 'this'.
     686              :   const Value *stripInBoundsConstantOffsets() const;
     687              :   Value *stripInBoundsConstantOffsets() {
     688              :     return const_cast<Value *>(
     689              :               static_cast<const Value *>(this)->stripInBoundsConstantOffsets());
     690              :   }
     691              : 
     692              :   /// Accumulate the constant offset this value has compared to a base pointer.
     693              :   /// Only 'getelementptr' instructions (GEPs) are accumulated but other
     694              :   /// instructions, e.g., casts, are stripped away as well.
     695              :   /// The accumulated constant offset is added to \p Offset and the base
     696              :   /// pointer is returned.
     697              :   ///
     698              :   /// The APInt \p Offset has to have a bit-width equal to the IntPtr type for
     699              :   /// the address space of 'this' pointer value, e.g., use
     700              :   /// DataLayout::getIndexTypeSizeInBits(Ty).
     701              :   ///
     702              :   /// If \p AllowNonInbounds is true, offsets in GEPs are stripped and
     703              :   /// accumulated even if the GEP is not "inbounds".
     704              :   ///
     705              :   /// If \p AllowInvariantGroup is true then this method also looks through
     706              :   /// strip.invariant.group and launder.invariant.group intrinsics.
     707              :   ///
     708              :   /// If \p ExternalAnalysis is provided it will be used to calculate a offset
     709              :   /// when a operand of GEP is not constant.
     710              :   /// For example, for a value \p ExternalAnalysis might try to calculate a
     711              :   /// lower bound. If \p ExternalAnalysis is successful, it should return true.
     712              :   ///
     713              :   /// If this is called on a non-pointer value, it returns 'this' and the
     714              :   /// \p Offset is not modified.
     715              :   ///
     716              :   /// Note that this function will never return a nullptr. It will also never
     717              :   /// manipulate the \p Offset in a way that would not match the difference
     718              :   /// between the underlying value and the returned one. Thus, if no constant
     719              :   /// offset was found, the returned value is the underlying one and \p Offset
     720              :   /// is unchanged.
     721              :   const Value *stripAndAccumulateConstantOffsets(
     722              :       const DataLayout &DL, APInt &Offset, bool AllowNonInbounds,
     723              :       bool AllowInvariantGroup = false,
     724              :       function_ref<bool(Value &Value, APInt &Offset)> ExternalAnalysis =
     725              :           nullptr) const;
     726              :   Value *stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset,
     727              :                                            bool AllowNonInbounds,
     728              :                                            bool AllowInvariantGroup = false) {
     729              :     return const_cast<Value *>(
     730              :         static_cast<const Value *>(this)->stripAndAccumulateConstantOffsets(
     731              :             DL, Offset, AllowNonInbounds, AllowInvariantGroup));
     732              :   }
     733              : 
     734              :   /// This is a wrapper around stripAndAccumulateConstantOffsets with the
     735              :   /// in-bounds requirement set to false.
     736              :   const Value *stripAndAccumulateInBoundsConstantOffsets(const DataLayout &DL,
     737              :                                                          APInt &Offset) const {
     738              :     return stripAndAccumulateConstantOffsets(DL, Offset,
     739              :                                              /* AllowNonInbounds */ false);
     740              :   }
     741              :   Value *stripAndAccumulateInBoundsConstantOffsets(const DataLayout &DL,
     742              :                                                    APInt &Offset) {
     743              :     return stripAndAccumulateConstantOffsets(DL, Offset,
     744              :                                              /* AllowNonInbounds */ false);
     745              :   }
     746              : 
     747              :   /// Strip off pointer casts and inbounds GEPs.
     748              :   ///
     749              :   /// Returns the original pointer value.  If this is called on a non-pointer
     750              :   /// value, it returns 'this'.
     751              :   const Value *stripInBoundsOffsets(function_ref<void(const Value *)> Func =
     752              :                                         [](const Value *) {}) const;
     753              :   inline Value *stripInBoundsOffsets(function_ref<void(const Value *)> Func =
     754              :                                   [](const Value *) {}) {
     755              :     return const_cast<Value *>(
     756              :         static_cast<const Value *>(this)->stripInBoundsOffsets(Func));
     757              :   }
     758              : 
     759              :   /// If this ptr is provably equal to \p Other plus a constant offset, return
     760              :   /// that offset in bytes. Essentially `ptr this` subtract `ptr Other`.
     761              :   std::optional<int64_t> getPointerOffsetFrom(const Value *Other,
     762              :                                               const DataLayout &DL) const;
     763              : 
     764              :   /// Return true if the memory object referred to by V can by freed in the
     765              :   /// scope for which the SSA value defining the allocation is statically
     766              :   /// defined.  E.g.  deallocation after the static scope of a value does not
     767              :   /// count, but a deallocation before that does.
     768              :   bool canBeFreed() const;
     769              : 
     770              :   /// Returns the number of bytes known to be dereferenceable for the
     771              :   /// pointer value.
     772              :   ///
     773              :   /// If CanBeNull is set by this function the pointer can either be null or be
     774              :   /// dereferenceable up to the returned number of bytes.
     775              :   ///
     776              :   /// IF CanBeFreed is true, the pointer is known to be dereferenceable at
     777              :   /// point of definition only.  Caller must prove that allocation is not
     778              :   /// deallocated between point of definition and use.
     779              :   uint64_t getPointerDereferenceableBytes(const DataLayout &DL,
     780              :                                           bool &CanBeNull,
     781              :                                           bool &CanBeFreed) const;
     782              : 
     783              :   /// Returns an alignment of the pointer value.
     784              :   ///
     785              :   /// Returns an alignment which is either specified explicitly, e.g. via
     786              :   /// align attribute of a function argument, or guaranteed by DataLayout.
     787              :   Align getPointerAlignment(const DataLayout &DL) const;
     788              : 
     789              :   /// Translate PHI node to its predecessor from the given basic block.
     790              :   ///
     791              :   /// If this value is a PHI node with CurBB as its parent, return the value in
     792              :   /// the PHI node corresponding to PredBB.  If not, return ourself.  This is
     793              :   /// useful if you want to know the value something has in a predecessor
     794              :   /// block.
     795              :   const Value *DoPHITranslation(const BasicBlock *CurBB,
     796              :                                 const BasicBlock *PredBB) const;
     797              :   Value *DoPHITranslation(const BasicBlock *CurBB, const BasicBlock *PredBB) {
     798              :     return const_cast<Value *>(
     799              :              static_cast<const Value *>(this)->DoPHITranslation(CurBB, PredBB));
     800              :   }
     801              : 
     802              :   /// The maximum alignment for instructions.
     803              :   ///
     804              :   /// This is the greatest alignment value supported by load, store, and alloca
     805              :   /// instructions, and global values.
     806              :   static constexpr unsigned MaxAlignmentExponent = 32;
     807              :   static constexpr uint64_t MaximumAlignment = 1ULL << MaxAlignmentExponent;
     808              : 
     809              :   /// Mutate the type of this Value to be of the specified type.
     810              :   ///
     811              :   /// Note that this is an extremely dangerous operation which can create
     812              :   /// completely invalid IR very easily.  It is strongly recommended that you
     813              :   /// recreate IR objects with the right types instead of mutating them in
     814              :   /// place.
     815              :   void mutateType(Type *Ty) {
     816              :     VTy = Ty;
     817              :   }
     818              : 
     819              :   /// Sort the use-list.
     820              :   ///
     821              :   /// Sorts the Value's use-list by Cmp using a stable mergesort.  Cmp is
     822              :   /// expected to compare two \a Use references.
     823              :   template <class Compare> void sortUseList(Compare Cmp);
     824              : 
     825              :   /// Reverse the use-list.
     826              :   void reverseUseList();
     827              : 
     828              : private:
     829              :   /// Merge two lists together.
     830              :   ///
     831              :   /// Merges \c L and \c R using \c Cmp.  To enable stable sorts, always pushes
     832              :   /// "equal" items from L before items from R.
     833              :   ///
     834              :   /// \return the first element in the list.
     835              :   ///
     836              :   /// \note Completely ignores \a Use::Prev (doesn't read, doesn't update).
     837              :   template <class Compare>
     838              :   static Use *mergeUseLists(Use *L, Use *R, Compare Cmp) {
     839              :     Use *Merged;
     840              :     Use **Next = &Merged;
     841              : 
     842              :     while (true) {
     843              :       if (!L) {
     844              :         *Next = R;
     845              :         break;
     846              :       }
     847              :       if (!R) {
     848              :         *Next = L;
     849              :         break;
     850              :       }
     851              :       if (Cmp(*R, *L)) {
     852              :         *Next = R;
     853              :         Next = &R->Next;
     854              :         R = R->Next;
     855              :       } else {
     856              :         *Next = L;
     857              :         Next = &L->Next;
     858              :         L = L->Next;
     859              :       }
     860              :     }
     861              : 
     862              :     return Merged;
     863              :   }
     864              : 
     865              : protected:
     866            0 :   unsigned short getSubclassDataFromValue() const { return SubclassData; }
     867              :   void setValueSubclassData(unsigned short D) { SubclassData = D; }
     868              : };
     869              : 
     870              : struct ValueDeleter { void operator()(Value *V) { V->deleteValue(); } };
     871              : 
     872              : /// Use this instead of std::unique_ptr<Value> or std::unique_ptr<Instruction>.
     873              : /// Those don't work because Value and Instruction's destructors are protected,
     874              : /// aren't virtual, and won't destroy the complete object.
     875              : using unique_value = std::unique_ptr<Value, ValueDeleter>;
     876              : 
     877              : inline raw_ostream &operator<<(raw_ostream &OS, const Value &V) {
     878              :   V.print(OS);
     879              :   return OS;
     880              : }
     881              : 
     882              : void Use::set(Value *V) {
     883              :   if (Val) removeFromList();
     884              :   Val = V;
     885              :   if (V) V->addUse(*this);
     886              : }
     887              : 
     888              : Value *Use::operator=(Value *RHS) {
     889              :   set(RHS);
     890              :   return RHS;
     891              : }
     892              : 
     893              : const Use &Use::operator=(const Use &RHS) {
     894              :   set(RHS.Val);
     895              :   return *this;
     896              : }
     897              : 
     898              : template <class Compare> void Value::sortUseList(Compare Cmp) {
     899              :   if (!UseList || !UseList->Next)
     900              :     // No need to sort 0 or 1 uses.
     901              :     return;
     902              : 
     903              :   // Note: this function completely ignores Prev pointers until the end when
     904              :   // they're fixed en masse.
     905              : 
     906              :   // Create a binomial vector of sorted lists, visiting uses one at a time and
     907              :   // merging lists as necessary.
     908              :   const unsigned MaxSlots = 32;
     909              :   Use *Slots[MaxSlots];
     910              : 
     911              :   // Collect the first use, turning it into a single-item list.
     912              :   Use *Next = UseList->Next;
     913              :   UseList->Next = nullptr;
     914              :   unsigned NumSlots = 1;
     915              :   Slots[0] = UseList;
     916              : 
     917              :   // Collect all but the last use.
     918              :   while (Next->Next) {
     919              :     Use *Current = Next;
     920              :     Next = Current->Next;
     921              : 
     922              :     // Turn Current into a single-item list.
     923              :     Current->Next = nullptr;
     924              : 
     925              :     // Save Current in the first available slot, merging on collisions.
     926              :     unsigned I;
     927              :     for (I = 0; I < NumSlots; ++I) {
     928              :       if (!Slots[I])
     929              :         break;
     930              : 
     931              :       // Merge two lists, doubling the size of Current and emptying slot I.
     932              :       //
     933              :       // Since the uses in Slots[I] originally preceded those in Current, send
     934              :       // Slots[I] in as the left parameter to maintain a stable sort.
     935              :       Current = mergeUseLists(Slots[I], Current, Cmp);
     936              :       Slots[I] = nullptr;
     937              :     }
     938              :     // Check if this is a new slot.
     939              :     if (I == NumSlots) {
     940              :       ++NumSlots;
     941              :       assert(NumSlots <= MaxSlots && "Use list bigger than 2^32");
     942              :     }
     943              : 
     944              :     // Found an open slot.
     945              :     Slots[I] = Current;
     946              :   }
     947              : 
     948              :   // Merge all the lists together.
     949              :   assert(Next && "Expected one more Use");
     950              :   assert(!Next->Next && "Expected only one Use");
     951              :   UseList = Next;
     952              :   for (unsigned I = 0; I < NumSlots; ++I)
     953              :     if (Slots[I])
     954              :       // Since the uses in Slots[I] originally preceded those in UseList, send
     955              :       // Slots[I] in as the left parameter to maintain a stable sort.
     956              :       UseList = mergeUseLists(Slots[I], UseList, Cmp);
     957              : 
     958              :   // Fix the Prev pointers.
     959              :   for (Use *I = UseList, **Prev = &UseList; I; I = I->Next) {
     960              :     I->Prev = Prev;
     961              :     Prev = &I->Next;
     962              :   }
     963              : }
     964              : 
     965              : // isa - Provide some specializations of isa so that we don't have to include
     966              : // the subtype header files to test to see if the value is a subclass...
     967              : //
     968              : template <> struct isa_impl<Constant, Value> {
     969       320086 :   static inline bool doit(const Value &Val) {
     970              :     static_assert(Value::ConstantFirstVal == 0, "Val.getValueID() >= Value::ConstantFirstVal");
     971       320086 :     return Val.getValueID() <= Value::ConstantLastVal;
     972              :   }
     973              : };
     974              : 
     975              : template <> struct isa_impl<ConstantData, Value> {
     976              :   static inline bool doit(const Value &Val) {
     977              :     return Val.getValueID() >= Value::ConstantDataFirstVal &&
     978              :            Val.getValueID() <= Value::ConstantDataLastVal;
     979              :   }
     980              : };
     981              : 
     982              : template <> struct isa_impl<ConstantAggregate, Value> {
     983              :   static inline bool doit(const Value &Val) {
     984              :     return Val.getValueID() >= Value::ConstantAggregateFirstVal &&
     985              :            Val.getValueID() <= Value::ConstantAggregateLastVal;
     986              :   }
     987              : };
     988              : 
     989              : template <> struct isa_impl<Argument, Value> {
     990              :   static inline bool doit (const Value &Val) {
     991              :     return Val.getValueID() == Value::ArgumentVal;
     992              :   }
     993              : };
     994              : 
     995              : template <> struct isa_impl<InlineAsm, Value> {
     996              :   static inline bool doit(const Value &Val) {
     997              :     return Val.getValueID() == Value::InlineAsmVal;
     998              :   }
     999              : };
    1000              : 
    1001              : template <> struct isa_impl<Instruction, Value> {
    1002      1277677 :   static inline bool doit(const Value &Val) {
    1003      1277677 :     return Val.getValueID() >= Value::InstructionVal;
    1004              :   }
    1005              : };
    1006              : 
    1007              : template <> struct isa_impl<BasicBlock, Value> {
    1008              :   static inline bool doit(const Value &Val) {
    1009              :     return Val.getValueID() == Value::BasicBlockVal;
    1010              :   }
    1011              : };
    1012              : 
    1013              : template <> struct isa_impl<Function, Value> {
    1014        90105 :   static inline bool doit(const Value &Val) {
    1015        90105 :     return Val.getValueID() == Value::FunctionVal;
    1016              :   }
    1017              : };
    1018              : 
    1019              : template <> struct isa_impl<GlobalVariable, Value> {
    1020              :   static inline bool doit(const Value &Val) {
    1021              :     return Val.getValueID() == Value::GlobalVariableVal;
    1022              :   }
    1023              : };
    1024              : 
    1025              : template <> struct isa_impl<GlobalAlias, Value> {
    1026              :   static inline bool doit(const Value &Val) {
    1027              :     return Val.getValueID() == Value::GlobalAliasVal;
    1028              :   }
    1029              : };
    1030              : 
    1031              : template <> struct isa_impl<GlobalIFunc, Value> {
    1032              :   static inline bool doit(const Value &Val) {
    1033              :     return Val.getValueID() == Value::GlobalIFuncVal;
    1034              :   }
    1035              : };
    1036              : 
    1037              : template <> struct isa_impl<GlobalValue, Value> {
    1038              :   static inline bool doit(const Value &Val) {
    1039              :     return isa<GlobalObject>(Val) || isa<GlobalAlias>(Val);
    1040              :   }
    1041              : };
    1042              : 
    1043              : template <> struct isa_impl<GlobalObject, Value> {
    1044              :   static inline bool doit(const Value &Val) {
    1045              :     return isa<GlobalVariable>(Val) || isa<Function>(Val) ||
    1046              :            isa<GlobalIFunc>(Val);
    1047              :   }
    1048              : };
    1049              : 
    1050              : // Create wrappers for C Binding types (see CBindingWrapping.h).
    1051        58216 : DEFINE_ISA_CONVERSION_FUNCTIONS(Value, LLVMValueRef)
    1052              : 
    1053              : // Specialized opaque value conversions.
    1054              : inline Value **unwrap(LLVMValueRef *Vals) {
    1055              :   return reinterpret_cast<Value**>(Vals);
    1056              : }
    1057              : 
    1058              : template<typename T>
    1059              : inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
    1060              : #ifndef NDEBUG
    1061              :   for (LLVMValueRef *I = Vals, *E = Vals + Length; I != E; ++I)
    1062              :     unwrap<T>(*I); // For side effect of calling assert on invalid usage.
    1063              : #endif
    1064              :   (void)Length;
    1065              :   return reinterpret_cast<T**>(Vals);
    1066              : }
    1067              : 
    1068              : inline LLVMValueRef *wrap(const Value **Vals) {
    1069              :   return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
    1070              : }
    1071              : 
    1072              : } // end namespace llvm
    1073              : 
    1074              : #endif // LLVM_IR_VALUE_H
        

Generated by: LCOV version 2.0-1