LCOV - code coverage report
Current view: top level - /usr/lib/llvm-19/include/llvm/IR - Instruction.h (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 50.0 % 2 1
Test Date: 2026-02-27 04:14:43 Functions: 50.0 % 2 1
Legend: Lines:     hit not hit

            Line data    Source code
       1              : //===-- llvm/Instruction.h - Instruction class definition -------*- 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 contains the declaration of the Instruction class, which is the
      10              : // base class for all of the LLVM instructions.
      11              : //
      12              : //===----------------------------------------------------------------------===//
      13              : 
      14              : #ifndef LLVM_IR_INSTRUCTION_H
      15              : #define LLVM_IR_INSTRUCTION_H
      16              : 
      17              : #include "llvm/ADT/ArrayRef.h"
      18              : #include "llvm/ADT/Bitfields.h"
      19              : #include "llvm/ADT/StringRef.h"
      20              : #include "llvm/ADT/ilist_node.h"
      21              : #include "llvm/IR/DebugLoc.h"
      22              : #include "llvm/IR/SymbolTableListTraits.h"
      23              : #include "llvm/IR/User.h"
      24              : #include "llvm/IR/Value.h"
      25              : #include "llvm/Support/AtomicOrdering.h"
      26              : #include <cstdint>
      27              : #include <utility>
      28              : 
      29              : namespace llvm {
      30              : 
      31              : class BasicBlock;
      32              : class DataLayout;
      33              : class DbgMarker;
      34              : class FastMathFlags;
      35              : class MDNode;
      36              : class Module;
      37              : struct AAMDNodes;
      38              : class DbgMarker;
      39              : class DbgRecord;
      40              : 
      41              : template <> struct ilist_alloc_traits<Instruction> {
      42              :   static inline void deleteNode(Instruction *V);
      43              : };
      44              : 
      45              : iterator_range<simple_ilist<DbgRecord>::iterator>
      46              : getDbgRecordRange(DbgMarker *);
      47              : 
      48              : class InsertPosition {
      49              :   using InstListType = SymbolTableList<Instruction, ilist_iterator_bits<true>,
      50              :                                        ilist_parent<BasicBlock>>;
      51              :   InstListType::iterator InsertAt;
      52              : 
      53              : public:
      54            0 :   InsertPosition(std::nullptr_t) : InsertAt() {}
      55              :   // LLVM_DEPRECATED("Use BasicBlock::iterators for insertion instead",
      56              :   // "BasicBlock::iterator")
      57              :   InsertPosition(Instruction *InsertBefore);
      58              :   InsertPosition(BasicBlock *InsertAtEnd);
      59              :   InsertPosition(InstListType::iterator InsertAt) : InsertAt(InsertAt) {}
      60              :   operator InstListType::iterator() const { return InsertAt; }
      61              :   bool isValid() const { return InsertAt.isValid(); }
      62              :   BasicBlock *getBasicBlock() { return InsertAt.getNodeParent(); }
      63              : };
      64              : 
      65              : class Instruction : public User,
      66              :                     public ilist_node_with_parent<Instruction, BasicBlock,
      67              :                                                   ilist_iterator_bits<true>,
      68              :                                                   ilist_parent<BasicBlock>> {
      69              : public:
      70              :   using InstListType = SymbolTableList<Instruction, ilist_iterator_bits<true>,
      71              :                                        ilist_parent<BasicBlock>>;
      72              : 
      73              : private:
      74              :   DebugLoc DbgLoc;                         // 'dbg' Metadata cache.
      75              : 
      76              :   /// Relative order of this instruction in its parent basic block. Used for
      77              :   /// O(1) local dominance checks between instructions.
      78              :   mutable unsigned Order = 0;
      79              : 
      80              : public:
      81              :   /// Optional marker recording the position for debugging information that
      82              :   /// takes effect immediately before this instruction. Null unless there is
      83              :   /// debugging information present.
      84              :   DbgMarker *DebugMarker = nullptr;
      85              : 
      86              :   /// Clone any debug-info attached to \p From onto this instruction. Used to
      87              :   /// copy debugging information from one block to another, when copying entire
      88              :   /// blocks. \see DebugProgramInstruction.h , because the ordering of
      89              :   /// DbgRecords is still important, fine grain control of which instructions
      90              :   /// are moved and where they go is necessary.
      91              :   /// \p From The instruction to clone debug-info from.
      92              :   /// \p from_here Optional iterator to limit DbgRecords cloned to be a range
      93              :   /// from
      94              :   ///    from_here to end().
      95              :   /// \p InsertAtHead Whether the cloned DbgRecords should be placed at the end
      96              :   ///    or the beginning of existing DbgRecords attached to this.
      97              :   /// \returns A range over the newly cloned DbgRecords.
      98              :   iterator_range<simple_ilist<DbgRecord>::iterator> cloneDebugInfoFrom(
      99              :       const Instruction *From,
     100              :       std::optional<simple_ilist<DbgRecord>::iterator> FromHere = std::nullopt,
     101              :       bool InsertAtHead = false);
     102              : 
     103              :   /// Return a range over the DbgRecords attached to this instruction.
     104              :   iterator_range<simple_ilist<DbgRecord>::iterator> getDbgRecordRange() const {
     105              :     return llvm::getDbgRecordRange(DebugMarker);
     106              :   }
     107              : 
     108              :   /// Return an iterator to the position of the "Next" DbgRecord after this
     109              :   /// instruction, or std::nullopt. This is the position to pass to
     110              :   /// BasicBlock::reinsertInstInDbgRecords when re-inserting an instruction.
     111              :   std::optional<simple_ilist<DbgRecord>::iterator> getDbgReinsertionPosition();
     112              : 
     113              :   /// Returns true if any DbgRecords are attached to this instruction.
     114              :   bool hasDbgRecords() const;
     115              : 
     116              :   /// Transfer any DbgRecords on the position \p It onto this instruction,
     117              :   /// by simply adopting the sequence of DbgRecords (which is efficient) if
     118              :   /// possible, by merging two sequences otherwise.
     119              :   void adoptDbgRecords(BasicBlock *BB, InstListType::iterator It,
     120              :                        bool InsertAtHead);
     121              : 
     122              :   /// Erase any DbgRecords attached to this instruction.
     123              :   void dropDbgRecords();
     124              : 
     125              :   /// Erase a single DbgRecord \p I that is attached to this instruction.
     126              :   void dropOneDbgRecord(DbgRecord *I);
     127              : 
     128              :   /// Handle the debug-info implications of this instruction being removed. Any
     129              :   /// attached DbgRecords need to "fall" down onto the next instruction.
     130              :   void handleMarkerRemoval();
     131              : 
     132              : protected:
     133              :   // The 15 first bits of `Value::SubclassData` are available for subclasses of
     134              :   // `Instruction` to use.
     135              :   using OpaqueField = Bitfield::Element<uint16_t, 0, 15>;
     136              : 
     137              :   // Template alias so that all Instruction storing alignment use the same
     138              :   // definiton.
     139              :   // Valid alignments are powers of two from 2^0 to 2^MaxAlignmentExponent =
     140              :   // 2^32. We store them as Log2(Alignment), so we need 6 bits to encode the 33
     141              :   // possible values.
     142              :   template <unsigned Offset>
     143              :   using AlignmentBitfieldElementT =
     144              :       typename Bitfield::Element<unsigned, Offset, 6,
     145              :                                  Value::MaxAlignmentExponent>;
     146              : 
     147              :   template <unsigned Offset>
     148              :   using BoolBitfieldElementT = typename Bitfield::Element<bool, Offset, 1>;
     149              : 
     150              :   template <unsigned Offset>
     151              :   using AtomicOrderingBitfieldElementT =
     152              :       typename Bitfield::Element<AtomicOrdering, Offset, 3,
     153              :                                  AtomicOrdering::LAST>;
     154              : 
     155              : private:
     156              :   // The last bit is used to store whether the instruction has metadata attached
     157              :   // or not.
     158              :   using HasMetadataField = Bitfield::Element<bool, 15, 1>;
     159              : 
     160              : protected:
     161              :   ~Instruction(); // Use deleteValue() to delete a generic Instruction.
     162              : 
     163              : public:
     164              :   Instruction(const Instruction &) = delete;
     165              :   Instruction &operator=(const Instruction &) = delete;
     166              : 
     167              :   /// Specialize the methods defined in Value, as we know that an instruction
     168              :   /// can only be used by other instructions.
     169              :   Instruction       *user_back()       { return cast<Instruction>(*user_begin());}
     170              :   const Instruction *user_back() const { return cast<Instruction>(*user_begin());}
     171              : 
     172              :   /// Return the module owning the function this instruction belongs to
     173              :   /// or nullptr it the function does not have a module.
     174              :   ///
     175              :   /// Note: this is undefined behavior if the instruction does not have a
     176              :   /// parent, or the parent basic block does not have a parent function.
     177              :   const Module *getModule() const;
     178              :   Module *getModule() {
     179              :     return const_cast<Module *>(
     180              :                            static_cast<const Instruction *>(this)->getModule());
     181              :   }
     182              : 
     183              :   /// Return the function this instruction belongs to.
     184              :   ///
     185              :   /// Note: it is undefined behavior to call this on an instruction not
     186              :   /// currently inserted into a function.
     187              :   const Function *getFunction() const;
     188              :   Function *getFunction() {
     189              :     return const_cast<Function *>(
     190              :                          static_cast<const Instruction *>(this)->getFunction());
     191              :   }
     192              : 
     193              :   /// Get the data layout of the module this instruction belongs to.
     194              :   ///
     195              :   /// Requires the instruction to have a parent module.
     196              :   const DataLayout &getDataLayout() const;
     197              : 
     198              :   /// This method unlinks 'this' from the containing basic block, but does not
     199              :   /// delete it.
     200              :   void removeFromParent();
     201              : 
     202              :   /// This method unlinks 'this' from the containing basic block and deletes it.
     203              :   ///
     204              :   /// \returns an iterator pointing to the element after the erased one
     205              :   InstListType::iterator eraseFromParent();
     206              : 
     207              :   /// Insert an unlinked instruction into a basic block immediately before
     208              :   /// the specified instruction.
     209              :   void insertBefore(Instruction *InsertPos);
     210              :   void insertBefore(InstListType::iterator InsertPos);
     211              : 
     212              :   /// Insert an unlinked instruction into a basic block immediately after the
     213              :   /// specified instruction.
     214              :   void insertAfter(Instruction *InsertPos);
     215              : 
     216              :   /// Inserts an unlinked instruction into \p ParentBB at position \p It and
     217              :   /// returns the iterator of the inserted instruction.
     218              :   InstListType::iterator insertInto(BasicBlock *ParentBB,
     219              :                                     InstListType::iterator It);
     220              : 
     221              :   void insertBefore(BasicBlock &BB, InstListType::iterator InsertPos);
     222              : 
     223              :   /// Unlink this instruction from its current basic block and insert it into
     224              :   /// the basic block that MovePos lives in, right before MovePos.
     225              :   void moveBefore(Instruction *MovePos);
     226              : 
     227              :   /// Perform a \ref moveBefore operation, while signalling that the caller
     228              :   /// intends to preserve the original ordering of instructions. This implicitly
     229              :   /// means that any adjacent debug-info should move with this instruction.
     230              :   /// This method is currently a no-op placeholder, but it will become meaningful
     231              :   /// when the "RemoveDIs" project is enabled.
     232              :   void moveBeforePreserving(Instruction *MovePos);
     233              : 
     234              : private:
     235              :   /// RemoveDIs project: all other moves implemented with this method,
     236              :   /// centralising debug-info updates into one place.
     237              :   void moveBeforeImpl(BasicBlock &BB, InstListType::iterator I, bool Preserve);
     238              : 
     239              : public:
     240              :   /// Unlink this instruction and insert into BB before I.
     241              :   ///
     242              :   /// \pre I is a valid iterator into BB.
     243              :   void moveBefore(BasicBlock &BB, InstListType::iterator I);
     244              : 
     245              :   /// (See other overload for moveBeforePreserving).
     246              :   void moveBeforePreserving(BasicBlock &BB, InstListType::iterator I);
     247              : 
     248              :   /// Unlink this instruction from its current basic block and insert it into
     249              :   /// the basic block that MovePos lives in, right after MovePos.
     250              :   void moveAfter(Instruction *MovePos);
     251              : 
     252              :   /// See \ref moveBeforePreserving .
     253              :   void moveAfterPreserving(Instruction *MovePos);
     254              : 
     255              :   /// Given an instruction Other in the same basic block as this instruction,
     256              :   /// return true if this instruction comes before Other. In this worst case,
     257              :   /// this takes linear time in the number of instructions in the block. The
     258              :   /// results are cached, so in common cases when the block remains unmodified,
     259              :   /// it takes constant time.
     260              :   bool comesBefore(const Instruction *Other) const;
     261              : 
     262              :   /// Get the first insertion point at which the result of this instruction
     263              :   /// is defined. This is *not* the directly following instruction in a number
     264              :   /// of cases, e.g. phi nodes or terminators that return values. This function
     265              :   /// may return null if the insertion after the definition is not possible,
     266              :   /// e.g. due to a catchswitch terminator.
     267              :   std::optional<InstListType::iterator> getInsertionPointAfterDef();
     268              : 
     269              :   //===--------------------------------------------------------------------===//
     270              :   // Subclass classification.
     271              :   //===--------------------------------------------------------------------===//
     272              : 
     273              :   /// Returns a member of one of the enums like Instruction::Add.
     274       345154 :   unsigned getOpcode() const { return getValueID() - InstructionVal; }
     275              : 
     276              :   const char *getOpcodeName() const { return getOpcodeName(getOpcode()); }
     277              :   bool isTerminator() const { return isTerminator(getOpcode()); }
     278              :   bool isUnaryOp() const { return isUnaryOp(getOpcode()); }
     279              :   bool isBinaryOp() const { return isBinaryOp(getOpcode()); }
     280              :   bool isIntDivRem() const { return isIntDivRem(getOpcode()); }
     281              :   bool isShift() const { return isShift(getOpcode()); }
     282              :   bool isCast() const { return isCast(getOpcode()); }
     283              :   bool isFuncletPad() const { return isFuncletPad(getOpcode()); }
     284              :   bool isSpecialTerminator() const { return isSpecialTerminator(getOpcode()); }
     285              : 
     286              :   /// It checks if this instruction is the only user of at least one of
     287              :   /// its operands.
     288              :   bool isOnlyUserOfAnyOperand();
     289              : 
     290              :   static const char *getOpcodeName(unsigned Opcode);
     291              : 
     292              :   static inline bool isTerminator(unsigned Opcode) {
     293              :     return Opcode >= TermOpsBegin && Opcode < TermOpsEnd;
     294              :   }
     295              : 
     296              :   static inline bool isUnaryOp(unsigned Opcode) {
     297              :     return Opcode >= UnaryOpsBegin && Opcode < UnaryOpsEnd;
     298              :   }
     299              :   static inline bool isBinaryOp(unsigned Opcode) {
     300              :     return Opcode >= BinaryOpsBegin && Opcode < BinaryOpsEnd;
     301              :   }
     302              : 
     303              :   static inline bool isIntDivRem(unsigned Opcode) {
     304              :     return Opcode == UDiv || Opcode == SDiv || Opcode == URem || Opcode == SRem;
     305              :   }
     306              : 
     307              :   /// Determine if the Opcode is one of the shift instructions.
     308              :   static inline bool isShift(unsigned Opcode) {
     309              :     return Opcode >= Shl && Opcode <= AShr;
     310              :   }
     311              : 
     312              :   /// Return true if this is a logical shift left or a logical shift right.
     313              :   inline bool isLogicalShift() const {
     314              :     return getOpcode() == Shl || getOpcode() == LShr;
     315              :   }
     316              : 
     317              :   /// Return true if this is an arithmetic shift right.
     318              :   inline bool isArithmeticShift() const {
     319              :     return getOpcode() == AShr;
     320              :   }
     321              : 
     322              :   /// Determine if the Opcode is and/or/xor.
     323              :   static inline bool isBitwiseLogicOp(unsigned Opcode) {
     324              :     return Opcode == And || Opcode == Or || Opcode == Xor;
     325              :   }
     326              : 
     327              :   /// Return true if this is and/or/xor.
     328              :   inline bool isBitwiseLogicOp() const {
     329              :     return isBitwiseLogicOp(getOpcode());
     330              :   }
     331              : 
     332              :   /// Determine if the Opcode is one of the CastInst instructions.
     333              :   static inline bool isCast(unsigned Opcode) {
     334              :     return Opcode >= CastOpsBegin && Opcode < CastOpsEnd;
     335              :   }
     336              : 
     337              :   /// Determine if the Opcode is one of the FuncletPadInst instructions.
     338              :   static inline bool isFuncletPad(unsigned Opcode) {
     339              :     return Opcode >= FuncletPadOpsBegin && Opcode < FuncletPadOpsEnd;
     340              :   }
     341              : 
     342              :   /// Returns true if the Opcode is a "special" terminator that does more than
     343              :   /// branch to a successor (e.g. have a side effect or return a value).
     344              :   static inline bool isSpecialTerminator(unsigned Opcode) {
     345              :     switch (Opcode) {
     346              :     case Instruction::CatchSwitch:
     347              :     case Instruction::CatchRet:
     348              :     case Instruction::CleanupRet:
     349              :     case Instruction::Invoke:
     350              :     case Instruction::Resume:
     351              :     case Instruction::CallBr:
     352              :       return true;
     353              :     default:
     354              :       return false;
     355              :     }
     356              :   }
     357              : 
     358              :   //===--------------------------------------------------------------------===//
     359              :   // Metadata manipulation.
     360              :   //===--------------------------------------------------------------------===//
     361              : 
     362              :   /// Return true if this instruction has any metadata attached to it.
     363              :   bool hasMetadata() const { return DbgLoc || Value::hasMetadata(); }
     364              : 
     365              :   /// Return true if this instruction has metadata attached to it other than a
     366              :   /// debug location.
     367              :   bool hasMetadataOtherThanDebugLoc() const { return Value::hasMetadata(); }
     368              : 
     369              :   /// Return true if this instruction has the given type of metadata attached.
     370              :   bool hasMetadata(unsigned KindID) const {
     371              :     return getMetadata(KindID) != nullptr;
     372              :   }
     373              : 
     374              :   /// Return true if this instruction has the given type of metadata attached.
     375              :   bool hasMetadata(StringRef Kind) const {
     376              :     return getMetadata(Kind) != nullptr;
     377              :   }
     378              : 
     379              :   /// Get the metadata of given kind attached to this Instruction.
     380              :   /// If the metadata is not found then return null.
     381              :   MDNode *getMetadata(unsigned KindID) const {
     382              :     // Handle 'dbg' as a special case since it is not stored in the hash table.
     383              :     if (KindID == LLVMContext::MD_dbg)
     384              :       return DbgLoc.getAsMDNode();
     385              :     return Value::getMetadata(KindID);
     386              :   }
     387              : 
     388              :   /// Get the metadata of given kind attached to this Instruction.
     389              :   /// If the metadata is not found then return null.
     390              :   MDNode *getMetadata(StringRef Kind) const {
     391              :     if (!hasMetadata()) return nullptr;
     392              :     return getMetadataImpl(Kind);
     393              :   }
     394              : 
     395              :   /// Get all metadata attached to this Instruction. The first element of each
     396              :   /// pair returned is the KindID, the second element is the metadata value.
     397              :   /// This list is returned sorted by the KindID.
     398              :   void
     399              :   getAllMetadata(SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const {
     400              :     if (hasMetadata())
     401              :       getAllMetadataImpl(MDs);
     402              :   }
     403              : 
     404              :   /// This does the same thing as getAllMetadata, except that it filters out the
     405              :   /// debug location.
     406              :   void getAllMetadataOtherThanDebugLoc(
     407              :       SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const {
     408              :     Value::getAllMetadata(MDs);
     409              :   }
     410              : 
     411              :   /// Set the metadata of the specified kind to the specified node. This updates
     412              :   /// or replaces metadata if already present, or removes it if Node is null.
     413              :   void setMetadata(unsigned KindID, MDNode *Node);
     414              :   void setMetadata(StringRef Kind, MDNode *Node);
     415              : 
     416              :   /// Copy metadata from \p SrcInst to this instruction. \p WL, if not empty,
     417              :   /// specifies the list of meta data that needs to be copied. If \p WL is
     418              :   /// empty, all meta data will be copied.
     419              :   void copyMetadata(const Instruction &SrcInst,
     420              :                     ArrayRef<unsigned> WL = ArrayRef<unsigned>());
     421              : 
     422              :   /// Erase all metadata that matches the predicate.
     423              :   void eraseMetadataIf(function_ref<bool(unsigned, MDNode *)> Pred);
     424              : 
     425              :   /// If the instruction has "branch_weights" MD_prof metadata and the MDNode
     426              :   /// has three operands (including name string), swap the order of the
     427              :   /// metadata.
     428              :   void swapProfMetadata();
     429              : 
     430              :   /// Drop all unknown metadata except for debug locations.
     431              :   /// @{
     432              :   /// Passes are required to drop metadata they don't understand. This is a
     433              :   /// convenience method for passes to do so.
     434              :   /// dropUBImplyingAttrsAndUnknownMetadata should be used instead of
     435              :   /// this API if the Instruction being modified is a call.
     436              :   void dropUnknownNonDebugMetadata(ArrayRef<unsigned> KnownIDs = std::nullopt);
     437              :   /// @}
     438              : 
     439              :   /// Adds an !annotation metadata node with \p Annotation to this instruction.
     440              :   /// If this instruction already has !annotation metadata, append \p Annotation
     441              :   /// to the existing node.
     442              :   void addAnnotationMetadata(StringRef Annotation);
     443              :   /// Adds an !annotation metadata node with an array of \p Annotations
     444              :   /// as a tuple to this instruction. If this instruction already has
     445              :   /// !annotation metadata, append the tuple to
     446              :   /// the existing node.
     447              :   void addAnnotationMetadata(SmallVector<StringRef> Annotations);
     448              :   /// Returns the AA metadata for this instruction.
     449              :   AAMDNodes getAAMetadata() const;
     450              : 
     451              :   /// Sets the AA metadata on this instruction from the AAMDNodes structure.
     452              :   void setAAMetadata(const AAMDNodes &N);
     453              : 
     454              :   /// Sets the nosanitize metadata on this instruction.
     455              :   void setNoSanitizeMetadata();
     456              : 
     457              :   /// Retrieve total raw weight values of a branch.
     458              :   /// Returns true on success with profile total weights filled in.
     459              :   /// Returns false if no metadata was found.
     460              :   bool extractProfTotalWeight(uint64_t &TotalVal) const;
     461              : 
     462              :   /// Set the debug location information for this instruction.
     463              :   void setDebugLoc(DebugLoc Loc) { DbgLoc = std::move(Loc); }
     464              : 
     465              :   /// Return the debug location for this node as a DebugLoc.
     466              :   const DebugLoc &getDebugLoc() const { return DbgLoc; }
     467              : 
     468              :   /// Fetch the debug location for this node, unless this is a debug intrinsic,
     469              :   /// in which case fetch the debug location of the next non-debug node.
     470              :   const DebugLoc &getStableDebugLoc() const;
     471              : 
     472              :   /// Set or clear the nuw flag on this instruction, which must be an operator
     473              :   /// which supports this flag. See LangRef.html for the meaning of this flag.
     474              :   void setHasNoUnsignedWrap(bool b = true);
     475              : 
     476              :   /// Set or clear the nsw flag on this instruction, which must be an operator
     477              :   /// which supports this flag. See LangRef.html for the meaning of this flag.
     478              :   void setHasNoSignedWrap(bool b = true);
     479              : 
     480              :   /// Set or clear the exact flag on this instruction, which must be an operator
     481              :   /// which supports this flag. See LangRef.html for the meaning of this flag.
     482              :   void setIsExact(bool b = true);
     483              : 
     484              :   /// Set or clear the nneg flag on this instruction, which must be a zext
     485              :   /// instruction.
     486              :   void setNonNeg(bool b = true);
     487              : 
     488              :   /// Determine whether the no unsigned wrap flag is set.
     489              :   bool hasNoUnsignedWrap() const LLVM_READONLY;
     490              : 
     491              :   /// Determine whether the no signed wrap flag is set.
     492              :   bool hasNoSignedWrap() const LLVM_READONLY;
     493              : 
     494              :   /// Determine whether the the nneg flag is set.
     495              :   bool hasNonNeg() const LLVM_READONLY;
     496              : 
     497              :   /// Return true if this operator has flags which may cause this instruction
     498              :   /// to evaluate to poison despite having non-poison inputs.
     499              :   bool hasPoisonGeneratingFlags() const LLVM_READONLY;
     500              : 
     501              :   /// Drops flags that may cause this instruction to evaluate to poison despite
     502              :   /// having non-poison inputs.
     503              :   void dropPoisonGeneratingFlags();
     504              : 
     505              :   /// Return true if this instruction has poison-generating metadata.
     506              :   bool hasPoisonGeneratingMetadata() const LLVM_READONLY;
     507              : 
     508              :   /// Drops metadata that may generate poison.
     509              :   void dropPoisonGeneratingMetadata();
     510              : 
     511              :   /// Return true if this instruction has poison-generating attribute.
     512              :   bool hasPoisonGeneratingReturnAttributes() const LLVM_READONLY;
     513              : 
     514              :   /// Drops return attributes that may generate poison.
     515              :   void dropPoisonGeneratingReturnAttributes();
     516              : 
     517              :   /// Return true if this instruction has poison-generating flags,
     518              :   /// return attributes or metadata.
     519              :   bool hasPoisonGeneratingAnnotations() const {
     520              :     return hasPoisonGeneratingFlags() ||
     521              :            hasPoisonGeneratingReturnAttributes() ||
     522              :            hasPoisonGeneratingMetadata();
     523              :   }
     524              : 
     525              :   /// Drops flags, return attributes and metadata that may generate poison.
     526              :   void dropPoisonGeneratingAnnotations() {
     527              :     dropPoisonGeneratingFlags();
     528              :     dropPoisonGeneratingReturnAttributes();
     529              :     dropPoisonGeneratingMetadata();
     530              :   }
     531              : 
     532              :   /// This function drops non-debug unknown metadata (through
     533              :   /// dropUnknownNonDebugMetadata). For calls, it also drops parameter and
     534              :   /// return attributes that can cause undefined behaviour. Both of these should
     535              :   /// be done by passes which move instructions in IR.
     536              :   void dropUBImplyingAttrsAndUnknownMetadata(ArrayRef<unsigned> KnownIDs = {});
     537              : 
     538              :   /// Drop any attributes or metadata that can cause immediate undefined
     539              :   /// behavior. Retain other attributes/metadata on a best-effort basis.
     540              :   /// This should be used when speculating instructions.
     541              :   void dropUBImplyingAttrsAndMetadata();
     542              : 
     543              :   /// Determine whether the exact flag is set.
     544              :   bool isExact() const LLVM_READONLY;
     545              : 
     546              :   /// Set or clear all fast-math-flags on this instruction, which must be an
     547              :   /// operator which supports this flag. See LangRef.html for the meaning of
     548              :   /// this flag.
     549              :   void setFast(bool B);
     550              : 
     551              :   /// Set or clear the reassociation flag on this instruction, which must be
     552              :   /// an operator which supports this flag. See LangRef.html for the meaning of
     553              :   /// this flag.
     554              :   void setHasAllowReassoc(bool B);
     555              : 
     556              :   /// Set or clear the no-nans flag on this instruction, which must be an
     557              :   /// operator which supports this flag. See LangRef.html for the meaning of
     558              :   /// this flag.
     559              :   void setHasNoNaNs(bool B);
     560              : 
     561              :   /// Set or clear the no-infs flag on this instruction, which must be an
     562              :   /// operator which supports this flag. See LangRef.html for the meaning of
     563              :   /// this flag.
     564              :   void setHasNoInfs(bool B);
     565              : 
     566              :   /// Set or clear the no-signed-zeros flag on this instruction, which must be
     567              :   /// an operator which supports this flag. See LangRef.html for the meaning of
     568              :   /// this flag.
     569              :   void setHasNoSignedZeros(bool B);
     570              : 
     571              :   /// Set or clear the allow-reciprocal flag on this instruction, which must be
     572              :   /// an operator which supports this flag. See LangRef.html for the meaning of
     573              :   /// this flag.
     574              :   void setHasAllowReciprocal(bool B);
     575              : 
     576              :   /// Set or clear the allow-contract flag on this instruction, which must be
     577              :   /// an operator which supports this flag. See LangRef.html for the meaning of
     578              :   /// this flag.
     579              :   void setHasAllowContract(bool B);
     580              : 
     581              :   /// Set or clear the approximate-math-functions flag on this instruction,
     582              :   /// which must be an operator which supports this flag. See LangRef.html for
     583              :   /// the meaning of this flag.
     584              :   void setHasApproxFunc(bool B);
     585              : 
     586              :   /// Convenience function for setting multiple fast-math flags on this
     587              :   /// instruction, which must be an operator which supports these flags. See
     588              :   /// LangRef.html for the meaning of these flags.
     589              :   void setFastMathFlags(FastMathFlags FMF);
     590              : 
     591              :   /// Convenience function for transferring all fast-math flag values to this
     592              :   /// instruction, which must be an operator which supports these flags. See
     593              :   /// LangRef.html for the meaning of these flags.
     594              :   void copyFastMathFlags(FastMathFlags FMF);
     595              : 
     596              :   /// Determine whether all fast-math-flags are set.
     597              :   bool isFast() const LLVM_READONLY;
     598              : 
     599              :   /// Determine whether the allow-reassociation flag is set.
     600              :   bool hasAllowReassoc() const LLVM_READONLY;
     601              : 
     602              :   /// Determine whether the no-NaNs flag is set.
     603              :   bool hasNoNaNs() const LLVM_READONLY;
     604              : 
     605              :   /// Determine whether the no-infs flag is set.
     606              :   bool hasNoInfs() const LLVM_READONLY;
     607              : 
     608              :   /// Determine whether the no-signed-zeros flag is set.
     609              :   bool hasNoSignedZeros() const LLVM_READONLY;
     610              : 
     611              :   /// Determine whether the allow-reciprocal flag is set.
     612              :   bool hasAllowReciprocal() const LLVM_READONLY;
     613              : 
     614              :   /// Determine whether the allow-contract flag is set.
     615              :   bool hasAllowContract() const LLVM_READONLY;
     616              : 
     617              :   /// Determine whether the approximate-math-functions flag is set.
     618              :   bool hasApproxFunc() const LLVM_READONLY;
     619              : 
     620              :   /// Convenience function for getting all the fast-math flags, which must be an
     621              :   /// operator which supports these flags. See LangRef.html for the meaning of
     622              :   /// these flags.
     623              :   FastMathFlags getFastMathFlags() const LLVM_READONLY;
     624              : 
     625              :   /// Copy I's fast-math flags
     626              :   void copyFastMathFlags(const Instruction *I);
     627              : 
     628              :   /// Convenience method to copy supported exact, fast-math, and (optionally)
     629              :   /// wrapping flags from V to this instruction.
     630              :   void copyIRFlags(const Value *V, bool IncludeWrapFlags = true);
     631              : 
     632              :   /// Logical 'and' of any supported wrapping, exact, and fast-math flags of
     633              :   /// V and this instruction.
     634              :   void andIRFlags(const Value *V);
     635              : 
     636              :   /// Merge 2 debug locations and apply it to the Instruction. If the
     637              :   /// instruction is a CallIns, we need to traverse the inline chain to find
     638              :   /// the common scope. This is not efficient for N-way merging as each time
     639              :   /// you merge 2 iterations, you need to rebuild the hashmap to find the
     640              :   /// common scope. However, we still choose this API because:
     641              :   ///  1) Simplicity: it takes 2 locations instead of a list of locations.
     642              :   ///  2) In worst case, it increases the complexity from O(N*I) to
     643              :   ///     O(2*N*I), where N is # of Instructions to merge, and I is the
     644              :   ///     maximum level of inline stack. So it is still linear.
     645              :   ///  3) Merging of call instructions should be extremely rare in real
     646              :   ///     applications, thus the N-way merging should be in code path.
     647              :   /// The DebugLoc attached to this instruction will be overwritten by the
     648              :   /// merged DebugLoc.
     649              :   void applyMergedLocation(DILocation *LocA, DILocation *LocB);
     650              : 
     651              :   /// Updates the debug location given that the instruction has been hoisted
     652              :   /// from a block to a predecessor of that block.
     653              :   /// Note: it is undefined behavior to call this on an instruction not
     654              :   /// currently inserted into a function.
     655              :   void updateLocationAfterHoist();
     656              : 
     657              :   /// Drop the instruction's debug location. This does not guarantee removal
     658              :   /// of the !dbg source location attachment, as it must set a line 0 location
     659              :   /// with scope information attached on call instructions. To guarantee
     660              :   /// removal of the !dbg attachment, use the \ref setDebugLoc() API.
     661              :   /// Note: it is undefined behavior to call this on an instruction not
     662              :   /// currently inserted into a function.
     663              :   void dropLocation();
     664              : 
     665              :   /// Merge the DIAssignID metadata from this instruction and those attached to
     666              :   /// instructions in \p SourceInstructions. This process performs a RAUW on
     667              :   /// the MetadataAsValue uses of the merged DIAssignID nodes. Not every
     668              :   /// instruction in \p SourceInstructions needs to have DIAssignID
     669              :   /// metadata. If none of them do then nothing happens. If this instruction
     670              :   /// does not have a DIAssignID attachment but at least one in \p
     671              :   /// SourceInstructions does then the merged one will be attached to
     672              :   /// it. However, instructions without attachments in \p SourceInstructions
     673              :   /// are not modified.
     674              :   void mergeDIAssignID(ArrayRef<const Instruction *> SourceInstructions);
     675              : 
     676              : private:
     677              :   // These are all implemented in Metadata.cpp.
     678              :   MDNode *getMetadataImpl(StringRef Kind) const;
     679              :   void
     680              :   getAllMetadataImpl(SmallVectorImpl<std::pair<unsigned, MDNode *>> &) const;
     681              : 
     682              :   /// Update the LLVMContext ID-to-Instruction(s) mapping. If \p ID is nullptr
     683              :   /// then clear the mapping for this instruction.
     684              :   void updateDIAssignIDMapping(DIAssignID *ID);
     685              : 
     686              : public:
     687              :   //===--------------------------------------------------------------------===//
     688              :   // Predicates and helper methods.
     689              :   //===--------------------------------------------------------------------===//
     690              : 
     691              :   /// Return true if the instruction is associative:
     692              :   ///
     693              :   ///   Associative operators satisfy:  x op (y op z) === (x op y) op z
     694              :   ///
     695              :   /// In LLVM, the Add, Mul, And, Or, and Xor operators are associative.
     696              :   ///
     697              :   bool isAssociative() const LLVM_READONLY;
     698              :   static bool isAssociative(unsigned Opcode) {
     699              :     return Opcode == And || Opcode == Or || Opcode == Xor ||
     700              :            Opcode == Add || Opcode == Mul;
     701              :   }
     702              : 
     703              :   /// Return true if the instruction is commutative:
     704              :   ///
     705              :   ///   Commutative operators satisfy: (x op y) === (y op x)
     706              :   ///
     707              :   /// In LLVM, these are the commutative operators, plus SetEQ and SetNE, when
     708              :   /// applied to any type.
     709              :   ///
     710              :   bool isCommutative() const LLVM_READONLY;
     711              :   static bool isCommutative(unsigned Opcode) {
     712              :     switch (Opcode) {
     713              :     case Add: case FAdd:
     714              :     case Mul: case FMul:
     715              :     case And: case Or: case Xor:
     716              :       return true;
     717              :     default:
     718              :       return false;
     719              :   }
     720              :   }
     721              : 
     722              :   /// Return true if the instruction is idempotent:
     723              :   ///
     724              :   ///   Idempotent operators satisfy:  x op x === x
     725              :   ///
     726              :   /// In LLVM, the And and Or operators are idempotent.
     727              :   ///
     728              :   bool isIdempotent() const { return isIdempotent(getOpcode()); }
     729              :   static bool isIdempotent(unsigned Opcode) {
     730              :     return Opcode == And || Opcode == Or;
     731              :   }
     732              : 
     733              :   /// Return true if the instruction is nilpotent:
     734              :   ///
     735              :   ///   Nilpotent operators satisfy:  x op x === Id,
     736              :   ///
     737              :   ///   where Id is the identity for the operator, i.e. a constant such that
     738              :   ///     x op Id === x and Id op x === x for all x.
     739              :   ///
     740              :   /// In LLVM, the Xor operator is nilpotent.
     741              :   ///
     742              :   bool isNilpotent() const { return isNilpotent(getOpcode()); }
     743              :   static bool isNilpotent(unsigned Opcode) {
     744              :     return Opcode == Xor;
     745              :   }
     746              : 
     747              :   /// Return true if this instruction may modify memory.
     748              :   bool mayWriteToMemory() const LLVM_READONLY;
     749              : 
     750              :   /// Return true if this instruction may read memory.
     751              :   bool mayReadFromMemory() const LLVM_READONLY;
     752              : 
     753              :   /// Return true if this instruction may read or write memory.
     754              :   bool mayReadOrWriteMemory() const {
     755              :     return mayReadFromMemory() || mayWriteToMemory();
     756              :   }
     757              : 
     758              :   /// Return true if this instruction has an AtomicOrdering of unordered or
     759              :   /// higher.
     760              :   bool isAtomic() const LLVM_READONLY;
     761              : 
     762              :   /// Return true if this atomic instruction loads from memory.
     763              :   bool hasAtomicLoad() const LLVM_READONLY;
     764              : 
     765              :   /// Return true if this atomic instruction stores to memory.
     766              :   bool hasAtomicStore() const LLVM_READONLY;
     767              : 
     768              :   /// Return true if this instruction has a volatile memory access.
     769              :   bool isVolatile() const LLVM_READONLY;
     770              : 
     771              :   /// Return the type this instruction accesses in memory, if any.
     772              :   Type *getAccessType() const LLVM_READONLY;
     773              : 
     774              :   /// Return true if this instruction may throw an exception.
     775              :   ///
     776              :   /// If IncludePhaseOneUnwind is set, this will also include cases where
     777              :   /// phase one unwinding may unwind past this frame due to skipping of
     778              :   /// cleanup landingpads.
     779              :   bool mayThrow(bool IncludePhaseOneUnwind = false) const LLVM_READONLY;
     780              : 
     781              :   /// Return true if this instruction behaves like a memory fence: it can load
     782              :   /// or store to memory location without being given a memory location.
     783              :   bool isFenceLike() const {
     784              :     switch (getOpcode()) {
     785              :     default:
     786              :       return false;
     787              :     // This list should be kept in sync with the list in mayWriteToMemory for
     788              :     // all opcodes which don't have a memory location.
     789              :     case Instruction::Fence:
     790              :     case Instruction::CatchPad:
     791              :     case Instruction::CatchRet:
     792              :     case Instruction::Call:
     793              :     case Instruction::Invoke:
     794              :       return true;
     795              :     }
     796              :   }
     797              : 
     798              :   /// Return true if the instruction may have side effects.
     799              :   ///
     800              :   /// Side effects are:
     801              :   ///  * Writing to memory.
     802              :   ///  * Unwinding.
     803              :   ///  * Not returning (e.g. an infinite loop).
     804              :   ///
     805              :   /// Note that this does not consider malloc and alloca to have side
     806              :   /// effects because the newly allocated memory is completely invisible to
     807              :   /// instructions which don't use the returned value.  For cases where this
     808              :   /// matters, isSafeToSpeculativelyExecute may be more appropriate.
     809              :   bool mayHaveSideEffects() const LLVM_READONLY;
     810              : 
     811              :   /// Return true if the instruction can be removed if the result is unused.
     812              :   ///
     813              :   /// When constant folding some instructions cannot be removed even if their
     814              :   /// results are unused. Specifically terminator instructions and calls that
     815              :   /// may have side effects cannot be removed without semantically changing the
     816              :   /// generated program.
     817              :   bool isSafeToRemove() const LLVM_READONLY;
     818              : 
     819              :   /// Return true if the instruction will return (unwinding is considered as
     820              :   /// a form of returning control flow here).
     821              :   bool willReturn() const LLVM_READONLY;
     822              : 
     823              :   /// Return true if the instruction is a variety of EH-block.
     824              :   bool isEHPad() const {
     825              :     switch (getOpcode()) {
     826              :     case Instruction::CatchSwitch:
     827              :     case Instruction::CatchPad:
     828              :     case Instruction::CleanupPad:
     829              :     case Instruction::LandingPad:
     830              :       return true;
     831              :     default:
     832              :       return false;
     833              :     }
     834              :   }
     835              : 
     836              :   /// Return true if the instruction is a llvm.lifetime.start or
     837              :   /// llvm.lifetime.end marker.
     838              :   bool isLifetimeStartOrEnd() const LLVM_READONLY;
     839              : 
     840              :   /// Return true if the instruction is a llvm.launder.invariant.group or
     841              :   /// llvm.strip.invariant.group.
     842              :   bool isLaunderOrStripInvariantGroup() const LLVM_READONLY;
     843              : 
     844              :   /// Return true if the instruction is a DbgInfoIntrinsic or PseudoProbeInst.
     845              :   bool isDebugOrPseudoInst() const LLVM_READONLY;
     846              : 
     847              :   /// Return a pointer to the next non-debug instruction in the same basic
     848              :   /// block as 'this', or nullptr if no such instruction exists. Skip any pseudo
     849              :   /// operations if \c SkipPseudoOp is true.
     850              :   const Instruction *
     851              :   getNextNonDebugInstruction(bool SkipPseudoOp = false) const;
     852              :   Instruction *getNextNonDebugInstruction(bool SkipPseudoOp = false) {
     853              :     return const_cast<Instruction *>(
     854              :         static_cast<const Instruction *>(this)->getNextNonDebugInstruction(
     855              :             SkipPseudoOp));
     856              :   }
     857              : 
     858              :   /// Return a pointer to the previous non-debug instruction in the same basic
     859              :   /// block as 'this', or nullptr if no such instruction exists. Skip any pseudo
     860              :   /// operations if \c SkipPseudoOp is true.
     861              :   const Instruction *
     862              :   getPrevNonDebugInstruction(bool SkipPseudoOp = false) const;
     863              :   Instruction *getPrevNonDebugInstruction(bool SkipPseudoOp = false) {
     864              :     return const_cast<Instruction *>(
     865              :         static_cast<const Instruction *>(this)->getPrevNonDebugInstruction(
     866              :             SkipPseudoOp));
     867              :   }
     868              : 
     869              :   /// Create a copy of 'this' instruction that is identical in all ways except
     870              :   /// the following:
     871              :   ///   * The instruction has no parent
     872              :   ///   * The instruction has no name
     873              :   ///
     874              :   Instruction *clone() const;
     875              : 
     876              :   /// Return true if the specified instruction is exactly identical to the
     877              :   /// current one. This means that all operands match and any extra information
     878              :   /// (e.g. load is volatile) agree.
     879              :   bool isIdenticalTo(const Instruction *I) const LLVM_READONLY;
     880              : 
     881              :   /// This is like isIdenticalTo, except that it ignores the
     882              :   /// SubclassOptionalData flags, which may specify conditions under which the
     883              :   /// instruction's result is undefined.
     884              :   bool isIdenticalToWhenDefined(const Instruction *I) const LLVM_READONLY;
     885              : 
     886              :   /// When checking for operation equivalence (using isSameOperationAs) it is
     887              :   /// sometimes useful to ignore certain attributes.
     888              :   enum OperationEquivalenceFlags {
     889              :     /// Check for equivalence ignoring load/store alignment.
     890              :     CompareIgnoringAlignment = 1<<0,
     891              :     /// Check for equivalence treating a type and a vector of that type
     892              :     /// as equivalent.
     893              :     CompareUsingScalarTypes = 1<<1
     894              :   };
     895              : 
     896              :   /// This function determines if the specified instruction executes the same
     897              :   /// operation as the current one. This means that the opcodes, type, operand
     898              :   /// types and any other factors affecting the operation must be the same. This
     899              :   /// is similar to isIdenticalTo except the operands themselves don't have to
     900              :   /// be identical.
     901              :   /// @returns true if the specified instruction is the same operation as
     902              :   /// the current one.
     903              :   /// Determine if one instruction is the same operation as another.
     904              :   bool isSameOperationAs(const Instruction *I, unsigned flags = 0) const LLVM_READONLY;
     905              : 
     906              :   /// This function determines if the speficied instruction has the same
     907              :   /// "special" characteristics as the current one. This means that opcode
     908              :   /// specific details are the same. As a common example, if we are comparing
     909              :   /// loads, then hasSameSpecialState would compare the alignments (among
     910              :   /// other things).
     911              :   /// @returns true if the specific instruction has the same opcde specific
     912              :   /// characteristics as the current one. Determine if one instruction has the
     913              :   /// same state as another.
     914              :   bool hasSameSpecialState(const Instruction *I2,
     915              :                            bool IgnoreAlignment = false) const LLVM_READONLY;
     916              : 
     917              :   /// Return true if there are any uses of this instruction in blocks other than
     918              :   /// the specified block. Note that PHI nodes are considered to evaluate their
     919              :   /// operands in the corresponding predecessor block.
     920              :   bool isUsedOutsideOfBlock(const BasicBlock *BB) const LLVM_READONLY;
     921              : 
     922              :   /// Return the number of successors that this instruction has. The instruction
     923              :   /// must be a terminator.
     924              :   unsigned getNumSuccessors() const LLVM_READONLY;
     925              : 
     926              :   /// Return the specified successor. This instruction must be a terminator.
     927              :   BasicBlock *getSuccessor(unsigned Idx) const LLVM_READONLY;
     928              : 
     929              :   /// Update the specified successor to point at the provided block. This
     930              :   /// instruction must be a terminator.
     931              :   void setSuccessor(unsigned Idx, BasicBlock *BB);
     932              : 
     933              :   /// Replace specified successor OldBB to point at the provided block.
     934              :   /// This instruction must be a terminator.
     935              :   void replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB);
     936              : 
     937              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
     938              :   static bool classof(const Value *V) {
     939              :     return V->getValueID() >= Value::InstructionVal;
     940              :   }
     941              : 
     942              :   //----------------------------------------------------------------------
     943              :   // Exported enumerations.
     944              :   //
     945              :   enum TermOps {       // These terminate basic blocks
     946              : #define  FIRST_TERM_INST(N)             TermOpsBegin = N,
     947              : #define HANDLE_TERM_INST(N, OPC, CLASS) OPC = N,
     948              : #define   LAST_TERM_INST(N)             TermOpsEnd = N+1
     949              : #include "llvm/IR/Instruction.def"
     950              :   };
     951              : 
     952              :   enum UnaryOps {
     953              : #define  FIRST_UNARY_INST(N)             UnaryOpsBegin = N,
     954              : #define HANDLE_UNARY_INST(N, OPC, CLASS) OPC = N,
     955              : #define   LAST_UNARY_INST(N)             UnaryOpsEnd = N+1
     956              : #include "llvm/IR/Instruction.def"
     957              :   };
     958              : 
     959              :   enum BinaryOps {
     960              : #define  FIRST_BINARY_INST(N)             BinaryOpsBegin = N,
     961              : #define HANDLE_BINARY_INST(N, OPC, CLASS) OPC = N,
     962              : #define   LAST_BINARY_INST(N)             BinaryOpsEnd = N+1
     963              : #include "llvm/IR/Instruction.def"
     964              :   };
     965              : 
     966              :   enum MemoryOps {
     967              : #define  FIRST_MEMORY_INST(N)             MemoryOpsBegin = N,
     968              : #define HANDLE_MEMORY_INST(N, OPC, CLASS) OPC = N,
     969              : #define   LAST_MEMORY_INST(N)             MemoryOpsEnd = N+1
     970              : #include "llvm/IR/Instruction.def"
     971              :   };
     972              : 
     973              :   enum CastOps {
     974              : #define  FIRST_CAST_INST(N)             CastOpsBegin = N,
     975              : #define HANDLE_CAST_INST(N, OPC, CLASS) OPC = N,
     976              : #define   LAST_CAST_INST(N)             CastOpsEnd = N+1
     977              : #include "llvm/IR/Instruction.def"
     978              :   };
     979              : 
     980              :   enum FuncletPadOps {
     981              : #define  FIRST_FUNCLETPAD_INST(N)             FuncletPadOpsBegin = N,
     982              : #define HANDLE_FUNCLETPAD_INST(N, OPC, CLASS) OPC = N,
     983              : #define   LAST_FUNCLETPAD_INST(N)             FuncletPadOpsEnd = N+1
     984              : #include "llvm/IR/Instruction.def"
     985              :   };
     986              : 
     987              :   enum OtherOps {
     988              : #define  FIRST_OTHER_INST(N)             OtherOpsBegin = N,
     989              : #define HANDLE_OTHER_INST(N, OPC, CLASS) OPC = N,
     990              : #define   LAST_OTHER_INST(N)             OtherOpsEnd = N+1
     991              : #include "llvm/IR/Instruction.def"
     992              :   };
     993              : 
     994              : private:
     995              :   friend class SymbolTableListTraits<Instruction, ilist_iterator_bits<true>,
     996              :                                      ilist_parent<BasicBlock>>;
     997              :   friend class BasicBlock; // For renumbering.
     998              : 
     999              :   // Shadow Value::setValueSubclassData with a private forwarding method so that
    1000              :   // subclasses cannot accidentally use it.
    1001              :   void setValueSubclassData(unsigned short D) {
    1002              :     Value::setValueSubclassData(D);
    1003              :   }
    1004              : 
    1005              :   unsigned short getSubclassDataFromValue() const {
    1006              :     return Value::getSubclassDataFromValue();
    1007              :   }
    1008              : 
    1009              : protected:
    1010              :   // Instruction subclasses can stick up to 15 bits of stuff into the
    1011              :   // SubclassData field of instruction with these members.
    1012              : 
    1013              :   template <typename BitfieldElement>
    1014              :   typename BitfieldElement::Type getSubclassData() const {
    1015              :     static_assert(
    1016              :         std::is_same<BitfieldElement, HasMetadataField>::value ||
    1017              :             !Bitfield::isOverlapping<BitfieldElement, HasMetadataField>(),
    1018              :         "Must not overlap with the metadata bit");
    1019              :     return Bitfield::get<BitfieldElement>(getSubclassDataFromValue());
    1020              :   }
    1021              : 
    1022              :   template <typename BitfieldElement>
    1023              :   void setSubclassData(typename BitfieldElement::Type Value) {
    1024              :     static_assert(
    1025              :         std::is_same<BitfieldElement, HasMetadataField>::value ||
    1026              :             !Bitfield::isOverlapping<BitfieldElement, HasMetadataField>(),
    1027              :         "Must not overlap with the metadata bit");
    1028              :     auto Storage = getSubclassDataFromValue();
    1029              :     Bitfield::set<BitfieldElement>(Storage, Value);
    1030              :     setValueSubclassData(Storage);
    1031              :   }
    1032              : 
    1033              :   Instruction(Type *Ty, unsigned iType, Use *Ops, unsigned NumOps,
    1034              :               InsertPosition InsertBefore = nullptr);
    1035              : 
    1036              : private:
    1037              :   /// Create a copy of this instruction.
    1038              :   Instruction *cloneImpl() const;
    1039              : };
    1040              : 
    1041              : inline void ilist_alloc_traits<Instruction>::deleteNode(Instruction *V) {
    1042              :   V->deleteValue();
    1043              : }
    1044              : 
    1045              : } // end namespace llvm
    1046              : 
    1047              : #endif // LLVM_IR_INSTRUCTION_H
        

Generated by: LCOV version 2.0-1