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

            Line data    Source code
       1              : //===- llvm/Instructions.h - Instruction subclass definitions ---*- 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 exposes the class definitions of all of the subclasses of the
      10              : // Instruction class.  This is meant to be an easy way to get access to all
      11              : // instruction subclasses.
      12              : //
      13              : //===----------------------------------------------------------------------===//
      14              : 
      15              : #ifndef LLVM_IR_INSTRUCTIONS_H
      16              : #define LLVM_IR_INSTRUCTIONS_H
      17              : 
      18              : #include "llvm/ADT/ArrayRef.h"
      19              : #include "llvm/ADT/Bitfields.h"
      20              : #include "llvm/ADT/MapVector.h"
      21              : #include "llvm/ADT/STLExtras.h"
      22              : #include "llvm/ADT/SmallVector.h"
      23              : #include "llvm/ADT/Twine.h"
      24              : #include "llvm/ADT/iterator.h"
      25              : #include "llvm/ADT/iterator_range.h"
      26              : #include "llvm/IR/CFG.h"
      27              : #include "llvm/IR/Constant.h"
      28              : #include "llvm/IR/DerivedTypes.h"
      29              : #include "llvm/IR/GEPNoWrapFlags.h"
      30              : #include "llvm/IR/InstrTypes.h"
      31              : #include "llvm/IR/Instruction.h"
      32              : #include "llvm/IR/Intrinsics.h"
      33              : #include "llvm/IR/OperandTraits.h"
      34              : #include "llvm/IR/Use.h"
      35              : #include "llvm/IR/User.h"
      36              : #include "llvm/Support/AtomicOrdering.h"
      37              : #include "llvm/Support/ErrorHandling.h"
      38              : #include <cassert>
      39              : #include <cstddef>
      40              : #include <cstdint>
      41              : #include <iterator>
      42              : #include <optional>
      43              : 
      44              : namespace llvm {
      45              : 
      46              : class APFloat;
      47              : class APInt;
      48              : class BasicBlock;
      49              : class ConstantInt;
      50              : class DataLayout;
      51              : class StringRef;
      52              : class Type;
      53              : class Value;
      54              : class UnreachableInst;
      55              : 
      56              : //===----------------------------------------------------------------------===//
      57              : //                                AllocaInst Class
      58              : //===----------------------------------------------------------------------===//
      59              : 
      60              : /// an instruction to allocate memory on the stack
      61              : class AllocaInst : public UnaryInstruction {
      62              :   Type *AllocatedType;
      63              : 
      64              :   using AlignmentField = AlignmentBitfieldElementT<0>;
      65              :   using UsedWithInAllocaField = BoolBitfieldElementT<AlignmentField::NextBit>;
      66              :   using SwiftErrorField = BoolBitfieldElementT<UsedWithInAllocaField::NextBit>;
      67              :   static_assert(Bitfield::areContiguous<AlignmentField, UsedWithInAllocaField,
      68              :                                         SwiftErrorField>(),
      69              :                 "Bitfields must be contiguous");
      70              : 
      71              : protected:
      72              :   // Note: Instruction needs to be a friend here to call cloneImpl.
      73              :   friend class Instruction;
      74              : 
      75              :   AllocaInst *cloneImpl() const;
      76              : 
      77              : public:
      78              :   explicit AllocaInst(Type *Ty, unsigned AddrSpace, Value *ArraySize,
      79              :                       const Twine &Name, InsertPosition InsertBefore);
      80              : 
      81              :   AllocaInst(Type *Ty, unsigned AddrSpace, const Twine &Name,
      82              :              InsertPosition InsertBefore);
      83              : 
      84              :   AllocaInst(Type *Ty, unsigned AddrSpace, Value *ArraySize, Align Align,
      85              :              const Twine &Name = "", InsertPosition InsertBefore = nullptr);
      86              : 
      87              :   /// Return true if there is an allocation size parameter to the allocation
      88              :   /// instruction that is not 1.
      89              :   bool isArrayAllocation() const;
      90              : 
      91              :   /// Get the number of elements allocated. For a simple allocation of a single
      92              :   /// element, this will return a constant 1 value.
      93              :   const Value *getArraySize() const { return getOperand(0); }
      94              :   Value *getArraySize() { return getOperand(0); }
      95              : 
      96              :   /// Overload to return most specific pointer type.
      97              :   PointerType *getType() const {
      98              :     return cast<PointerType>(Instruction::getType());
      99              :   }
     100              : 
     101              :   /// Return the address space for the allocation.
     102              :   unsigned getAddressSpace() const {
     103              :     return getType()->getAddressSpace();
     104              :   }
     105              : 
     106              :   /// Get allocation size in bytes. Returns std::nullopt if size can't be
     107              :   /// determined, e.g. in case of a VLA.
     108              :   std::optional<TypeSize> getAllocationSize(const DataLayout &DL) const;
     109              : 
     110              :   /// Get allocation size in bits. Returns std::nullopt if size can't be
     111              :   /// determined, e.g. in case of a VLA.
     112              :   std::optional<TypeSize> getAllocationSizeInBits(const DataLayout &DL) const;
     113              : 
     114              :   /// Return the type that is being allocated by the instruction.
     115              :   Type *getAllocatedType() const { return AllocatedType; }
     116              :   /// for use only in special circumstances that need to generically
     117              :   /// transform a whole instruction (eg: IR linking and vectorization).
     118              :   void setAllocatedType(Type *Ty) { AllocatedType = Ty; }
     119              : 
     120              :   /// Return the alignment of the memory that is being allocated by the
     121              :   /// instruction.
     122              :   Align getAlign() const {
     123              :     return Align(1ULL << getSubclassData<AlignmentField>());
     124              :   }
     125              : 
     126              :   void setAlignment(Align Align) {
     127              :     setSubclassData<AlignmentField>(Log2(Align));
     128              :   }
     129              : 
     130              :   /// Return true if this alloca is in the entry block of the function and is a
     131              :   /// constant size. If so, the code generator will fold it into the
     132              :   /// prolog/epilog code, so it is basically free.
     133              :   bool isStaticAlloca() const;
     134              : 
     135              :   /// Return true if this alloca is used as an inalloca argument to a call. Such
     136              :   /// allocas are never considered static even if they are in the entry block.
     137              :   bool isUsedWithInAlloca() const {
     138              :     return getSubclassData<UsedWithInAllocaField>();
     139              :   }
     140              : 
     141              :   /// Specify whether this alloca is used to represent the arguments to a call.
     142              :   void setUsedWithInAlloca(bool V) {
     143              :     setSubclassData<UsedWithInAllocaField>(V);
     144              :   }
     145              : 
     146              :   /// Return true if this alloca is used as a swifterror argument to a call.
     147              :   bool isSwiftError() const { return getSubclassData<SwiftErrorField>(); }
     148              :   /// Specify whether this alloca is used to represent a swifterror.
     149              :   void setSwiftError(bool V) { setSubclassData<SwiftErrorField>(V); }
     150              : 
     151              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
     152              :   static bool classof(const Instruction *I) {
     153              :     return (I->getOpcode() == Instruction::Alloca);
     154              :   }
     155              :   static bool classof(const Value *V) {
     156              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
     157              :   }
     158              : 
     159              : private:
     160              :   // Shadow Instruction::setInstructionSubclassData with a private forwarding
     161              :   // method so that subclasses cannot accidentally use it.
     162              :   template <typename Bitfield>
     163              :   void setSubclassData(typename Bitfield::Type Value) {
     164              :     Instruction::setSubclassData<Bitfield>(Value);
     165              :   }
     166              : };
     167              : 
     168              : //===----------------------------------------------------------------------===//
     169              : //                                LoadInst Class
     170              : //===----------------------------------------------------------------------===//
     171              : 
     172              : /// An instruction for reading from memory. This uses the SubclassData field in
     173              : /// Value to store whether or not the load is volatile.
     174              : class LoadInst : public UnaryInstruction {
     175              :   using VolatileField = BoolBitfieldElementT<0>;
     176              :   using AlignmentField = AlignmentBitfieldElementT<VolatileField::NextBit>;
     177              :   using OrderingField = AtomicOrderingBitfieldElementT<AlignmentField::NextBit>;
     178              :   static_assert(
     179              :       Bitfield::areContiguous<VolatileField, AlignmentField, OrderingField>(),
     180              :       "Bitfields must be contiguous");
     181              : 
     182              :   void AssertOK();
     183              : 
     184              : protected:
     185              :   // Note: Instruction needs to be a friend here to call cloneImpl.
     186              :   friend class Instruction;
     187              : 
     188              :   LoadInst *cloneImpl() const;
     189              : 
     190              : public:
     191              :   LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr,
     192              :            InsertPosition InsertBefore);
     193              :   LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr, bool isVolatile,
     194              :            InsertPosition InsertBefore);
     195              :   LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr, bool isVolatile,
     196              :            Align Align, InsertPosition InsertBefore = nullptr);
     197              :   LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr, bool isVolatile,
     198              :            Align Align, AtomicOrdering Order,
     199              :            SyncScope::ID SSID = SyncScope::System,
     200              :            InsertPosition InsertBefore = nullptr);
     201              : 
     202              :   /// Return true if this is a load from a volatile memory location.
     203              :   bool isVolatile() const { return getSubclassData<VolatileField>(); }
     204              : 
     205              :   /// Specify whether this is a volatile load or not.
     206              :   void setVolatile(bool V) { setSubclassData<VolatileField>(V); }
     207              : 
     208              :   /// Return the alignment of the access that is being performed.
     209              :   Align getAlign() const {
     210              :     return Align(1ULL << (getSubclassData<AlignmentField>()));
     211              :   }
     212              : 
     213              :   void setAlignment(Align Align) {
     214              :     setSubclassData<AlignmentField>(Log2(Align));
     215              :   }
     216              : 
     217              :   /// Returns the ordering constraint of this load instruction.
     218              :   AtomicOrdering getOrdering() const {
     219              :     return getSubclassData<OrderingField>();
     220              :   }
     221              :   /// Sets the ordering constraint of this load instruction.  May not be Release
     222              :   /// or AcquireRelease.
     223              :   void setOrdering(AtomicOrdering Ordering) {
     224              :     setSubclassData<OrderingField>(Ordering);
     225              :   }
     226              : 
     227              :   /// Returns the synchronization scope ID of this load instruction.
     228              :   SyncScope::ID getSyncScopeID() const {
     229              :     return SSID;
     230              :   }
     231              : 
     232              :   /// Sets the synchronization scope ID of this load instruction.
     233              :   void setSyncScopeID(SyncScope::ID SSID) {
     234              :     this->SSID = SSID;
     235              :   }
     236              : 
     237              :   /// Sets the ordering constraint and the synchronization scope ID of this load
     238              :   /// instruction.
     239              :   void setAtomic(AtomicOrdering Ordering,
     240              :                  SyncScope::ID SSID = SyncScope::System) {
     241              :     setOrdering(Ordering);
     242              :     setSyncScopeID(SSID);
     243              :   }
     244              : 
     245              :   bool isSimple() const { return !isAtomic() && !isVolatile(); }
     246              : 
     247              :   bool isUnordered() const {
     248              :     return (getOrdering() == AtomicOrdering::NotAtomic ||
     249              :             getOrdering() == AtomicOrdering::Unordered) &&
     250              :            !isVolatile();
     251              :   }
     252              : 
     253              :   Value *getPointerOperand() { return getOperand(0); }
     254              :   const Value *getPointerOperand() const { return getOperand(0); }
     255              :   static unsigned getPointerOperandIndex() { return 0U; }
     256              :   Type *getPointerOperandType() const { return getPointerOperand()->getType(); }
     257              : 
     258              :   /// Returns the address space of the pointer operand.
     259              :   unsigned getPointerAddressSpace() const {
     260              :     return getPointerOperandType()->getPointerAddressSpace();
     261              :   }
     262              : 
     263              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
     264              :   static bool classof(const Instruction *I) {
     265              :     return I->getOpcode() == Instruction::Load;
     266              :   }
     267              :   static bool classof(const Value *V) {
     268              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
     269              :   }
     270              : 
     271              : private:
     272              :   // Shadow Instruction::setInstructionSubclassData with a private forwarding
     273              :   // method so that subclasses cannot accidentally use it.
     274              :   template <typename Bitfield>
     275              :   void setSubclassData(typename Bitfield::Type Value) {
     276              :     Instruction::setSubclassData<Bitfield>(Value);
     277              :   }
     278              : 
     279              :   /// The synchronization scope ID of this load instruction.  Not quite enough
     280              :   /// room in SubClassData for everything, so synchronization scope ID gets its
     281              :   /// own field.
     282              :   SyncScope::ID SSID;
     283              : };
     284              : 
     285              : //===----------------------------------------------------------------------===//
     286              : //                                StoreInst Class
     287              : //===----------------------------------------------------------------------===//
     288              : 
     289              : /// An instruction for storing to memory.
     290              : class StoreInst : public Instruction {
     291              :   using VolatileField = BoolBitfieldElementT<0>;
     292              :   using AlignmentField = AlignmentBitfieldElementT<VolatileField::NextBit>;
     293              :   using OrderingField = AtomicOrderingBitfieldElementT<AlignmentField::NextBit>;
     294              :   static_assert(
     295              :       Bitfield::areContiguous<VolatileField, AlignmentField, OrderingField>(),
     296              :       "Bitfields must be contiguous");
     297              : 
     298              :   void AssertOK();
     299              : 
     300              : protected:
     301              :   // Note: Instruction needs to be a friend here to call cloneImpl.
     302              :   friend class Instruction;
     303              : 
     304              :   StoreInst *cloneImpl() const;
     305              : 
     306              : public:
     307              :   StoreInst(Value *Val, Value *Ptr, InsertPosition InsertBefore);
     308              :   StoreInst(Value *Val, Value *Ptr, bool isVolatile,
     309              :             InsertPosition InsertBefore);
     310              :   StoreInst(Value *Val, Value *Ptr, bool isVolatile, Align Align,
     311              :             InsertPosition InsertBefore = nullptr);
     312              :   StoreInst(Value *Val, Value *Ptr, bool isVolatile, Align Align,
     313              :             AtomicOrdering Order, SyncScope::ID SSID = SyncScope::System,
     314              :             InsertPosition InsertBefore = nullptr);
     315              : 
     316              :   // allocate space for exactly two operands
     317              :   void *operator new(size_t S) { return User::operator new(S, 2); }
     318              :   void operator delete(void *Ptr) { User::operator delete(Ptr); }
     319              : 
     320              :   /// Return true if this is a store to a volatile memory location.
     321              :   bool isVolatile() const { return getSubclassData<VolatileField>(); }
     322              : 
     323              :   /// Specify whether this is a volatile store or not.
     324              :   void setVolatile(bool V) { setSubclassData<VolatileField>(V); }
     325              : 
     326              :   /// Transparently provide more efficient getOperand methods.
     327              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
     328              : 
     329              :   Align getAlign() const {
     330              :     return Align(1ULL << (getSubclassData<AlignmentField>()));
     331              :   }
     332              : 
     333              :   void setAlignment(Align Align) {
     334              :     setSubclassData<AlignmentField>(Log2(Align));
     335              :   }
     336              : 
     337              :   /// Returns the ordering constraint of this store instruction.
     338              :   AtomicOrdering getOrdering() const {
     339              :     return getSubclassData<OrderingField>();
     340              :   }
     341              : 
     342              :   /// Sets the ordering constraint of this store instruction.  May not be
     343              :   /// Acquire or AcquireRelease.
     344              :   void setOrdering(AtomicOrdering Ordering) {
     345              :     setSubclassData<OrderingField>(Ordering);
     346              :   }
     347              : 
     348              :   /// Returns the synchronization scope ID of this store instruction.
     349              :   SyncScope::ID getSyncScopeID() const {
     350              :     return SSID;
     351              :   }
     352              : 
     353              :   /// Sets the synchronization scope ID of this store instruction.
     354              :   void setSyncScopeID(SyncScope::ID SSID) {
     355              :     this->SSID = SSID;
     356              :   }
     357              : 
     358              :   /// Sets the ordering constraint and the synchronization scope ID of this
     359              :   /// store instruction.
     360              :   void setAtomic(AtomicOrdering Ordering,
     361              :                  SyncScope::ID SSID = SyncScope::System) {
     362              :     setOrdering(Ordering);
     363              :     setSyncScopeID(SSID);
     364              :   }
     365              : 
     366              :   bool isSimple() const { return !isAtomic() && !isVolatile(); }
     367              : 
     368              :   bool isUnordered() const {
     369              :     return (getOrdering() == AtomicOrdering::NotAtomic ||
     370              :             getOrdering() == AtomicOrdering::Unordered) &&
     371              :            !isVolatile();
     372              :   }
     373              : 
     374              :   Value *getValueOperand() { return getOperand(0); }
     375              :   const Value *getValueOperand() const { return getOperand(0); }
     376              : 
     377              :   Value *getPointerOperand() { return getOperand(1); }
     378              :   const Value *getPointerOperand() const { return getOperand(1); }
     379              :   static unsigned getPointerOperandIndex() { return 1U; }
     380              :   Type *getPointerOperandType() const { return getPointerOperand()->getType(); }
     381              : 
     382              :   /// Returns the address space of the pointer operand.
     383              :   unsigned getPointerAddressSpace() const {
     384              :     return getPointerOperandType()->getPointerAddressSpace();
     385              :   }
     386              : 
     387              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
     388              :   static bool classof(const Instruction *I) {
     389              :     return I->getOpcode() == Instruction::Store;
     390              :   }
     391              :   static bool classof(const Value *V) {
     392              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
     393              :   }
     394              : 
     395              : private:
     396              :   // Shadow Instruction::setInstructionSubclassData with a private forwarding
     397              :   // method so that subclasses cannot accidentally use it.
     398              :   template <typename Bitfield>
     399              :   void setSubclassData(typename Bitfield::Type Value) {
     400              :     Instruction::setSubclassData<Bitfield>(Value);
     401              :   }
     402              : 
     403              :   /// The synchronization scope ID of this store instruction.  Not quite enough
     404              :   /// room in SubClassData for everything, so synchronization scope ID gets its
     405              :   /// own field.
     406              :   SyncScope::ID SSID;
     407              : };
     408              : 
     409              : template <>
     410              : struct OperandTraits<StoreInst> : public FixedNumOperandTraits<StoreInst, 2> {
     411              : };
     412              : 
     413              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(StoreInst, Value)
     414              : 
     415              : //===----------------------------------------------------------------------===//
     416              : //                                FenceInst Class
     417              : //===----------------------------------------------------------------------===//
     418              : 
     419              : /// An instruction for ordering other memory operations.
     420              : class FenceInst : public Instruction {
     421              :   using OrderingField = AtomicOrderingBitfieldElementT<0>;
     422              : 
     423              :   void Init(AtomicOrdering Ordering, SyncScope::ID SSID);
     424              : 
     425              : protected:
     426              :   // Note: Instruction needs to be a friend here to call cloneImpl.
     427              :   friend class Instruction;
     428              : 
     429              :   FenceInst *cloneImpl() const;
     430              : 
     431              : public:
     432              :   // Ordering may only be Acquire, Release, AcquireRelease, or
     433              :   // SequentiallyConsistent.
     434              :   FenceInst(LLVMContext &C, AtomicOrdering Ordering,
     435              :             SyncScope::ID SSID = SyncScope::System,
     436              :             InsertPosition InsertBefore = nullptr);
     437              : 
     438              :   // allocate space for exactly zero operands
     439              :   void *operator new(size_t S) { return User::operator new(S, 0); }
     440              :   void operator delete(void *Ptr) { User::operator delete(Ptr); }
     441              : 
     442              :   /// Returns the ordering constraint of this fence instruction.
     443              :   AtomicOrdering getOrdering() const {
     444              :     return getSubclassData<OrderingField>();
     445              :   }
     446              : 
     447              :   /// Sets the ordering constraint of this fence instruction.  May only be
     448              :   /// Acquire, Release, AcquireRelease, or SequentiallyConsistent.
     449              :   void setOrdering(AtomicOrdering Ordering) {
     450              :     setSubclassData<OrderingField>(Ordering);
     451              :   }
     452              : 
     453              :   /// Returns the synchronization scope ID of this fence instruction.
     454              :   SyncScope::ID getSyncScopeID() const {
     455              :     return SSID;
     456              :   }
     457              : 
     458              :   /// Sets the synchronization scope ID of this fence instruction.
     459              :   void setSyncScopeID(SyncScope::ID SSID) {
     460              :     this->SSID = SSID;
     461              :   }
     462              : 
     463              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
     464              :   static bool classof(const Instruction *I) {
     465              :     return I->getOpcode() == Instruction::Fence;
     466              :   }
     467              :   static bool classof(const Value *V) {
     468              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
     469              :   }
     470              : 
     471              : private:
     472              :   // Shadow Instruction::setInstructionSubclassData with a private forwarding
     473              :   // method so that subclasses cannot accidentally use it.
     474              :   template <typename Bitfield>
     475              :   void setSubclassData(typename Bitfield::Type Value) {
     476              :     Instruction::setSubclassData<Bitfield>(Value);
     477              :   }
     478              : 
     479              :   /// The synchronization scope ID of this fence instruction.  Not quite enough
     480              :   /// room in SubClassData for everything, so synchronization scope ID gets its
     481              :   /// own field.
     482              :   SyncScope::ID SSID;
     483              : };
     484              : 
     485              : //===----------------------------------------------------------------------===//
     486              : //                                AtomicCmpXchgInst Class
     487              : //===----------------------------------------------------------------------===//
     488              : 
     489              : /// An instruction that atomically checks whether a
     490              : /// specified value is in a memory location, and, if it is, stores a new value
     491              : /// there. The value returned by this instruction is a pair containing the
     492              : /// original value as first element, and an i1 indicating success (true) or
     493              : /// failure (false) as second element.
     494              : ///
     495              : class AtomicCmpXchgInst : public Instruction {
     496              :   void Init(Value *Ptr, Value *Cmp, Value *NewVal, Align Align,
     497              :             AtomicOrdering SuccessOrdering, AtomicOrdering FailureOrdering,
     498              :             SyncScope::ID SSID);
     499              : 
     500              :   template <unsigned Offset>
     501              :   using AtomicOrderingBitfieldElement =
     502              :       typename Bitfield::Element<AtomicOrdering, Offset, 3,
     503              :                                  AtomicOrdering::LAST>;
     504              : 
     505              : protected:
     506              :   // Note: Instruction needs to be a friend here to call cloneImpl.
     507              :   friend class Instruction;
     508              : 
     509              :   AtomicCmpXchgInst *cloneImpl() const;
     510              : 
     511              : public:
     512              :   AtomicCmpXchgInst(Value *Ptr, Value *Cmp, Value *NewVal, Align Alignment,
     513              :                     AtomicOrdering SuccessOrdering,
     514              :                     AtomicOrdering FailureOrdering, SyncScope::ID SSID,
     515              :                     InsertPosition InsertBefore = nullptr);
     516              : 
     517              :   // allocate space for exactly three operands
     518              :   void *operator new(size_t S) { return User::operator new(S, 3); }
     519              :   void operator delete(void *Ptr) { User::operator delete(Ptr); }
     520              : 
     521              :   using VolatileField = BoolBitfieldElementT<0>;
     522              :   using WeakField = BoolBitfieldElementT<VolatileField::NextBit>;
     523              :   using SuccessOrderingField =
     524              :       AtomicOrderingBitfieldElementT<WeakField::NextBit>;
     525              :   using FailureOrderingField =
     526              :       AtomicOrderingBitfieldElementT<SuccessOrderingField::NextBit>;
     527              :   using AlignmentField =
     528              :       AlignmentBitfieldElementT<FailureOrderingField::NextBit>;
     529              :   static_assert(
     530              :       Bitfield::areContiguous<VolatileField, WeakField, SuccessOrderingField,
     531              :                               FailureOrderingField, AlignmentField>(),
     532              :       "Bitfields must be contiguous");
     533              : 
     534              :   /// Return the alignment of the memory that is being allocated by the
     535              :   /// instruction.
     536              :   Align getAlign() const {
     537              :     return Align(1ULL << getSubclassData<AlignmentField>());
     538              :   }
     539              : 
     540              :   void setAlignment(Align Align) {
     541              :     setSubclassData<AlignmentField>(Log2(Align));
     542              :   }
     543              : 
     544              :   /// Return true if this is a cmpxchg from a volatile memory
     545              :   /// location.
     546              :   ///
     547              :   bool isVolatile() const { return getSubclassData<VolatileField>(); }
     548              : 
     549              :   /// Specify whether this is a volatile cmpxchg.
     550              :   ///
     551              :   void setVolatile(bool V) { setSubclassData<VolatileField>(V); }
     552              : 
     553              :   /// Return true if this cmpxchg may spuriously fail.
     554              :   bool isWeak() const { return getSubclassData<WeakField>(); }
     555              : 
     556              :   void setWeak(bool IsWeak) { setSubclassData<WeakField>(IsWeak); }
     557              : 
     558              :   /// Transparently provide more efficient getOperand methods.
     559              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
     560              : 
     561              :   static bool isValidSuccessOrdering(AtomicOrdering Ordering) {
     562              :     return Ordering != AtomicOrdering::NotAtomic &&
     563              :            Ordering != AtomicOrdering::Unordered;
     564              :   }
     565              : 
     566              :   static bool isValidFailureOrdering(AtomicOrdering Ordering) {
     567              :     return Ordering != AtomicOrdering::NotAtomic &&
     568              :            Ordering != AtomicOrdering::Unordered &&
     569              :            Ordering != AtomicOrdering::AcquireRelease &&
     570              :            Ordering != AtomicOrdering::Release;
     571              :   }
     572              : 
     573              :   /// Returns the success ordering constraint of this cmpxchg instruction.
     574              :   AtomicOrdering getSuccessOrdering() const {
     575              :     return getSubclassData<SuccessOrderingField>();
     576              :   }
     577              : 
     578              :   /// Sets the success ordering constraint of this cmpxchg instruction.
     579              :   void setSuccessOrdering(AtomicOrdering Ordering) {
     580              :     assert(isValidSuccessOrdering(Ordering) &&
     581              :            "invalid CmpXchg success ordering");
     582              :     setSubclassData<SuccessOrderingField>(Ordering);
     583              :   }
     584              : 
     585              :   /// Returns the failure ordering constraint of this cmpxchg instruction.
     586              :   AtomicOrdering getFailureOrdering() const {
     587              :     return getSubclassData<FailureOrderingField>();
     588              :   }
     589              : 
     590              :   /// Sets the failure ordering constraint of this cmpxchg instruction.
     591              :   void setFailureOrdering(AtomicOrdering Ordering) {
     592              :     assert(isValidFailureOrdering(Ordering) &&
     593              :            "invalid CmpXchg failure ordering");
     594              :     setSubclassData<FailureOrderingField>(Ordering);
     595              :   }
     596              : 
     597              :   /// Returns a single ordering which is at least as strong as both the
     598              :   /// success and failure orderings for this cmpxchg.
     599              :   AtomicOrdering getMergedOrdering() const {
     600              :     if (getFailureOrdering() == AtomicOrdering::SequentiallyConsistent)
     601              :       return AtomicOrdering::SequentiallyConsistent;
     602              :     if (getFailureOrdering() == AtomicOrdering::Acquire) {
     603              :       if (getSuccessOrdering() == AtomicOrdering::Monotonic)
     604              :         return AtomicOrdering::Acquire;
     605              :       if (getSuccessOrdering() == AtomicOrdering::Release)
     606              :         return AtomicOrdering::AcquireRelease;
     607              :     }
     608              :     return getSuccessOrdering();
     609              :   }
     610              : 
     611              :   /// Returns the synchronization scope ID of this cmpxchg instruction.
     612              :   SyncScope::ID getSyncScopeID() const {
     613              :     return SSID;
     614              :   }
     615              : 
     616              :   /// Sets the synchronization scope ID of this cmpxchg instruction.
     617              :   void setSyncScopeID(SyncScope::ID SSID) {
     618              :     this->SSID = SSID;
     619              :   }
     620              : 
     621              :   Value *getPointerOperand() { return getOperand(0); }
     622              :   const Value *getPointerOperand() const { return getOperand(0); }
     623              :   static unsigned getPointerOperandIndex() { return 0U; }
     624              : 
     625              :   Value *getCompareOperand() { return getOperand(1); }
     626              :   const Value *getCompareOperand() const { return getOperand(1); }
     627              : 
     628              :   Value *getNewValOperand() { return getOperand(2); }
     629              :   const Value *getNewValOperand() const { return getOperand(2); }
     630              : 
     631              :   /// Returns the address space of the pointer operand.
     632              :   unsigned getPointerAddressSpace() const {
     633              :     return getPointerOperand()->getType()->getPointerAddressSpace();
     634              :   }
     635              : 
     636              :   /// Returns the strongest permitted ordering on failure, given the
     637              :   /// desired ordering on success.
     638              :   ///
     639              :   /// If the comparison in a cmpxchg operation fails, there is no atomic store
     640              :   /// so release semantics cannot be provided. So this function drops explicit
     641              :   /// Release requests from the AtomicOrdering. A SequentiallyConsistent
     642              :   /// operation would remain SequentiallyConsistent.
     643              :   static AtomicOrdering
     644              :   getStrongestFailureOrdering(AtomicOrdering SuccessOrdering) {
     645              :     switch (SuccessOrdering) {
     646              :     default:
     647              :       llvm_unreachable("invalid cmpxchg success ordering");
     648              :     case AtomicOrdering::Release:
     649              :     case AtomicOrdering::Monotonic:
     650              :       return AtomicOrdering::Monotonic;
     651              :     case AtomicOrdering::AcquireRelease:
     652              :     case AtomicOrdering::Acquire:
     653              :       return AtomicOrdering::Acquire;
     654              :     case AtomicOrdering::SequentiallyConsistent:
     655              :       return AtomicOrdering::SequentiallyConsistent;
     656              :     }
     657              :   }
     658              : 
     659              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
     660              :   static bool classof(const Instruction *I) {
     661              :     return I->getOpcode() == Instruction::AtomicCmpXchg;
     662              :   }
     663              :   static bool classof(const Value *V) {
     664              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
     665              :   }
     666              : 
     667              : private:
     668              :   // Shadow Instruction::setInstructionSubclassData with a private forwarding
     669              :   // method so that subclasses cannot accidentally use it.
     670              :   template <typename Bitfield>
     671              :   void setSubclassData(typename Bitfield::Type Value) {
     672              :     Instruction::setSubclassData<Bitfield>(Value);
     673              :   }
     674              : 
     675              :   /// The synchronization scope ID of this cmpxchg instruction.  Not quite
     676              :   /// enough room in SubClassData for everything, so synchronization scope ID
     677              :   /// gets its own field.
     678              :   SyncScope::ID SSID;
     679              : };
     680              : 
     681              : template <>
     682              : struct OperandTraits<AtomicCmpXchgInst> :
     683              :     public FixedNumOperandTraits<AtomicCmpXchgInst, 3> {
     684              : };
     685              : 
     686              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(AtomicCmpXchgInst, Value)
     687              : 
     688              : //===----------------------------------------------------------------------===//
     689              : //                                AtomicRMWInst Class
     690              : //===----------------------------------------------------------------------===//
     691              : 
     692              : /// an instruction that atomically reads a memory location,
     693              : /// combines it with another value, and then stores the result back.  Returns
     694              : /// the old value.
     695              : ///
     696              : class AtomicRMWInst : public Instruction {
     697              : protected:
     698              :   // Note: Instruction needs to be a friend here to call cloneImpl.
     699              :   friend class Instruction;
     700              : 
     701              :   AtomicRMWInst *cloneImpl() const;
     702              : 
     703              : public:
     704              :   /// This enumeration lists the possible modifications atomicrmw can make.  In
     705              :   /// the descriptions, 'p' is the pointer to the instruction's memory location,
     706              :   /// 'old' is the initial value of *p, and 'v' is the other value passed to the
     707              :   /// instruction.  These instructions always return 'old'.
     708              :   enum BinOp : unsigned {
     709              :     /// *p = v
     710              :     Xchg,
     711              :     /// *p = old + v
     712              :     Add,
     713              :     /// *p = old - v
     714              :     Sub,
     715              :     /// *p = old & v
     716              :     And,
     717              :     /// *p = ~(old & v)
     718              :     Nand,
     719              :     /// *p = old | v
     720              :     Or,
     721              :     /// *p = old ^ v
     722              :     Xor,
     723              :     /// *p = old >signed v ? old : v
     724              :     Max,
     725              :     /// *p = old <signed v ? old : v
     726              :     Min,
     727              :     /// *p = old >unsigned v ? old : v
     728              :     UMax,
     729              :     /// *p = old <unsigned v ? old : v
     730              :     UMin,
     731              : 
     732              :     /// *p = old + v
     733              :     FAdd,
     734              : 
     735              :     /// *p = old - v
     736              :     FSub,
     737              : 
     738              :     /// *p = maxnum(old, v)
     739              :     /// \p maxnum matches the behavior of \p llvm.maxnum.*.
     740              :     FMax,
     741              : 
     742              :     /// *p = minnum(old, v)
     743              :     /// \p minnum matches the behavior of \p llvm.minnum.*.
     744              :     FMin,
     745              : 
     746              :     /// Increment one up to a maximum value.
     747              :     /// *p = (old u>= v) ? 0 : (old + 1)
     748              :     UIncWrap,
     749              : 
     750              :     /// Decrement one until a minimum value or zero.
     751              :     /// *p = ((old == 0) || (old u> v)) ? v : (old - 1)
     752              :     UDecWrap,
     753              : 
     754              :     FIRST_BINOP = Xchg,
     755              :     LAST_BINOP = UDecWrap,
     756              :     BAD_BINOP
     757              :   };
     758              : 
     759              : private:
     760              :   template <unsigned Offset>
     761              :   using AtomicOrderingBitfieldElement =
     762              :       typename Bitfield::Element<AtomicOrdering, Offset, 3,
     763              :                                  AtomicOrdering::LAST>;
     764              : 
     765              :   template <unsigned Offset>
     766              :   using BinOpBitfieldElement =
     767              :       typename Bitfield::Element<BinOp, Offset, 5, BinOp::LAST_BINOP>;
     768              : 
     769              : public:
     770              :   AtomicRMWInst(BinOp Operation, Value *Ptr, Value *Val, Align Alignment,
     771              :                 AtomicOrdering Ordering, SyncScope::ID SSID,
     772              :                 InsertPosition InsertBefore = nullptr);
     773              : 
     774              :   // allocate space for exactly two operands
     775              :   void *operator new(size_t S) { return User::operator new(S, 2); }
     776              :   void operator delete(void *Ptr) { User::operator delete(Ptr); }
     777              : 
     778              :   using VolatileField = BoolBitfieldElementT<0>;
     779              :   using AtomicOrderingField =
     780              :       AtomicOrderingBitfieldElementT<VolatileField::NextBit>;
     781              :   using OperationField = BinOpBitfieldElement<AtomicOrderingField::NextBit>;
     782              :   using AlignmentField = AlignmentBitfieldElementT<OperationField::NextBit>;
     783              :   static_assert(Bitfield::areContiguous<VolatileField, AtomicOrderingField,
     784              :                                         OperationField, AlignmentField>(),
     785              :                 "Bitfields must be contiguous");
     786              : 
     787              :   BinOp getOperation() const { return getSubclassData<OperationField>(); }
     788              : 
     789              :   static StringRef getOperationName(BinOp Op);
     790              : 
     791              :   static bool isFPOperation(BinOp Op) {
     792              :     switch (Op) {
     793              :     case AtomicRMWInst::FAdd:
     794              :     case AtomicRMWInst::FSub:
     795              :     case AtomicRMWInst::FMax:
     796              :     case AtomicRMWInst::FMin:
     797              :       return true;
     798              :     default:
     799              :       return false;
     800              :     }
     801              :   }
     802              : 
     803              :   void setOperation(BinOp Operation) {
     804              :     setSubclassData<OperationField>(Operation);
     805              :   }
     806              : 
     807              :   /// Return the alignment of the memory that is being allocated by the
     808              :   /// instruction.
     809              :   Align getAlign() const {
     810              :     return Align(1ULL << getSubclassData<AlignmentField>());
     811              :   }
     812              : 
     813              :   void setAlignment(Align Align) {
     814              :     setSubclassData<AlignmentField>(Log2(Align));
     815              :   }
     816              : 
     817              :   /// Return true if this is a RMW on a volatile memory location.
     818              :   ///
     819              :   bool isVolatile() const { return getSubclassData<VolatileField>(); }
     820              : 
     821              :   /// Specify whether this is a volatile RMW or not.
     822              :   ///
     823              :   void setVolatile(bool V) { setSubclassData<VolatileField>(V); }
     824              : 
     825              :   /// Transparently provide more efficient getOperand methods.
     826              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
     827              : 
     828              :   /// Returns the ordering constraint of this rmw instruction.
     829              :   AtomicOrdering getOrdering() const {
     830              :     return getSubclassData<AtomicOrderingField>();
     831              :   }
     832              : 
     833              :   /// Sets the ordering constraint of this rmw instruction.
     834              :   void setOrdering(AtomicOrdering Ordering) {
     835              :     assert(Ordering != AtomicOrdering::NotAtomic &&
     836              :            "atomicrmw instructions can only be atomic.");
     837              :     assert(Ordering != AtomicOrdering::Unordered &&
     838              :            "atomicrmw instructions cannot be unordered.");
     839              :     setSubclassData<AtomicOrderingField>(Ordering);
     840              :   }
     841              : 
     842              :   /// Returns the synchronization scope ID of this rmw instruction.
     843              :   SyncScope::ID getSyncScopeID() const {
     844              :     return SSID;
     845              :   }
     846              : 
     847              :   /// Sets the synchronization scope ID of this rmw instruction.
     848              :   void setSyncScopeID(SyncScope::ID SSID) {
     849              :     this->SSID = SSID;
     850              :   }
     851              : 
     852              :   Value *getPointerOperand() { return getOperand(0); }
     853              :   const Value *getPointerOperand() const { return getOperand(0); }
     854              :   static unsigned getPointerOperandIndex() { return 0U; }
     855              : 
     856              :   Value *getValOperand() { return getOperand(1); }
     857              :   const Value *getValOperand() const { return getOperand(1); }
     858              : 
     859              :   /// Returns the address space of the pointer operand.
     860              :   unsigned getPointerAddressSpace() const {
     861              :     return getPointerOperand()->getType()->getPointerAddressSpace();
     862              :   }
     863              : 
     864              :   bool isFloatingPointOperation() const {
     865              :     return isFPOperation(getOperation());
     866              :   }
     867              : 
     868              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
     869              :   static bool classof(const Instruction *I) {
     870              :     return I->getOpcode() == Instruction::AtomicRMW;
     871              :   }
     872              :   static bool classof(const Value *V) {
     873              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
     874              :   }
     875              : 
     876              : private:
     877              :   void Init(BinOp Operation, Value *Ptr, Value *Val, Align Align,
     878              :             AtomicOrdering Ordering, SyncScope::ID SSID);
     879              : 
     880              :   // Shadow Instruction::setInstructionSubclassData with a private forwarding
     881              :   // method so that subclasses cannot accidentally use it.
     882              :   template <typename Bitfield>
     883              :   void setSubclassData(typename Bitfield::Type Value) {
     884              :     Instruction::setSubclassData<Bitfield>(Value);
     885              :   }
     886              : 
     887              :   /// The synchronization scope ID of this rmw instruction.  Not quite enough
     888              :   /// room in SubClassData for everything, so synchronization scope ID gets its
     889              :   /// own field.
     890              :   SyncScope::ID SSID;
     891              : };
     892              : 
     893              : template <>
     894              : struct OperandTraits<AtomicRMWInst>
     895              :     : public FixedNumOperandTraits<AtomicRMWInst,2> {
     896              : };
     897              : 
     898              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(AtomicRMWInst, Value)
     899              : 
     900              : //===----------------------------------------------------------------------===//
     901              : //                             GetElementPtrInst Class
     902              : //===----------------------------------------------------------------------===//
     903              : 
     904              : // checkGEPType - Simple wrapper function to give a better assertion failure
     905              : // message on bad indexes for a gep instruction.
     906              : //
     907              : inline Type *checkGEPType(Type *Ty) {
     908              :   assert(Ty && "Invalid GetElementPtrInst indices for type!");
     909              :   return Ty;
     910              : }
     911              : 
     912              : /// an instruction for type-safe pointer arithmetic to
     913              : /// access elements of arrays and structs
     914              : ///
     915              : class GetElementPtrInst : public Instruction {
     916              :   Type *SourceElementType;
     917              :   Type *ResultElementType;
     918              : 
     919              :   GetElementPtrInst(const GetElementPtrInst &GEPI);
     920              : 
     921              :   /// Constructors - Create a getelementptr instruction with a base pointer an
     922              :   /// list of indices. The first and second ctor can optionally insert before an
     923              :   /// existing instruction, the third appends the new instruction to the
     924              :   /// specified BasicBlock.
     925              :   inline GetElementPtrInst(Type *PointeeType, Value *Ptr,
     926              :                            ArrayRef<Value *> IdxList, unsigned Values,
     927              :                            const Twine &NameStr, InsertPosition InsertBefore);
     928              : 
     929              :   void init(Value *Ptr, ArrayRef<Value *> IdxList, const Twine &NameStr);
     930              : 
     931              : protected:
     932              :   // Note: Instruction needs to be a friend here to call cloneImpl.
     933              :   friend class Instruction;
     934              : 
     935              :   GetElementPtrInst *cloneImpl() const;
     936              : 
     937              : public:
     938              :   static GetElementPtrInst *Create(Type *PointeeType, Value *Ptr,
     939              :                                    ArrayRef<Value *> IdxList,
     940              :                                    const Twine &NameStr = "",
     941              :                                    InsertPosition InsertBefore = nullptr) {
     942              :     unsigned Values = 1 + unsigned(IdxList.size());
     943              :     assert(PointeeType && "Must specify element type");
     944              :     return new (Values) GetElementPtrInst(PointeeType, Ptr, IdxList, Values,
     945              :                                           NameStr, InsertBefore);
     946              :   }
     947              : 
     948              :   static GetElementPtrInst *Create(Type *PointeeType, Value *Ptr,
     949              :                                    ArrayRef<Value *> IdxList, GEPNoWrapFlags NW,
     950              :                                    const Twine &NameStr = "",
     951              :                                    InsertPosition InsertBefore = nullptr) {
     952              :     GetElementPtrInst *GEP =
     953              :         Create(PointeeType, Ptr, IdxList, NameStr, InsertBefore);
     954              :     GEP->setNoWrapFlags(NW);
     955              :     return GEP;
     956              :   }
     957              : 
     958              :   /// Create an "inbounds" getelementptr. See the documentation for the
     959              :   /// "inbounds" flag in LangRef.html for details.
     960              :   static GetElementPtrInst *
     961              :   CreateInBounds(Type *PointeeType, Value *Ptr, ArrayRef<Value *> IdxList,
     962              :                  const Twine &NameStr = "",
     963              :                  InsertPosition InsertBefore = nullptr) {
     964              :     return Create(PointeeType, Ptr, IdxList, GEPNoWrapFlags::inBounds(),
     965              :                   NameStr, InsertBefore);
     966              :   }
     967              : 
     968              :   /// Transparently provide more efficient getOperand methods.
     969              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
     970              : 
     971              :   Type *getSourceElementType() const { return SourceElementType; }
     972              : 
     973              :   void setSourceElementType(Type *Ty) { SourceElementType = Ty; }
     974              :   void setResultElementType(Type *Ty) { ResultElementType = Ty; }
     975              : 
     976              :   Type *getResultElementType() const {
     977              :     return ResultElementType;
     978              :   }
     979              : 
     980              :   /// Returns the address space of this instruction's pointer type.
     981              :   unsigned getAddressSpace() const {
     982              :     // Note that this is always the same as the pointer operand's address space
     983              :     // and that is cheaper to compute, so cheat here.
     984              :     return getPointerAddressSpace();
     985              :   }
     986              : 
     987              :   /// Returns the result type of a getelementptr with the given source
     988              :   /// element type and indexes.
     989              :   ///
     990              :   /// Null is returned if the indices are invalid for the specified
     991              :   /// source element type.
     992              :   static Type *getIndexedType(Type *Ty, ArrayRef<Value *> IdxList);
     993              :   static Type *getIndexedType(Type *Ty, ArrayRef<Constant *> IdxList);
     994              :   static Type *getIndexedType(Type *Ty, ArrayRef<uint64_t> IdxList);
     995              : 
     996              :   /// Return the type of the element at the given index of an indexable
     997              :   /// type.  This is equivalent to "getIndexedType(Agg, {Zero, Idx})".
     998              :   ///
     999              :   /// Returns null if the type can't be indexed, or the given index is not
    1000              :   /// legal for the given type.
    1001              :   static Type *getTypeAtIndex(Type *Ty, Value *Idx);
    1002              :   static Type *getTypeAtIndex(Type *Ty, uint64_t Idx);
    1003              : 
    1004              :   inline op_iterator       idx_begin()       { return op_begin()+1; }
    1005              :   inline const_op_iterator idx_begin() const { return op_begin()+1; }
    1006              :   inline op_iterator       idx_end()         { return op_end(); }
    1007              :   inline const_op_iterator idx_end()   const { return op_end(); }
    1008              : 
    1009              :   inline iterator_range<op_iterator> indices() {
    1010              :     return make_range(idx_begin(), idx_end());
    1011              :   }
    1012              : 
    1013              :   inline iterator_range<const_op_iterator> indices() const {
    1014              :     return make_range(idx_begin(), idx_end());
    1015              :   }
    1016              : 
    1017              :   Value *getPointerOperand() {
    1018              :     return getOperand(0);
    1019              :   }
    1020              :   const Value *getPointerOperand() const {
    1021              :     return getOperand(0);
    1022              :   }
    1023              :   static unsigned getPointerOperandIndex() {
    1024              :     return 0U;    // get index for modifying correct operand.
    1025              :   }
    1026              : 
    1027              :   /// Method to return the pointer operand as a
    1028              :   /// PointerType.
    1029              :   Type *getPointerOperandType() const {
    1030              :     return getPointerOperand()->getType();
    1031              :   }
    1032              : 
    1033              :   /// Returns the address space of the pointer operand.
    1034              :   unsigned getPointerAddressSpace() const {
    1035              :     return getPointerOperandType()->getPointerAddressSpace();
    1036              :   }
    1037              : 
    1038              :   /// Returns the pointer type returned by the GEP
    1039              :   /// instruction, which may be a vector of pointers.
    1040              :   static Type *getGEPReturnType(Value *Ptr, ArrayRef<Value *> IdxList) {
    1041              :     // Vector GEP
    1042              :     Type *Ty = Ptr->getType();
    1043              :     if (Ty->isVectorTy())
    1044              :       return Ty;
    1045              : 
    1046              :     for (Value *Index : IdxList)
    1047              :       if (auto *IndexVTy = dyn_cast<VectorType>(Index->getType())) {
    1048              :         ElementCount EltCount = IndexVTy->getElementCount();
    1049              :         return VectorType::get(Ty, EltCount);
    1050              :       }
    1051              :     // Scalar GEP
    1052              :     return Ty;
    1053              :   }
    1054              : 
    1055              :   unsigned getNumIndices() const {  // Note: always non-negative
    1056              :     return getNumOperands() - 1;
    1057              :   }
    1058              : 
    1059              :   bool hasIndices() const {
    1060              :     return getNumOperands() > 1;
    1061              :   }
    1062              : 
    1063              :   /// Return true if all of the indices of this GEP are
    1064              :   /// zeros.  If so, the result pointer and the first operand have the same
    1065              :   /// value, just potentially different types.
    1066              :   bool hasAllZeroIndices() const;
    1067              : 
    1068              :   /// Return true if all of the indices of this GEP are
    1069              :   /// constant integers.  If so, the result pointer and the first operand have
    1070              :   /// a constant offset between them.
    1071              :   bool hasAllConstantIndices() const;
    1072              : 
    1073              :   /// Set nowrap flags for GEP instruction.
    1074              :   void setNoWrapFlags(GEPNoWrapFlags NW);
    1075              : 
    1076              :   /// Set or clear the inbounds flag on this GEP instruction.
    1077              :   /// See LangRef.html for the meaning of inbounds on a getelementptr.
    1078              :   /// TODO: Remove this method in favor of setNoWrapFlags().
    1079              :   void setIsInBounds(bool b = true);
    1080              : 
    1081              :   /// Get the nowrap flags for the GEP instruction.
    1082              :   GEPNoWrapFlags getNoWrapFlags() const;
    1083              : 
    1084              :   /// Determine whether the GEP has the inbounds flag.
    1085              :   bool isInBounds() const;
    1086              : 
    1087              :   /// Determine whether the GEP has the nusw flag.
    1088              :   bool hasNoUnsignedSignedWrap() const;
    1089              : 
    1090              :   /// Determine whether the GEP has the nuw flag.
    1091              :   bool hasNoUnsignedWrap() const;
    1092              : 
    1093              :   /// Accumulate the constant address offset of this GEP if possible.
    1094              :   ///
    1095              :   /// This routine accepts an APInt into which it will accumulate the constant
    1096              :   /// offset of this GEP if the GEP is in fact constant. If the GEP is not
    1097              :   /// all-constant, it returns false and the value of the offset APInt is
    1098              :   /// undefined (it is *not* preserved!). The APInt passed into this routine
    1099              :   /// must be at least as wide as the IntPtr type for the address space of
    1100              :   /// the base GEP pointer.
    1101              :   bool accumulateConstantOffset(const DataLayout &DL, APInt &Offset) const;
    1102              :   bool collectOffset(const DataLayout &DL, unsigned BitWidth,
    1103              :                      MapVector<Value *, APInt> &VariableOffsets,
    1104              :                      APInt &ConstantOffset) const;
    1105              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1106              :   static bool classof(const Instruction *I) {
    1107              :     return (I->getOpcode() == Instruction::GetElementPtr);
    1108              :   }
    1109              :   static bool classof(const Value *V) {
    1110              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    1111              :   }
    1112              : };
    1113              : 
    1114              : template <>
    1115              : struct OperandTraits<GetElementPtrInst> :
    1116              :   public VariadicOperandTraits<GetElementPtrInst, 1> {
    1117              : };
    1118              : 
    1119              : GetElementPtrInst::GetElementPtrInst(Type *PointeeType, Value *Ptr,
    1120              :                                      ArrayRef<Value *> IdxList, unsigned Values,
    1121              :                                      const Twine &NameStr,
    1122              :                                      InsertPosition InsertBefore)
    1123              :     : Instruction(getGEPReturnType(Ptr, IdxList), GetElementPtr,
    1124              :                   OperandTraits<GetElementPtrInst>::op_end(this) - Values,
    1125              :                   Values, InsertBefore),
    1126              :       SourceElementType(PointeeType),
    1127              :       ResultElementType(getIndexedType(PointeeType, IdxList)) {
    1128              :   init(Ptr, IdxList, NameStr);
    1129              : }
    1130              : 
    1131              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(GetElementPtrInst, Value)
    1132              : 
    1133              : //===----------------------------------------------------------------------===//
    1134              : //                               ICmpInst Class
    1135              : //===----------------------------------------------------------------------===//
    1136              : 
    1137              : /// This instruction compares its operands according to the predicate given
    1138              : /// to the constructor. It only operates on integers or pointers. The operands
    1139              : /// must be identical types.
    1140              : /// Represent an integer comparison operator.
    1141              : class ICmpInst: public CmpInst {
    1142              :   void AssertOK() {
    1143              :     assert(isIntPredicate() &&
    1144              :            "Invalid ICmp predicate value");
    1145              :     assert(getOperand(0)->getType() == getOperand(1)->getType() &&
    1146              :           "Both operands to ICmp instruction are not of the same type!");
    1147              :     // Check that the operands are the right type
    1148              :     assert((getOperand(0)->getType()->isIntOrIntVectorTy() ||
    1149              :             getOperand(0)->getType()->isPtrOrPtrVectorTy()) &&
    1150              :            "Invalid operand types for ICmp instruction");
    1151              :   }
    1152              : 
    1153              : protected:
    1154              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    1155              :   friend class Instruction;
    1156              : 
    1157              :   /// Clone an identical ICmpInst
    1158              :   ICmpInst *cloneImpl() const;
    1159              : 
    1160              : public:
    1161              :   /// Constructor with insertion semantics.
    1162              :   ICmpInst(InsertPosition InsertBefore, ///< Where to insert
    1163              :            Predicate pred, ///< The predicate to use for the comparison
    1164              :            Value *LHS,     ///< The left-hand-side of the expression
    1165              :            Value *RHS,     ///< The right-hand-side of the expression
    1166              :            const Twine &NameStr = "" ///< Name of the instruction
    1167              :            )
    1168              :       : CmpInst(makeCmpResultType(LHS->getType()), Instruction::ICmp, pred, LHS,
    1169              :                 RHS, NameStr, InsertBefore) {
    1170              : #ifndef NDEBUG
    1171              :   AssertOK();
    1172              : #endif
    1173              :   }
    1174              : 
    1175              :   /// Constructor with no-insertion semantics
    1176              :   ICmpInst(
    1177              :     Predicate pred, ///< The predicate to use for the comparison
    1178              :     Value *LHS,     ///< The left-hand-side of the expression
    1179              :     Value *RHS,     ///< The right-hand-side of the expression
    1180              :     const Twine &NameStr = "" ///< Name of the instruction
    1181              :   ) : CmpInst(makeCmpResultType(LHS->getType()),
    1182              :               Instruction::ICmp, pred, LHS, RHS, NameStr) {
    1183              : #ifndef NDEBUG
    1184              :   AssertOK();
    1185              : #endif
    1186              :   }
    1187              : 
    1188              :   /// For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
    1189              :   /// @returns the predicate that would be the result if the operand were
    1190              :   /// regarded as signed.
    1191              :   /// Return the signed version of the predicate
    1192              :   Predicate getSignedPredicate() const {
    1193              :     return getSignedPredicate(getPredicate());
    1194              :   }
    1195              : 
    1196              :   /// This is a static version that you can use without an instruction.
    1197              :   /// Return the signed version of the predicate.
    1198              :   static Predicate getSignedPredicate(Predicate pred);
    1199              : 
    1200              :   /// For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
    1201              :   /// @returns the predicate that would be the result if the operand were
    1202              :   /// regarded as unsigned.
    1203              :   /// Return the unsigned version of the predicate
    1204              :   Predicate getUnsignedPredicate() const {
    1205              :     return getUnsignedPredicate(getPredicate());
    1206              :   }
    1207              : 
    1208              :   /// This is a static version that you can use without an instruction.
    1209              :   /// Return the unsigned version of the predicate.
    1210              :   static Predicate getUnsignedPredicate(Predicate pred);
    1211              : 
    1212              :   /// Return true if this predicate is either EQ or NE.  This also
    1213              :   /// tests for commutativity.
    1214              :   static bool isEquality(Predicate P) {
    1215              :     return P == ICMP_EQ || P == ICMP_NE;
    1216              :   }
    1217              : 
    1218              :   /// Return true if this predicate is either EQ or NE.  This also
    1219              :   /// tests for commutativity.
    1220              :   bool isEquality() const {
    1221              :     return isEquality(getPredicate());
    1222              :   }
    1223              : 
    1224              :   /// @returns true if the predicate of this ICmpInst is commutative
    1225              :   /// Determine if this relation is commutative.
    1226              :   bool isCommutative() const { return isEquality(); }
    1227              : 
    1228              :   /// Return true if the predicate is relational (not EQ or NE).
    1229              :   ///
    1230              :   bool isRelational() const {
    1231              :     return !isEquality();
    1232              :   }
    1233              : 
    1234              :   /// Return true if the predicate is relational (not EQ or NE).
    1235              :   ///
    1236              :   static bool isRelational(Predicate P) {
    1237              :     return !isEquality(P);
    1238              :   }
    1239              : 
    1240              :   /// Return true if the predicate is SGT or UGT.
    1241              :   ///
    1242              :   static bool isGT(Predicate P) {
    1243              :     return P == ICMP_SGT || P == ICMP_UGT;
    1244              :   }
    1245              : 
    1246              :   /// Return true if the predicate is SLT or ULT.
    1247              :   ///
    1248              :   static bool isLT(Predicate P) {
    1249              :     return P == ICMP_SLT || P == ICMP_ULT;
    1250              :   }
    1251              : 
    1252              :   /// Return true if the predicate is SGE or UGE.
    1253              :   ///
    1254              :   static bool isGE(Predicate P) {
    1255              :     return P == ICMP_SGE || P == ICMP_UGE;
    1256              :   }
    1257              : 
    1258              :   /// Return true if the predicate is SLE or ULE.
    1259              :   ///
    1260              :   static bool isLE(Predicate P) {
    1261              :     return P == ICMP_SLE || P == ICMP_ULE;
    1262              :   }
    1263              : 
    1264              :   /// Returns the sequence of all ICmp predicates.
    1265              :   ///
    1266              :   static auto predicates() { return ICmpPredicates(); }
    1267              : 
    1268              :   /// Exchange the two operands to this instruction in such a way that it does
    1269              :   /// not modify the semantics of the instruction. The predicate value may be
    1270              :   /// changed to retain the same result if the predicate is order dependent
    1271              :   /// (e.g. ult).
    1272              :   /// Swap operands and adjust predicate.
    1273              :   void swapOperands() {
    1274              :     setPredicate(getSwappedPredicate());
    1275              :     Op<0>().swap(Op<1>());
    1276              :   }
    1277              : 
    1278              :   /// Return result of `LHS Pred RHS` comparison.
    1279              :   static bool compare(const APInt &LHS, const APInt &RHS,
    1280              :                       ICmpInst::Predicate Pred);
    1281              : 
    1282              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1283              :   static bool classof(const Instruction *I) {
    1284              :     return I->getOpcode() == Instruction::ICmp;
    1285              :   }
    1286              :   static bool classof(const Value *V) {
    1287              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    1288              :   }
    1289              : };
    1290              : 
    1291              : //===----------------------------------------------------------------------===//
    1292              : //                               FCmpInst Class
    1293              : //===----------------------------------------------------------------------===//
    1294              : 
    1295              : /// This instruction compares its operands according to the predicate given
    1296              : /// to the constructor. It only operates on floating point values or packed
    1297              : /// vectors of floating point values. The operands must be identical types.
    1298              : /// Represents a floating point comparison operator.
    1299              : class FCmpInst: public CmpInst {
    1300              :   void AssertOK() {
    1301              :     assert(isFPPredicate() && "Invalid FCmp predicate value");
    1302              :     assert(getOperand(0)->getType() == getOperand(1)->getType() &&
    1303              :            "Both operands to FCmp instruction are not of the same type!");
    1304              :     // Check that the operands are the right type
    1305              :     assert(getOperand(0)->getType()->isFPOrFPVectorTy() &&
    1306              :            "Invalid operand types for FCmp instruction");
    1307              :   }
    1308              : 
    1309              : protected:
    1310              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    1311              :   friend class Instruction;
    1312              : 
    1313              :   /// Clone an identical FCmpInst
    1314              :   FCmpInst *cloneImpl() const;
    1315              : 
    1316              : public:
    1317              :   /// Constructor with insertion semantics.
    1318              :   FCmpInst(InsertPosition InsertBefore, ///< Where to insert
    1319              :            Predicate pred, ///< The predicate to use for the comparison
    1320              :            Value *LHS,     ///< The left-hand-side of the expression
    1321              :            Value *RHS,     ///< The right-hand-side of the expression
    1322              :            const Twine &NameStr = "" ///< Name of the instruction
    1323              :            )
    1324              :       : CmpInst(makeCmpResultType(LHS->getType()), Instruction::FCmp, pred, LHS,
    1325              :                 RHS, NameStr, InsertBefore) {
    1326              :     AssertOK();
    1327              :   }
    1328              : 
    1329              :   /// Constructor with no-insertion semantics
    1330              :   FCmpInst(Predicate Pred, ///< The predicate to use for the comparison
    1331              :            Value *LHS,     ///< The left-hand-side of the expression
    1332              :            Value *RHS,     ///< The right-hand-side of the expression
    1333              :            const Twine &NameStr = "", ///< Name of the instruction
    1334              :            Instruction *FlagsSource = nullptr)
    1335              :       : CmpInst(makeCmpResultType(LHS->getType()), Instruction::FCmp, Pred, LHS,
    1336              :                 RHS, NameStr, nullptr, FlagsSource) {
    1337              :     AssertOK();
    1338              :   }
    1339              : 
    1340              :   /// @returns true if the predicate of this instruction is EQ or NE.
    1341              :   /// Determine if this is an equality predicate.
    1342              :   static bool isEquality(Predicate Pred) {
    1343              :     return Pred == FCMP_OEQ || Pred == FCMP_ONE || Pred == FCMP_UEQ ||
    1344              :            Pred == FCMP_UNE;
    1345              :   }
    1346              : 
    1347              :   /// @returns true if the predicate of this instruction is EQ or NE.
    1348              :   /// Determine if this is an equality predicate.
    1349              :   bool isEquality() const { return isEquality(getPredicate()); }
    1350              : 
    1351              :   /// @returns true if the predicate of this instruction is commutative.
    1352              :   /// Determine if this is a commutative predicate.
    1353              :   bool isCommutative() const {
    1354              :     return isEquality() ||
    1355              :            getPredicate() == FCMP_FALSE ||
    1356              :            getPredicate() == FCMP_TRUE ||
    1357              :            getPredicate() == FCMP_ORD ||
    1358              :            getPredicate() == FCMP_UNO;
    1359              :   }
    1360              : 
    1361              :   /// @returns true if the predicate is relational (not EQ or NE).
    1362              :   /// Determine if this a relational predicate.
    1363              :   bool isRelational() const { return !isEquality(); }
    1364              : 
    1365              :   /// Exchange the two operands to this instruction in such a way that it does
    1366              :   /// not modify the semantics of the instruction. The predicate value may be
    1367              :   /// changed to retain the same result if the predicate is order dependent
    1368              :   /// (e.g. ult).
    1369              :   /// Swap operands and adjust predicate.
    1370              :   void swapOperands() {
    1371              :     setPredicate(getSwappedPredicate());
    1372              :     Op<0>().swap(Op<1>());
    1373              :   }
    1374              : 
    1375              :   /// Returns the sequence of all FCmp predicates.
    1376              :   ///
    1377              :   static auto predicates() { return FCmpPredicates(); }
    1378              : 
    1379              :   /// Return result of `LHS Pred RHS` comparison.
    1380              :   static bool compare(const APFloat &LHS, const APFloat &RHS,
    1381              :                       FCmpInst::Predicate Pred);
    1382              : 
    1383              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    1384              :   static bool classof(const Instruction *I) {
    1385              :     return I->getOpcode() == Instruction::FCmp;
    1386              :   }
    1387              :   static bool classof(const Value *V) {
    1388              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    1389              :   }
    1390              : };
    1391              : 
    1392              : //===----------------------------------------------------------------------===//
    1393              : /// This class represents a function call, abstracting a target
    1394              : /// machine's calling convention.  This class uses low bit of the SubClassData
    1395              : /// field to indicate whether or not this is a tail call.  The rest of the bits
    1396              : /// hold the calling convention of the call.
    1397              : ///
    1398              : class CallInst : public CallBase {
    1399              :   CallInst(const CallInst &CI);
    1400              : 
    1401              :   /// Construct a CallInst from a range of arguments
    1402              :   inline CallInst(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args,
    1403              :                   ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr,
    1404              :                   InsertPosition InsertBefore);
    1405              : 
    1406              :   inline CallInst(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args,
    1407              :                   const Twine &NameStr, InsertPosition InsertBefore)
    1408              :       : CallInst(Ty, Func, Args, std::nullopt, NameStr, InsertBefore) {}
    1409              : 
    1410              :   explicit CallInst(FunctionType *Ty, Value *F, const Twine &NameStr,
    1411              :                     InsertPosition InsertBefore);
    1412              : 
    1413              :   void init(FunctionType *FTy, Value *Func, ArrayRef<Value *> Args,
    1414              :             ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr);
    1415              :   void init(FunctionType *FTy, Value *Func, const Twine &NameStr);
    1416              : 
    1417              :   /// Compute the number of operands to allocate.
    1418            0 :   static int ComputeNumOperands(int NumArgs, int NumBundleInputs = 0) {
    1419              :     // We need one operand for the called function, plus the input operand
    1420              :     // counts provided.
    1421            0 :     return 1 + NumArgs + NumBundleInputs;
    1422              :   }
    1423              : 
    1424              : protected:
    1425              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    1426              :   friend class Instruction;
    1427              : 
    1428              :   CallInst *cloneImpl() const;
    1429              : 
    1430              : public:
    1431              :   static CallInst *Create(FunctionType *Ty, Value *F, const Twine &NameStr = "",
    1432              :                           InsertPosition InsertBefore = nullptr) {
    1433              :     return new (ComputeNumOperands(0)) CallInst(Ty, F, NameStr, InsertBefore);
    1434              :   }
    1435              : 
    1436              :   static CallInst *Create(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args,
    1437              :                           const Twine &NameStr,
    1438              :                           InsertPosition InsertBefore = nullptr) {
    1439              :     return new (ComputeNumOperands(Args.size()))
    1440              :         CallInst(Ty, Func, Args, std::nullopt, NameStr, InsertBefore);
    1441              :   }
    1442              : 
    1443            0 :   static CallInst *Create(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args,
    1444              :                           ArrayRef<OperandBundleDef> Bundles = std::nullopt,
    1445              :                           const Twine &NameStr = "",
    1446              :                           InsertPosition InsertBefore = nullptr) {
    1447              :     const int NumOperands =
    1448            0 :         ComputeNumOperands(Args.size(), CountBundleInputs(Bundles));
    1449            0 :     const unsigned DescriptorBytes = Bundles.size() * sizeof(BundleOpInfo);
    1450              : 
    1451              :     return new (NumOperands, DescriptorBytes)
    1452            0 :         CallInst(Ty, Func, Args, Bundles, NameStr, InsertBefore);
    1453              :   }
    1454              : 
    1455              :   static CallInst *Create(FunctionCallee Func, const Twine &NameStr = "",
    1456              :                           InsertPosition InsertBefore = nullptr) {
    1457              :     return Create(Func.getFunctionType(), Func.getCallee(), NameStr,
    1458              :                   InsertBefore);
    1459              :   }
    1460              : 
    1461              :   static CallInst *Create(FunctionCallee Func, ArrayRef<Value *> Args,
    1462              :                           ArrayRef<OperandBundleDef> Bundles = std::nullopt,
    1463              :                           const Twine &NameStr = "",
    1464              :                           InsertPosition InsertBefore = nullptr) {
    1465              :     return Create(Func.getFunctionType(), Func.getCallee(), Args, Bundles,
    1466              :                   NameStr, InsertBefore);
    1467              :   }
    1468              : 
    1469              :   static CallInst *Create(FunctionCallee Func, ArrayRef<Value *> Args,
    1470              :                           const Twine &NameStr,
    1471              :                           InsertPosition InsertBefore = nullptr) {
    1472              :     return Create(Func.getFunctionType(), Func.getCallee(), Args, NameStr,
    1473              :                   InsertBefore);
    1474              :   }
    1475              : 
    1476              :   /// Create a clone of \p CI with a different set of operand bundles and
    1477              :   /// insert it before \p InsertBefore.
    1478              :   ///
    1479              :   /// The returned call instruction is identical \p CI in every way except that
    1480              :   /// the operand bundles for the new instruction are set to the operand bundles
    1481              :   /// in \p Bundles.
    1482              :   static CallInst *Create(CallInst *CI, ArrayRef<OperandBundleDef> Bundles,
    1483              :                           InsertPosition InsertPt = nullptr);
    1484              : 
    1485              :   // Note that 'musttail' implies 'tail'.
    1486              :   enum TailCallKind : unsigned {
    1487              :     TCK_None = 0,
    1488              :     TCK_Tail = 1,
    1489              :     TCK_MustTail = 2,
    1490              :     TCK_NoTail = 3,
    1491              :     TCK_LAST = TCK_NoTail
    1492              :   };
    1493              : 
    1494              :   using TailCallKindField = Bitfield::Element<TailCallKind, 0, 2, TCK_LAST>;
    1495              :   static_assert(
    1496              :       Bitfield::areContiguous<TailCallKindField, CallBase::CallingConvField>(),
    1497              :       "Bitfields must be contiguous");
    1498              : 
    1499              :   TailCallKind getTailCallKind() const {
    1500              :     return getSubclassData<TailCallKindField>();
    1501              :   }
    1502              : 
    1503              :   bool isTailCall() const {
    1504              :     TailCallKind Kind = getTailCallKind();
    1505              :     return Kind == TCK_Tail || Kind == TCK_MustTail;
    1506              :   }
    1507              : 
    1508              :   bool isMustTailCall() const { return getTailCallKind() == TCK_MustTail; }
    1509              : 
    1510              :   bool isNoTailCall() const { return getTailCallKind() == TCK_NoTail; }
    1511              : 
    1512              :   void setTailCallKind(TailCallKind TCK) {
    1513              :     setSubclassData<TailCallKindField>(TCK);
    1514              :   }
    1515              : 
    1516              :   void setTailCall(bool IsTc = true) {
    1517              :     setTailCallKind(IsTc ? TCK_Tail : TCK_None);
    1518              :   }
    1519              : 
    1520              :   /// Return true if the call can return twice
    1521              :   bool canReturnTwice() const { return hasFnAttr(Attribute::ReturnsTwice); }
    1522              :   void setCanReturnTwice() { addFnAttr(Attribute::ReturnsTwice); }
    1523              : 
    1524              :   /// Return true if the call is for a noreturn trap intrinsic.
    1525              :   bool isNonContinuableTrap() const {
    1526              :     switch (getIntrinsicID()) {
    1527              :     case Intrinsic::trap:
    1528              :     case Intrinsic::ubsantrap:
    1529              :       return !hasFnAttr("trap-func-name");
    1530              :     default:
    1531              :       return false;
    1532              :     }
    1533              :   }
    1534              : 
    1535              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1536       345154 :   static bool classof(const Instruction *I) {
    1537       345154 :     return I->getOpcode() == Instruction::Call;
    1538              :   }
    1539       345154 :   static bool classof(const Value *V) {
    1540       345154 :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    1541              :   }
    1542              : 
    1543              :   /// Updates profile metadata by scaling it by \p S / \p T.
    1544              :   void updateProfWeight(uint64_t S, uint64_t T);
    1545              : 
    1546              : private:
    1547              :   // Shadow Instruction::setInstructionSubclassData with a private forwarding
    1548              :   // method so that subclasses cannot accidentally use it.
    1549              :   template <typename Bitfield>
    1550              :   void setSubclassData(typename Bitfield::Type Value) {
    1551              :     Instruction::setSubclassData<Bitfield>(Value);
    1552              :   }
    1553              : };
    1554              : 
    1555            0 : CallInst::CallInst(FunctionType *Ty, Value *Func, ArrayRef<Value *> Args,
    1556              :                    ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr,
    1557            0 :                    InsertPosition InsertBefore)
    1558              :     : CallBase(Ty->getReturnType(), Instruction::Call,
    1559            0 :                OperandTraits<CallBase>::op_end(this) -
    1560            0 :                    (Args.size() + CountBundleInputs(Bundles) + 1),
    1561            0 :                unsigned(Args.size() + CountBundleInputs(Bundles) + 1),
    1562            0 :                InsertBefore) {
    1563            0 :   init(Ty, Func, Args, Bundles, NameStr);
    1564            0 : }
    1565              : 
    1566              : //===----------------------------------------------------------------------===//
    1567              : //                               SelectInst Class
    1568              : //===----------------------------------------------------------------------===//
    1569              : 
    1570              : /// This class represents the LLVM 'select' instruction.
    1571              : ///
    1572              : class SelectInst : public Instruction {
    1573              : 
    1574              :   SelectInst(Value *C, Value *S1, Value *S2, const Twine &NameStr,
    1575              :              InsertPosition InsertBefore)
    1576              :       : Instruction(S1->getType(), Instruction::Select, &Op<0>(), 3,
    1577              :                     InsertBefore) {
    1578              :     init(C, S1, S2);
    1579              :     setName(NameStr);
    1580              :   }
    1581              : 
    1582              :   void init(Value *C, Value *S1, Value *S2) {
    1583              :     assert(!areInvalidOperands(C, S1, S2) && "Invalid operands for select");
    1584              :     Op<0>() = C;
    1585              :     Op<1>() = S1;
    1586              :     Op<2>() = S2;
    1587              :   }
    1588              : 
    1589              : protected:
    1590              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    1591              :   friend class Instruction;
    1592              : 
    1593              :   SelectInst *cloneImpl() const;
    1594              : 
    1595              : public:
    1596              :   static SelectInst *Create(Value *C, Value *S1, Value *S2,
    1597              :                             const Twine &NameStr = "",
    1598              :                             InsertPosition InsertBefore = nullptr,
    1599              :                             Instruction *MDFrom = nullptr) {
    1600              :     SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore);
    1601              :     if (MDFrom)
    1602              :       Sel->copyMetadata(*MDFrom);
    1603              :     return Sel;
    1604              :   }
    1605              : 
    1606              :   const Value *getCondition() const { return Op<0>(); }
    1607              :   const Value *getTrueValue() const { return Op<1>(); }
    1608              :   const Value *getFalseValue() const { return Op<2>(); }
    1609              :   Value *getCondition() { return Op<0>(); }
    1610              :   Value *getTrueValue() { return Op<1>(); }
    1611              :   Value *getFalseValue() { return Op<2>(); }
    1612              : 
    1613              :   void setCondition(Value *V) { Op<0>() = V; }
    1614              :   void setTrueValue(Value *V) { Op<1>() = V; }
    1615              :   void setFalseValue(Value *V) { Op<2>() = V; }
    1616              : 
    1617              :   /// Swap the true and false values of the select instruction.
    1618              :   /// This doesn't swap prof metadata.
    1619              :   void swapValues() { Op<1>().swap(Op<2>()); }
    1620              : 
    1621              :   /// Return a string if the specified operands are invalid
    1622              :   /// for a select operation, otherwise return null.
    1623              :   static const char *areInvalidOperands(Value *Cond, Value *True, Value *False);
    1624              : 
    1625              :   /// Transparently provide more efficient getOperand methods.
    1626              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    1627              : 
    1628              :   OtherOps getOpcode() const {
    1629              :     return static_cast<OtherOps>(Instruction::getOpcode());
    1630              :   }
    1631              : 
    1632              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1633              :   static bool classof(const Instruction *I) {
    1634              :     return I->getOpcode() == Instruction::Select;
    1635              :   }
    1636              :   static bool classof(const Value *V) {
    1637              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    1638              :   }
    1639              : };
    1640              : 
    1641              : template <>
    1642              : struct OperandTraits<SelectInst> : public FixedNumOperandTraits<SelectInst, 3> {
    1643              : };
    1644              : 
    1645              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(SelectInst, Value)
    1646              : 
    1647              : //===----------------------------------------------------------------------===//
    1648              : //                                VAArgInst Class
    1649              : //===----------------------------------------------------------------------===//
    1650              : 
    1651              : /// This class represents the va_arg llvm instruction, which returns
    1652              : /// an argument of the specified type given a va_list and increments that list
    1653              : ///
    1654              : class VAArgInst : public UnaryInstruction {
    1655              : protected:
    1656              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    1657              :   friend class Instruction;
    1658              : 
    1659              :   VAArgInst *cloneImpl() const;
    1660              : 
    1661              : public:
    1662              :   VAArgInst(Value *List, Type *Ty, const Twine &NameStr = "",
    1663              :             InsertPosition InsertBefore = nullptr)
    1664              :       : UnaryInstruction(Ty, VAArg, List, InsertBefore) {
    1665              :     setName(NameStr);
    1666              :   }
    1667              : 
    1668              :   Value *getPointerOperand() { return getOperand(0); }
    1669              :   const Value *getPointerOperand() const { return getOperand(0); }
    1670              :   static unsigned getPointerOperandIndex() { return 0U; }
    1671              : 
    1672              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1673              :   static bool classof(const Instruction *I) {
    1674              :     return I->getOpcode() == VAArg;
    1675              :   }
    1676              :   static bool classof(const Value *V) {
    1677              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    1678              :   }
    1679              : };
    1680              : 
    1681              : //===----------------------------------------------------------------------===//
    1682              : //                                ExtractElementInst Class
    1683              : //===----------------------------------------------------------------------===//
    1684              : 
    1685              : /// This instruction extracts a single (scalar)
    1686              : /// element from a VectorType value
    1687              : ///
    1688              : class ExtractElementInst : public Instruction {
    1689              :   ExtractElementInst(Value *Vec, Value *Idx, const Twine &NameStr = "",
    1690              :                      InsertPosition InsertBefore = nullptr);
    1691              : 
    1692              : protected:
    1693              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    1694              :   friend class Instruction;
    1695              : 
    1696              :   ExtractElementInst *cloneImpl() const;
    1697              : 
    1698              : public:
    1699              :   static ExtractElementInst *Create(Value *Vec, Value *Idx,
    1700              :                                     const Twine &NameStr = "",
    1701              :                                     InsertPosition InsertBefore = nullptr) {
    1702              :     return new(2) ExtractElementInst(Vec, Idx, NameStr, InsertBefore);
    1703              :   }
    1704              : 
    1705              :   /// Return true if an extractelement instruction can be
    1706              :   /// formed with the specified operands.
    1707              :   static bool isValidOperands(const Value *Vec, const Value *Idx);
    1708              : 
    1709              :   Value *getVectorOperand() { return Op<0>(); }
    1710              :   Value *getIndexOperand() { return Op<1>(); }
    1711              :   const Value *getVectorOperand() const { return Op<0>(); }
    1712              :   const Value *getIndexOperand() const { return Op<1>(); }
    1713              : 
    1714              :   VectorType *getVectorOperandType() const {
    1715              :     return cast<VectorType>(getVectorOperand()->getType());
    1716              :   }
    1717              : 
    1718              :   /// Transparently provide more efficient getOperand methods.
    1719              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    1720              : 
    1721              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1722              :   static bool classof(const Instruction *I) {
    1723              :     return I->getOpcode() == Instruction::ExtractElement;
    1724              :   }
    1725              :   static bool classof(const Value *V) {
    1726              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    1727              :   }
    1728              : };
    1729              : 
    1730              : template <>
    1731              : struct OperandTraits<ExtractElementInst> :
    1732              :   public FixedNumOperandTraits<ExtractElementInst, 2> {
    1733              : };
    1734              : 
    1735              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ExtractElementInst, Value)
    1736              : 
    1737              : //===----------------------------------------------------------------------===//
    1738              : //                                InsertElementInst Class
    1739              : //===----------------------------------------------------------------------===//
    1740              : 
    1741              : /// This instruction inserts a single (scalar)
    1742              : /// element into a VectorType value
    1743              : ///
    1744              : class InsertElementInst : public Instruction {
    1745              :   InsertElementInst(Value *Vec, Value *NewElt, Value *Idx,
    1746              :                     const Twine &NameStr = "",
    1747              :                     InsertPosition InsertBefore = nullptr);
    1748              : 
    1749              : protected:
    1750              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    1751              :   friend class Instruction;
    1752              : 
    1753              :   InsertElementInst *cloneImpl() const;
    1754              : 
    1755              : public:
    1756              :   static InsertElementInst *Create(Value *Vec, Value *NewElt, Value *Idx,
    1757              :                                    const Twine &NameStr = "",
    1758              :                                    InsertPosition InsertBefore = nullptr) {
    1759              :     return new(3) InsertElementInst(Vec, NewElt, Idx, NameStr, InsertBefore);
    1760              :   }
    1761              : 
    1762              :   /// Return true if an insertelement instruction can be
    1763              :   /// formed with the specified operands.
    1764              :   static bool isValidOperands(const Value *Vec, const Value *NewElt,
    1765              :                               const Value *Idx);
    1766              : 
    1767              :   /// Overload to return most specific vector type.
    1768              :   ///
    1769              :   VectorType *getType() const {
    1770              :     return cast<VectorType>(Instruction::getType());
    1771              :   }
    1772              : 
    1773              :   /// Transparently provide more efficient getOperand methods.
    1774              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    1775              : 
    1776              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1777              :   static bool classof(const Instruction *I) {
    1778              :     return I->getOpcode() == Instruction::InsertElement;
    1779              :   }
    1780              :   static bool classof(const Value *V) {
    1781              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    1782              :   }
    1783              : };
    1784              : 
    1785              : template <>
    1786              : struct OperandTraits<InsertElementInst> :
    1787              :   public FixedNumOperandTraits<InsertElementInst, 3> {
    1788              : };
    1789              : 
    1790              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertElementInst, Value)
    1791              : 
    1792              : //===----------------------------------------------------------------------===//
    1793              : //                           ShuffleVectorInst Class
    1794              : //===----------------------------------------------------------------------===//
    1795              : 
    1796              : constexpr int PoisonMaskElem = -1;
    1797              : 
    1798              : /// This instruction constructs a fixed permutation of two
    1799              : /// input vectors.
    1800              : ///
    1801              : /// For each element of the result vector, the shuffle mask selects an element
    1802              : /// from one of the input vectors to copy to the result. Non-negative elements
    1803              : /// in the mask represent an index into the concatenated pair of input vectors.
    1804              : /// PoisonMaskElem (-1) specifies that the result element is poison.
    1805              : ///
    1806              : /// For scalable vectors, all the elements of the mask must be 0 or -1. This
    1807              : /// requirement may be relaxed in the future.
    1808              : class ShuffleVectorInst : public Instruction {
    1809              :   SmallVector<int, 4> ShuffleMask;
    1810              :   Constant *ShuffleMaskForBitcode;
    1811              : 
    1812              : protected:
    1813              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    1814              :   friend class Instruction;
    1815              : 
    1816              :   ShuffleVectorInst *cloneImpl() const;
    1817              : 
    1818              : public:
    1819              :   ShuffleVectorInst(Value *V1, Value *Mask, const Twine &NameStr = "",
    1820              :                     InsertPosition InsertBefore = nullptr);
    1821              :   ShuffleVectorInst(Value *V1, ArrayRef<int> Mask, const Twine &NameStr = "",
    1822              :                     InsertPosition InsertBefore = nullptr);
    1823              :   ShuffleVectorInst(Value *V1, Value *V2, Value *Mask,
    1824              :                     const Twine &NameStr = "",
    1825              :                     InsertPosition InsertBefore = nullptr);
    1826              :   ShuffleVectorInst(Value *V1, Value *V2, ArrayRef<int> Mask,
    1827              :                     const Twine &NameStr = "",
    1828              :                     InsertPosition InsertBefore = nullptr);
    1829              : 
    1830              :   void *operator new(size_t S) { return User::operator new(S, 2); }
    1831              :   void operator delete(void *Ptr) { return User::operator delete(Ptr); }
    1832              : 
    1833              :   /// Swap the operands and adjust the mask to preserve the semantics
    1834              :   /// of the instruction.
    1835              :   void commute();
    1836              : 
    1837              :   /// Return true if a shufflevector instruction can be
    1838              :   /// formed with the specified operands.
    1839              :   static bool isValidOperands(const Value *V1, const Value *V2,
    1840              :                               const Value *Mask);
    1841              :   static bool isValidOperands(const Value *V1, const Value *V2,
    1842              :                               ArrayRef<int> Mask);
    1843              : 
    1844              :   /// Overload to return most specific vector type.
    1845              :   ///
    1846              :   VectorType *getType() const {
    1847              :     return cast<VectorType>(Instruction::getType());
    1848              :   }
    1849              : 
    1850              :   /// Transparently provide more efficient getOperand methods.
    1851              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    1852              : 
    1853              :   /// Return the shuffle mask value of this instruction for the given element
    1854              :   /// index. Return PoisonMaskElem if the element is undef.
    1855              :   int getMaskValue(unsigned Elt) const { return ShuffleMask[Elt]; }
    1856              : 
    1857              :   /// Convert the input shuffle mask operand to a vector of integers. Undefined
    1858              :   /// elements of the mask are returned as PoisonMaskElem.
    1859              :   static void getShuffleMask(const Constant *Mask,
    1860              :                              SmallVectorImpl<int> &Result);
    1861              : 
    1862              :   /// Return the mask for this instruction as a vector of integers. Undefined
    1863              :   /// elements of the mask are returned as PoisonMaskElem.
    1864              :   void getShuffleMask(SmallVectorImpl<int> &Result) const {
    1865              :     Result.assign(ShuffleMask.begin(), ShuffleMask.end());
    1866              :   }
    1867              : 
    1868              :   /// Return the mask for this instruction, for use in bitcode.
    1869              :   ///
    1870              :   /// TODO: This is temporary until we decide a new bitcode encoding for
    1871              :   /// shufflevector.
    1872              :   Constant *getShuffleMaskForBitcode() const { return ShuffleMaskForBitcode; }
    1873              : 
    1874              :   static Constant *convertShuffleMaskForBitcode(ArrayRef<int> Mask,
    1875              :                                                 Type *ResultTy);
    1876              : 
    1877              :   void setShuffleMask(ArrayRef<int> Mask);
    1878              : 
    1879              :   ArrayRef<int> getShuffleMask() const { return ShuffleMask; }
    1880              : 
    1881              :   /// Return true if this shuffle returns a vector with a different number of
    1882              :   /// elements than its source vectors.
    1883              :   /// Examples: shufflevector <4 x n> A, <4 x n> B, <1,2,3>
    1884              :   ///           shufflevector <4 x n> A, <4 x n> B, <1,2,3,4,5>
    1885              :   bool changesLength() const {
    1886              :     unsigned NumSourceElts = cast<VectorType>(Op<0>()->getType())
    1887              :                                  ->getElementCount()
    1888              :                                  .getKnownMinValue();
    1889              :     unsigned NumMaskElts = ShuffleMask.size();
    1890              :     return NumSourceElts != NumMaskElts;
    1891              :   }
    1892              : 
    1893              :   /// Return true if this shuffle returns a vector with a greater number of
    1894              :   /// elements than its source vectors.
    1895              :   /// Example: shufflevector <2 x n> A, <2 x n> B, <1,2,3>
    1896              :   bool increasesLength() const {
    1897              :     unsigned NumSourceElts = cast<VectorType>(Op<0>()->getType())
    1898              :                                  ->getElementCount()
    1899              :                                  .getKnownMinValue();
    1900              :     unsigned NumMaskElts = ShuffleMask.size();
    1901              :     return NumSourceElts < NumMaskElts;
    1902              :   }
    1903              : 
    1904              :   /// Return true if this shuffle mask chooses elements from exactly one source
    1905              :   /// vector.
    1906              :   /// Example: <7,5,undef,7>
    1907              :   /// This assumes that vector operands (of length \p NumSrcElts) are the same
    1908              :   /// length as the mask.
    1909              :   static bool isSingleSourceMask(ArrayRef<int> Mask, int NumSrcElts);
    1910              :   static bool isSingleSourceMask(const Constant *Mask, int NumSrcElts) {
    1911              :     assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.");
    1912              :     SmallVector<int, 16> MaskAsInts;
    1913              :     getShuffleMask(Mask, MaskAsInts);
    1914              :     return isSingleSourceMask(MaskAsInts, NumSrcElts);
    1915              :   }
    1916              : 
    1917              :   /// Return true if this shuffle chooses elements from exactly one source
    1918              :   /// vector without changing the length of that vector.
    1919              :   /// Example: shufflevector <4 x n> A, <4 x n> B, <3,0,undef,3>
    1920              :   /// TODO: Optionally allow length-changing shuffles.
    1921              :   bool isSingleSource() const {
    1922              :     return !changesLength() &&
    1923              :            isSingleSourceMask(ShuffleMask, ShuffleMask.size());
    1924              :   }
    1925              : 
    1926              :   /// Return true if this shuffle mask chooses elements from exactly one source
    1927              :   /// vector without lane crossings. A shuffle using this mask is not
    1928              :   /// necessarily a no-op because it may change the number of elements from its
    1929              :   /// input vectors or it may provide demanded bits knowledge via undef lanes.
    1930              :   /// Example: <undef,undef,2,3>
    1931              :   static bool isIdentityMask(ArrayRef<int> Mask, int NumSrcElts);
    1932              :   static bool isIdentityMask(const Constant *Mask, int NumSrcElts) {
    1933              :     assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.");
    1934              : 
    1935              :     // Not possible to express a shuffle mask for a scalable vector for this
    1936              :     // case.
    1937              :     if (isa<ScalableVectorType>(Mask->getType()))
    1938              :       return false;
    1939              : 
    1940              :     SmallVector<int, 16> MaskAsInts;
    1941              :     getShuffleMask(Mask, MaskAsInts);
    1942              :     return isIdentityMask(MaskAsInts, NumSrcElts);
    1943              :   }
    1944              : 
    1945              :   /// Return true if this shuffle chooses elements from exactly one source
    1946              :   /// vector without lane crossings and does not change the number of elements
    1947              :   /// from its input vectors.
    1948              :   /// Example: shufflevector <4 x n> A, <4 x n> B, <4,undef,6,undef>
    1949              :   bool isIdentity() const {
    1950              :     // Not possible to express a shuffle mask for a scalable vector for this
    1951              :     // case.
    1952              :     if (isa<ScalableVectorType>(getType()))
    1953              :       return false;
    1954              : 
    1955              :     return !changesLength() && isIdentityMask(ShuffleMask, ShuffleMask.size());
    1956              :   }
    1957              : 
    1958              :   /// Return true if this shuffle lengthens exactly one source vector with
    1959              :   /// undefs in the high elements.
    1960              :   bool isIdentityWithPadding() const;
    1961              : 
    1962              :   /// Return true if this shuffle extracts the first N elements of exactly one
    1963              :   /// source vector.
    1964              :   bool isIdentityWithExtract() const;
    1965              : 
    1966              :   /// Return true if this shuffle concatenates its 2 source vectors. This
    1967              :   /// returns false if either input is undefined. In that case, the shuffle is
    1968              :   /// is better classified as an identity with padding operation.
    1969              :   bool isConcat() const;
    1970              : 
    1971              :   /// Return true if this shuffle mask chooses elements from its source vectors
    1972              :   /// without lane crossings. A shuffle using this mask would be
    1973              :   /// equivalent to a vector select with a constant condition operand.
    1974              :   /// Example: <4,1,6,undef>
    1975              :   /// This returns false if the mask does not choose from both input vectors.
    1976              :   /// In that case, the shuffle is better classified as an identity shuffle.
    1977              :   /// This assumes that vector operands are the same length as the mask
    1978              :   /// (a length-changing shuffle can never be equivalent to a vector select).
    1979              :   static bool isSelectMask(ArrayRef<int> Mask, int NumSrcElts);
    1980              :   static bool isSelectMask(const Constant *Mask, int NumSrcElts) {
    1981              :     assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.");
    1982              :     SmallVector<int, 16> MaskAsInts;
    1983              :     getShuffleMask(Mask, MaskAsInts);
    1984              :     return isSelectMask(MaskAsInts, NumSrcElts);
    1985              :   }
    1986              : 
    1987              :   /// Return true if this shuffle chooses elements from its source vectors
    1988              :   /// without lane crossings and all operands have the same number of elements.
    1989              :   /// In other words, this shuffle is equivalent to a vector select with a
    1990              :   /// constant condition operand.
    1991              :   /// Example: shufflevector <4 x n> A, <4 x n> B, <undef,1,6,3>
    1992              :   /// This returns false if the mask does not choose from both input vectors.
    1993              :   /// In that case, the shuffle is better classified as an identity shuffle.
    1994              :   /// TODO: Optionally allow length-changing shuffles.
    1995              :   bool isSelect() const {
    1996              :     return !changesLength() && isSelectMask(ShuffleMask, ShuffleMask.size());
    1997              :   }
    1998              : 
    1999              :   /// Return true if this shuffle mask swaps the order of elements from exactly
    2000              :   /// one source vector.
    2001              :   /// Example: <7,6,undef,4>
    2002              :   /// This assumes that vector operands (of length \p NumSrcElts) are the same
    2003              :   /// length as the mask.
    2004              :   static bool isReverseMask(ArrayRef<int> Mask, int NumSrcElts);
    2005              :   static bool isReverseMask(const Constant *Mask, int NumSrcElts) {
    2006              :     assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.");
    2007              :     SmallVector<int, 16> MaskAsInts;
    2008              :     getShuffleMask(Mask, MaskAsInts);
    2009              :     return isReverseMask(MaskAsInts, NumSrcElts);
    2010              :   }
    2011              : 
    2012              :   /// Return true if this shuffle swaps the order of elements from exactly
    2013              :   /// one source vector.
    2014              :   /// Example: shufflevector <4 x n> A, <4 x n> B, <3,undef,1,undef>
    2015              :   /// TODO: Optionally allow length-changing shuffles.
    2016              :   bool isReverse() const {
    2017              :     return !changesLength() && isReverseMask(ShuffleMask, ShuffleMask.size());
    2018              :   }
    2019              : 
    2020              :   /// Return true if this shuffle mask chooses all elements with the same value
    2021              :   /// as the first element of exactly one source vector.
    2022              :   /// Example: <4,undef,undef,4>
    2023              :   /// This assumes that vector operands (of length \p NumSrcElts) are the same
    2024              :   /// length as the mask.
    2025              :   static bool isZeroEltSplatMask(ArrayRef<int> Mask, int NumSrcElts);
    2026              :   static bool isZeroEltSplatMask(const Constant *Mask, int NumSrcElts) {
    2027              :     assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.");
    2028              :     SmallVector<int, 16> MaskAsInts;
    2029              :     getShuffleMask(Mask, MaskAsInts);
    2030              :     return isZeroEltSplatMask(MaskAsInts, NumSrcElts);
    2031              :   }
    2032              : 
    2033              :   /// Return true if all elements of this shuffle are the same value as the
    2034              :   /// first element of exactly one source vector without changing the length
    2035              :   /// of that vector.
    2036              :   /// Example: shufflevector <4 x n> A, <4 x n> B, <undef,0,undef,0>
    2037              :   /// TODO: Optionally allow length-changing shuffles.
    2038              :   /// TODO: Optionally allow splats from other elements.
    2039              :   bool isZeroEltSplat() const {
    2040              :     return !changesLength() &&
    2041              :            isZeroEltSplatMask(ShuffleMask, ShuffleMask.size());
    2042              :   }
    2043              : 
    2044              :   /// Return true if this shuffle mask is a transpose mask.
    2045              :   /// Transpose vector masks transpose a 2xn matrix. They read corresponding
    2046              :   /// even- or odd-numbered vector elements from two n-dimensional source
    2047              :   /// vectors and write each result into consecutive elements of an
    2048              :   /// n-dimensional destination vector. Two shuffles are necessary to complete
    2049              :   /// the transpose, one for the even elements and another for the odd elements.
    2050              :   /// This description closely follows how the TRN1 and TRN2 AArch64
    2051              :   /// instructions operate.
    2052              :   ///
    2053              :   /// For example, a simple 2x2 matrix can be transposed with:
    2054              :   ///
    2055              :   ///   ; Original matrix
    2056              :   ///   m0 = < a, b >
    2057              :   ///   m1 = < c, d >
    2058              :   ///
    2059              :   ///   ; Transposed matrix
    2060              :   ///   t0 = < a, c > = shufflevector m0, m1, < 0, 2 >
    2061              :   ///   t1 = < b, d > = shufflevector m0, m1, < 1, 3 >
    2062              :   ///
    2063              :   /// For matrices having greater than n columns, the resulting nx2 transposed
    2064              :   /// matrix is stored in two result vectors such that one vector contains
    2065              :   /// interleaved elements from all the even-numbered rows and the other vector
    2066              :   /// contains interleaved elements from all the odd-numbered rows. For example,
    2067              :   /// a 2x4 matrix can be transposed with:
    2068              :   ///
    2069              :   ///   ; Original matrix
    2070              :   ///   m0 = < a, b, c, d >
    2071              :   ///   m1 = < e, f, g, h >
    2072              :   ///
    2073              :   ///   ; Transposed matrix
    2074              :   ///   t0 = < a, e, c, g > = shufflevector m0, m1 < 0, 4, 2, 6 >
    2075              :   ///   t1 = < b, f, d, h > = shufflevector m0, m1 < 1, 5, 3, 7 >
    2076              :   static bool isTransposeMask(ArrayRef<int> Mask, int NumSrcElts);
    2077              :   static bool isTransposeMask(const Constant *Mask, int NumSrcElts) {
    2078              :     assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.");
    2079              :     SmallVector<int, 16> MaskAsInts;
    2080              :     getShuffleMask(Mask, MaskAsInts);
    2081              :     return isTransposeMask(MaskAsInts, NumSrcElts);
    2082              :   }
    2083              : 
    2084              :   /// Return true if this shuffle transposes the elements of its inputs without
    2085              :   /// changing the length of the vectors. This operation may also be known as a
    2086              :   /// merge or interleave. See the description for isTransposeMask() for the
    2087              :   /// exact specification.
    2088              :   /// Example: shufflevector <4 x n> A, <4 x n> B, <0,4,2,6>
    2089              :   bool isTranspose() const {
    2090              :     return !changesLength() && isTransposeMask(ShuffleMask, ShuffleMask.size());
    2091              :   }
    2092              : 
    2093              :   /// Return true if this shuffle mask is a splice mask, concatenating the two
    2094              :   /// inputs together and then extracts an original width vector starting from
    2095              :   /// the splice index.
    2096              :   /// Example: shufflevector <4 x n> A, <4 x n> B, <1,2,3,4>
    2097              :   /// This assumes that vector operands (of length \p NumSrcElts) are the same
    2098              :   /// length as the mask.
    2099              :   static bool isSpliceMask(ArrayRef<int> Mask, int NumSrcElts, int &Index);
    2100              :   static bool isSpliceMask(const Constant *Mask, int NumSrcElts, int &Index) {
    2101              :     assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.");
    2102              :     SmallVector<int, 16> MaskAsInts;
    2103              :     getShuffleMask(Mask, MaskAsInts);
    2104              :     return isSpliceMask(MaskAsInts, NumSrcElts, Index);
    2105              :   }
    2106              : 
    2107              :   /// Return true if this shuffle splices two inputs without changing the length
    2108              :   /// of the vectors. This operation concatenates the two inputs together and
    2109              :   /// then extracts an original width vector starting from the splice index.
    2110              :   /// Example: shufflevector <4 x n> A, <4 x n> B, <1,2,3,4>
    2111              :   bool isSplice(int &Index) const {
    2112              :     return !changesLength() &&
    2113              :            isSpliceMask(ShuffleMask, ShuffleMask.size(), Index);
    2114              :   }
    2115              : 
    2116              :   /// Return true if this shuffle mask is an extract subvector mask.
    2117              :   /// A valid extract subvector mask returns a smaller vector from a single
    2118              :   /// source operand. The base extraction index is returned as well.
    2119              :   static bool isExtractSubvectorMask(ArrayRef<int> Mask, int NumSrcElts,
    2120              :                                      int &Index);
    2121              :   static bool isExtractSubvectorMask(const Constant *Mask, int NumSrcElts,
    2122              :                                      int &Index) {
    2123              :     assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.");
    2124              :     // Not possible to express a shuffle mask for a scalable vector for this
    2125              :     // case.
    2126              :     if (isa<ScalableVectorType>(Mask->getType()))
    2127              :       return false;
    2128              :     SmallVector<int, 16> MaskAsInts;
    2129              :     getShuffleMask(Mask, MaskAsInts);
    2130              :     return isExtractSubvectorMask(MaskAsInts, NumSrcElts, Index);
    2131              :   }
    2132              : 
    2133              :   /// Return true if this shuffle mask is an extract subvector mask.
    2134              :   bool isExtractSubvectorMask(int &Index) const {
    2135              :     // Not possible to express a shuffle mask for a scalable vector for this
    2136              :     // case.
    2137              :     if (isa<ScalableVectorType>(getType()))
    2138              :       return false;
    2139              : 
    2140              :     int NumSrcElts =
    2141              :         cast<FixedVectorType>(Op<0>()->getType())->getNumElements();
    2142              :     return isExtractSubvectorMask(ShuffleMask, NumSrcElts, Index);
    2143              :   }
    2144              : 
    2145              :   /// Return true if this shuffle mask is an insert subvector mask.
    2146              :   /// A valid insert subvector mask inserts the lowest elements of a second
    2147              :   /// source operand into an in-place first source operand.
    2148              :   /// Both the sub vector width and the insertion index is returned.
    2149              :   static bool isInsertSubvectorMask(ArrayRef<int> Mask, int NumSrcElts,
    2150              :                                     int &NumSubElts, int &Index);
    2151              :   static bool isInsertSubvectorMask(const Constant *Mask, int NumSrcElts,
    2152              :                                     int &NumSubElts, int &Index) {
    2153              :     assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.");
    2154              :     // Not possible to express a shuffle mask for a scalable vector for this
    2155              :     // case.
    2156              :     if (isa<ScalableVectorType>(Mask->getType()))
    2157              :       return false;
    2158              :     SmallVector<int, 16> MaskAsInts;
    2159              :     getShuffleMask(Mask, MaskAsInts);
    2160              :     return isInsertSubvectorMask(MaskAsInts, NumSrcElts, NumSubElts, Index);
    2161              :   }
    2162              : 
    2163              :   /// Return true if this shuffle mask is an insert subvector mask.
    2164              :   bool isInsertSubvectorMask(int &NumSubElts, int &Index) const {
    2165              :     // Not possible to express a shuffle mask for a scalable vector for this
    2166              :     // case.
    2167              :     if (isa<ScalableVectorType>(getType()))
    2168              :       return false;
    2169              : 
    2170              :     int NumSrcElts =
    2171              :         cast<FixedVectorType>(Op<0>()->getType())->getNumElements();
    2172              :     return isInsertSubvectorMask(ShuffleMask, NumSrcElts, NumSubElts, Index);
    2173              :   }
    2174              : 
    2175              :   /// Return true if this shuffle mask replicates each of the \p VF elements
    2176              :   /// in a vector \p ReplicationFactor times.
    2177              :   /// For example, the mask for \p ReplicationFactor=3 and \p VF=4 is:
    2178              :   ///   <0,0,0,1,1,1,2,2,2,3,3,3>
    2179              :   static bool isReplicationMask(ArrayRef<int> Mask, int &ReplicationFactor,
    2180              :                                 int &VF);
    2181              :   static bool isReplicationMask(const Constant *Mask, int &ReplicationFactor,
    2182              :                                 int &VF) {
    2183              :     assert(Mask->getType()->isVectorTy() && "Shuffle needs vector constant.");
    2184              :     // Not possible to express a shuffle mask for a scalable vector for this
    2185              :     // case.
    2186              :     if (isa<ScalableVectorType>(Mask->getType()))
    2187              :       return false;
    2188              :     SmallVector<int, 16> MaskAsInts;
    2189              :     getShuffleMask(Mask, MaskAsInts);
    2190              :     return isReplicationMask(MaskAsInts, ReplicationFactor, VF);
    2191              :   }
    2192              : 
    2193              :   /// Return true if this shuffle mask is a replication mask.
    2194              :   bool isReplicationMask(int &ReplicationFactor, int &VF) const;
    2195              : 
    2196              :   /// Return true if this shuffle mask represents "clustered" mask of size VF,
    2197              :   /// i.e. each index between [0..VF) is used exactly once in each submask of
    2198              :   /// size VF.
    2199              :   /// For example, the mask for \p VF=4 is:
    2200              :   /// 0, 1, 2, 3, 3, 2, 0, 1 - "clustered", because each submask of size 4
    2201              :   /// (0,1,2,3 and 3,2,0,1) uses indices [0..VF) exactly one time.
    2202              :   /// 0, 1, 2, 3, 3, 3, 1, 0 - not "clustered", because
    2203              :   ///                          element 3 is used twice in the second submask
    2204              :   ///                          (3,3,1,0) and index 2 is not used at all.
    2205              :   static bool isOneUseSingleSourceMask(ArrayRef<int> Mask, int VF);
    2206              : 
    2207              :   /// Return true if this shuffle mask is a one-use-single-source("clustered")
    2208              :   /// mask.
    2209              :   bool isOneUseSingleSourceMask(int VF) const;
    2210              : 
    2211              :   /// Change values in a shuffle permute mask assuming the two vector operands
    2212              :   /// of length InVecNumElts have swapped position.
    2213              :   static void commuteShuffleMask(MutableArrayRef<int> Mask,
    2214              :                                  unsigned InVecNumElts) {
    2215              :     for (int &Idx : Mask) {
    2216              :       if (Idx == -1)
    2217              :         continue;
    2218              :       Idx = Idx < (int)InVecNumElts ? Idx + InVecNumElts : Idx - InVecNumElts;
    2219              :       assert(Idx >= 0 && Idx < (int)InVecNumElts * 2 &&
    2220              :              "shufflevector mask index out of range");
    2221              :     }
    2222              :   }
    2223              : 
    2224              :   /// Return if this shuffle interleaves its two input vectors together.
    2225              :   bool isInterleave(unsigned Factor);
    2226              : 
    2227              :   /// Return true if the mask interleaves one or more input vectors together.
    2228              :   ///
    2229              :   /// I.e. <0, LaneLen, ... , LaneLen*(Factor - 1), 1, LaneLen + 1, ...>
    2230              :   /// E.g. For a Factor of 2 (LaneLen=4):
    2231              :   ///   <0, 4, 1, 5, 2, 6, 3, 7>
    2232              :   /// E.g. For a Factor of 3 (LaneLen=4):
    2233              :   ///   <4, 0, 9, 5, 1, 10, 6, 2, 11, 7, 3, 12>
    2234              :   /// E.g. For a Factor of 4 (LaneLen=2):
    2235              :   ///   <0, 2, 6, 4, 1, 3, 7, 5>
    2236              :   ///
    2237              :   /// NumInputElts is the total number of elements in the input vectors.
    2238              :   ///
    2239              :   /// StartIndexes are the first indexes of each vector being interleaved,
    2240              :   /// substituting any indexes that were undef
    2241              :   /// E.g. <4, -1, 2, 5, 1, 3> (Factor=3): StartIndexes=<4, 0, 2>
    2242              :   ///
    2243              :   /// Note that this does not check if the input vectors are consecutive:
    2244              :   /// It will return true for masks such as
    2245              :   /// <0, 4, 6, 1, 5, 7> (Factor=3, LaneLen=2)
    2246              :   static bool isInterleaveMask(ArrayRef<int> Mask, unsigned Factor,
    2247              :                                unsigned NumInputElts,
    2248              :                                SmallVectorImpl<unsigned> &StartIndexes);
    2249              :   static bool isInterleaveMask(ArrayRef<int> Mask, unsigned Factor,
    2250              :                                unsigned NumInputElts) {
    2251              :     SmallVector<unsigned, 8> StartIndexes;
    2252              :     return isInterleaveMask(Mask, Factor, NumInputElts, StartIndexes);
    2253              :   }
    2254              : 
    2255              :   /// Check if the mask is a DE-interleave mask of the given factor
    2256              :   /// \p Factor like:
    2257              :   ///     <Index, Index+Factor, ..., Index+(NumElts-1)*Factor>
    2258              :   static bool isDeInterleaveMaskOfFactor(ArrayRef<int> Mask, unsigned Factor,
    2259              :                                          unsigned &Index);
    2260              :   static bool isDeInterleaveMaskOfFactor(ArrayRef<int> Mask, unsigned Factor) {
    2261              :     unsigned Unused;
    2262              :     return isDeInterleaveMaskOfFactor(Mask, Factor, Unused);
    2263              :   }
    2264              : 
    2265              :   /// Checks if the shuffle is a bit rotation of the first operand across
    2266              :   /// multiple subelements, e.g:
    2267              :   ///
    2268              :   /// shuffle <8 x i8> %a, <8 x i8> poison, <8 x i32> <1, 0, 3, 2, 5, 4, 7, 6>
    2269              :   ///
    2270              :   /// could be expressed as
    2271              :   ///
    2272              :   /// rotl <4 x i16> %a, 8
    2273              :   ///
    2274              :   /// If it can be expressed as a rotation, returns the number of subelements to
    2275              :   /// group by in NumSubElts and the number of bits to rotate left in RotateAmt.
    2276              :   static bool isBitRotateMask(ArrayRef<int> Mask, unsigned EltSizeInBits,
    2277              :                               unsigned MinSubElts, unsigned MaxSubElts,
    2278              :                               unsigned &NumSubElts, unsigned &RotateAmt);
    2279              : 
    2280              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    2281              :   static bool classof(const Instruction *I) {
    2282              :     return I->getOpcode() == Instruction::ShuffleVector;
    2283              :   }
    2284              :   static bool classof(const Value *V) {
    2285              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    2286              :   }
    2287              : };
    2288              : 
    2289              : template <>
    2290              : struct OperandTraits<ShuffleVectorInst>
    2291              :     : public FixedNumOperandTraits<ShuffleVectorInst, 2> {};
    2292              : 
    2293              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ShuffleVectorInst, Value)
    2294              : 
    2295              : //===----------------------------------------------------------------------===//
    2296              : //                                ExtractValueInst Class
    2297              : //===----------------------------------------------------------------------===//
    2298              : 
    2299              : /// This instruction extracts a struct member or array
    2300              : /// element value from an aggregate value.
    2301              : ///
    2302              : class ExtractValueInst : public UnaryInstruction {
    2303              :   SmallVector<unsigned, 4> Indices;
    2304              : 
    2305              :   ExtractValueInst(const ExtractValueInst &EVI);
    2306              : 
    2307              :   /// Constructors - Create a extractvalue instruction with a base aggregate
    2308              :   /// value and a list of indices. The first and second ctor can optionally
    2309              :   /// insert before an existing instruction, the third appends the new
    2310              :   /// instruction to the specified BasicBlock.
    2311              :   inline ExtractValueInst(Value *Agg, ArrayRef<unsigned> Idxs,
    2312              :                           const Twine &NameStr, InsertPosition InsertBefore);
    2313              : 
    2314              :   void init(ArrayRef<unsigned> Idxs, const Twine &NameStr);
    2315              : 
    2316              : protected:
    2317              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    2318              :   friend class Instruction;
    2319              : 
    2320              :   ExtractValueInst *cloneImpl() const;
    2321              : 
    2322              : public:
    2323              :   static ExtractValueInst *Create(Value *Agg, ArrayRef<unsigned> Idxs,
    2324              :                                   const Twine &NameStr = "",
    2325              :                                   InsertPosition InsertBefore = nullptr) {
    2326              :     return new
    2327              :       ExtractValueInst(Agg, Idxs, NameStr, InsertBefore);
    2328              :   }
    2329              : 
    2330              :   /// Returns the type of the element that would be extracted
    2331              :   /// with an extractvalue instruction with the specified parameters.
    2332              :   ///
    2333              :   /// Null is returned if the indices are invalid for the specified type.
    2334              :   static Type *getIndexedType(Type *Agg, ArrayRef<unsigned> Idxs);
    2335              : 
    2336              :   using idx_iterator = const unsigned*;
    2337              : 
    2338              :   inline idx_iterator idx_begin() const { return Indices.begin(); }
    2339              :   inline idx_iterator idx_end()   const { return Indices.end(); }
    2340              :   inline iterator_range<idx_iterator> indices() const {
    2341              :     return make_range(idx_begin(), idx_end());
    2342              :   }
    2343              : 
    2344              :   Value *getAggregateOperand() {
    2345              :     return getOperand(0);
    2346              :   }
    2347              :   const Value *getAggregateOperand() const {
    2348              :     return getOperand(0);
    2349              :   }
    2350              :   static unsigned getAggregateOperandIndex() {
    2351              :     return 0U;                      // get index for modifying correct operand
    2352              :   }
    2353              : 
    2354              :   ArrayRef<unsigned> getIndices() const {
    2355              :     return Indices;
    2356              :   }
    2357              : 
    2358              :   unsigned getNumIndices() const {
    2359              :     return (unsigned)Indices.size();
    2360              :   }
    2361              : 
    2362              :   bool hasIndices() const {
    2363              :     return true;
    2364              :   }
    2365              : 
    2366              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    2367              :   static bool classof(const Instruction *I) {
    2368              :     return I->getOpcode() == Instruction::ExtractValue;
    2369              :   }
    2370              :   static bool classof(const Value *V) {
    2371              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    2372              :   }
    2373              : };
    2374              : 
    2375              : ExtractValueInst::ExtractValueInst(Value *Agg, ArrayRef<unsigned> Idxs,
    2376              :                                    const Twine &NameStr,
    2377              :                                    InsertPosition InsertBefore)
    2378              :     : UnaryInstruction(checkGEPType(getIndexedType(Agg->getType(), Idxs)),
    2379              :                        ExtractValue, Agg, InsertBefore) {
    2380              :   init(Idxs, NameStr);
    2381              : }
    2382              : 
    2383              : //===----------------------------------------------------------------------===//
    2384              : //                                InsertValueInst Class
    2385              : //===----------------------------------------------------------------------===//
    2386              : 
    2387              : /// This instruction inserts a struct field of array element
    2388              : /// value into an aggregate value.
    2389              : ///
    2390              : class InsertValueInst : public Instruction {
    2391              :   SmallVector<unsigned, 4> Indices;
    2392              : 
    2393              :   InsertValueInst(const InsertValueInst &IVI);
    2394              : 
    2395              :   /// Constructors - Create a insertvalue instruction with a base aggregate
    2396              :   /// value, a value to insert, and a list of indices. The first and second ctor
    2397              :   /// can optionally insert before an existing instruction, the third appends
    2398              :   /// the new instruction to the specified BasicBlock.
    2399              :   inline InsertValueInst(Value *Agg, Value *Val, ArrayRef<unsigned> Idxs,
    2400              :                          const Twine &NameStr, InsertPosition InsertBefore);
    2401              : 
    2402              :   /// Constructors - These three constructors are convenience methods because
    2403              :   /// one and two index insertvalue instructions are so common.
    2404              :   InsertValueInst(Value *Agg, Value *Val, unsigned Idx,
    2405              :                   const Twine &NameStr = "",
    2406              :                   InsertPosition InsertBefore = nullptr);
    2407              : 
    2408              :   void init(Value *Agg, Value *Val, ArrayRef<unsigned> Idxs,
    2409              :             const Twine &NameStr);
    2410              : 
    2411              : protected:
    2412              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    2413              :   friend class Instruction;
    2414              : 
    2415              :   InsertValueInst *cloneImpl() const;
    2416              : 
    2417              : public:
    2418              :   // allocate space for exactly two operands
    2419              :   void *operator new(size_t S) { return User::operator new(S, 2); }
    2420              :   void operator delete(void *Ptr) { User::operator delete(Ptr); }
    2421              : 
    2422              :   static InsertValueInst *Create(Value *Agg, Value *Val,
    2423              :                                  ArrayRef<unsigned> Idxs,
    2424              :                                  const Twine &NameStr = "",
    2425              :                                  InsertPosition InsertBefore = nullptr) {
    2426              :     return new InsertValueInst(Agg, Val, Idxs, NameStr, InsertBefore);
    2427              :   }
    2428              : 
    2429              :   /// Transparently provide more efficient getOperand methods.
    2430              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    2431              : 
    2432              :   using idx_iterator = const unsigned*;
    2433              : 
    2434              :   inline idx_iterator idx_begin() const { return Indices.begin(); }
    2435              :   inline idx_iterator idx_end()   const { return Indices.end(); }
    2436              :   inline iterator_range<idx_iterator> indices() const {
    2437              :     return make_range(idx_begin(), idx_end());
    2438              :   }
    2439              : 
    2440              :   Value *getAggregateOperand() {
    2441              :     return getOperand(0);
    2442              :   }
    2443              :   const Value *getAggregateOperand() const {
    2444              :     return getOperand(0);
    2445              :   }
    2446              :   static unsigned getAggregateOperandIndex() {
    2447              :     return 0U;                      // get index for modifying correct operand
    2448              :   }
    2449              : 
    2450              :   Value *getInsertedValueOperand() {
    2451              :     return getOperand(1);
    2452              :   }
    2453              :   const Value *getInsertedValueOperand() const {
    2454              :     return getOperand(1);
    2455              :   }
    2456              :   static unsigned getInsertedValueOperandIndex() {
    2457              :     return 1U;                      // get index for modifying correct operand
    2458              :   }
    2459              : 
    2460              :   ArrayRef<unsigned> getIndices() const {
    2461              :     return Indices;
    2462              :   }
    2463              : 
    2464              :   unsigned getNumIndices() const {
    2465              :     return (unsigned)Indices.size();
    2466              :   }
    2467              : 
    2468              :   bool hasIndices() const {
    2469              :     return true;
    2470              :   }
    2471              : 
    2472              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    2473              :   static bool classof(const Instruction *I) {
    2474              :     return I->getOpcode() == Instruction::InsertValue;
    2475              :   }
    2476              :   static bool classof(const Value *V) {
    2477              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    2478              :   }
    2479              : };
    2480              : 
    2481              : template <>
    2482              : struct OperandTraits<InsertValueInst> :
    2483              :   public FixedNumOperandTraits<InsertValueInst, 2> {
    2484              : };
    2485              : 
    2486              : InsertValueInst::InsertValueInst(Value *Agg, Value *Val,
    2487              :                                  ArrayRef<unsigned> Idxs, const Twine &NameStr,
    2488              :                                  InsertPosition InsertBefore)
    2489              :     : Instruction(Agg->getType(), InsertValue,
    2490              :                   OperandTraits<InsertValueInst>::op_begin(this), 2,
    2491              :                   InsertBefore) {
    2492              :   init(Agg, Val, Idxs, NameStr);
    2493              : }
    2494              : 
    2495              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertValueInst, Value)
    2496              : 
    2497              : //===----------------------------------------------------------------------===//
    2498              : //                               PHINode Class
    2499              : //===----------------------------------------------------------------------===//
    2500              : 
    2501              : // PHINode - The PHINode class is used to represent the magical mystical PHI
    2502              : // node, that can not exist in nature, but can be synthesized in a computer
    2503              : // scientist's overactive imagination.
    2504              : //
    2505              : class PHINode : public Instruction {
    2506              :   /// The number of operands actually allocated.  NumOperands is
    2507              :   /// the number actually in use.
    2508              :   unsigned ReservedSpace;
    2509              : 
    2510              :   PHINode(const PHINode &PN);
    2511              : 
    2512              :   explicit PHINode(Type *Ty, unsigned NumReservedValues,
    2513              :                    const Twine &NameStr = "",
    2514              :                    InsertPosition InsertBefore = nullptr)
    2515              :       : Instruction(Ty, Instruction::PHI, nullptr, 0, InsertBefore),
    2516              :         ReservedSpace(NumReservedValues) {
    2517              :     assert(!Ty->isTokenTy() && "PHI nodes cannot have token type!");
    2518              :     setName(NameStr);
    2519              :     allocHungoffUses(ReservedSpace);
    2520              :   }
    2521              : 
    2522              : protected:
    2523              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    2524              :   friend class Instruction;
    2525              : 
    2526              :   PHINode *cloneImpl() const;
    2527              : 
    2528              :   // allocHungoffUses - this is more complicated than the generic
    2529              :   // User::allocHungoffUses, because we have to allocate Uses for the incoming
    2530              :   // values and pointers to the incoming blocks, all in one allocation.
    2531              :   void allocHungoffUses(unsigned N) {
    2532              :     User::allocHungoffUses(N, /* IsPhi */ true);
    2533              :   }
    2534              : 
    2535              : public:
    2536              :   /// Constructors - NumReservedValues is a hint for the number of incoming
    2537              :   /// edges that this phi node will have (use 0 if you really have no idea).
    2538              :   static PHINode *Create(Type *Ty, unsigned NumReservedValues,
    2539              :                          const Twine &NameStr = "",
    2540              :                          InsertPosition InsertBefore = nullptr) {
    2541              :     return new PHINode(Ty, NumReservedValues, NameStr, InsertBefore);
    2542              :   }
    2543              : 
    2544              :   /// Provide fast operand accessors
    2545              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    2546              : 
    2547              :   // Block iterator interface. This provides access to the list of incoming
    2548              :   // basic blocks, which parallels the list of incoming values.
    2549              :   // Please note that we are not providing non-const iterators for blocks to
    2550              :   // force all updates go through an interface function.
    2551              : 
    2552              :   using block_iterator = BasicBlock **;
    2553              :   using const_block_iterator = BasicBlock * const *;
    2554              : 
    2555              :   const_block_iterator block_begin() const {
    2556              :     return reinterpret_cast<const_block_iterator>(op_begin() + ReservedSpace);
    2557              :   }
    2558              : 
    2559              :   const_block_iterator block_end() const {
    2560              :     return block_begin() + getNumOperands();
    2561              :   }
    2562              : 
    2563              :   iterator_range<const_block_iterator> blocks() const {
    2564              :     return make_range(block_begin(), block_end());
    2565              :   }
    2566              : 
    2567              :   op_range incoming_values() { return operands(); }
    2568              : 
    2569              :   const_op_range incoming_values() const { return operands(); }
    2570              : 
    2571              :   /// Return the number of incoming edges
    2572              :   ///
    2573              :   unsigned getNumIncomingValues() const { return getNumOperands(); }
    2574              : 
    2575              :   /// Return incoming value number x
    2576              :   ///
    2577              :   Value *getIncomingValue(unsigned i) const {
    2578              :     return getOperand(i);
    2579              :   }
    2580              :   void setIncomingValue(unsigned i, Value *V) {
    2581              :     assert(V && "PHI node got a null value!");
    2582              :     assert(getType() == V->getType() &&
    2583              :            "All operands to PHI node must be the same type as the PHI node!");
    2584              :     setOperand(i, V);
    2585              :   }
    2586              : 
    2587              :   static unsigned getOperandNumForIncomingValue(unsigned i) {
    2588              :     return i;
    2589              :   }
    2590              : 
    2591              :   static unsigned getIncomingValueNumForOperand(unsigned i) {
    2592              :     return i;
    2593              :   }
    2594              : 
    2595              :   /// Return incoming basic block number @p i.
    2596              :   ///
    2597              :   BasicBlock *getIncomingBlock(unsigned i) const {
    2598              :     return block_begin()[i];
    2599              :   }
    2600              : 
    2601              :   /// Return incoming basic block corresponding
    2602              :   /// to an operand of the PHI.
    2603              :   ///
    2604              :   BasicBlock *getIncomingBlock(const Use &U) const {
    2605              :     assert(this == U.getUser() && "Iterator doesn't point to PHI's Uses?");
    2606              :     return getIncomingBlock(unsigned(&U - op_begin()));
    2607              :   }
    2608              : 
    2609              :   /// Return incoming basic block corresponding
    2610              :   /// to value use iterator.
    2611              :   ///
    2612              :   BasicBlock *getIncomingBlock(Value::const_user_iterator I) const {
    2613              :     return getIncomingBlock(I.getUse());
    2614              :   }
    2615              : 
    2616              :   void setIncomingBlock(unsigned i, BasicBlock *BB) {
    2617              :     const_cast<block_iterator>(block_begin())[i] = BB;
    2618              :   }
    2619              : 
    2620              :   /// Copies the basic blocks from \p BBRange to the incoming basic block list
    2621              :   /// of this PHINode, starting at \p ToIdx.
    2622              :   void copyIncomingBlocks(iterator_range<const_block_iterator> BBRange,
    2623              :                           uint32_t ToIdx = 0) {
    2624              :     copy(BBRange, const_cast<block_iterator>(block_begin()) + ToIdx);
    2625              :   }
    2626              : 
    2627              :   /// Replace every incoming basic block \p Old to basic block \p New.
    2628              :   void replaceIncomingBlockWith(const BasicBlock *Old, BasicBlock *New) {
    2629              :     assert(New && Old && "PHI node got a null basic block!");
    2630              :     for (unsigned Op = 0, NumOps = getNumOperands(); Op != NumOps; ++Op)
    2631              :       if (getIncomingBlock(Op) == Old)
    2632              :         setIncomingBlock(Op, New);
    2633              :   }
    2634              : 
    2635              :   /// Add an incoming value to the end of the PHI list
    2636              :   ///
    2637              :   void addIncoming(Value *V, BasicBlock *BB) {
    2638              :     if (getNumOperands() == ReservedSpace)
    2639              :       growOperands();  // Get more space!
    2640              :     // Initialize some new operands.
    2641              :     setNumHungOffUseOperands(getNumOperands() + 1);
    2642              :     setIncomingValue(getNumOperands() - 1, V);
    2643              :     setIncomingBlock(getNumOperands() - 1, BB);
    2644              :   }
    2645              : 
    2646              :   /// Remove an incoming value.  This is useful if a
    2647              :   /// predecessor basic block is deleted.  The value removed is returned.
    2648              :   ///
    2649              :   /// If the last incoming value for a PHI node is removed (and DeletePHIIfEmpty
    2650              :   /// is true), the PHI node is destroyed and any uses of it are replaced with
    2651              :   /// dummy values.  The only time there should be zero incoming values to a PHI
    2652              :   /// node is when the block is dead, so this strategy is sound.
    2653              :   ///
    2654              :   Value *removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty = true);
    2655              : 
    2656              :   Value *removeIncomingValue(const BasicBlock *BB, bool DeletePHIIfEmpty=true) {
    2657              :     int Idx = getBasicBlockIndex(BB);
    2658              :     assert(Idx >= 0 && "Invalid basic block argument to remove!");
    2659              :     return removeIncomingValue(Idx, DeletePHIIfEmpty);
    2660              :   }
    2661              : 
    2662              :   /// Remove all incoming values for which the predicate returns true.
    2663              :   /// The predicate accepts the incoming value index.
    2664              :   void removeIncomingValueIf(function_ref<bool(unsigned)> Predicate,
    2665              :                              bool DeletePHIIfEmpty = true);
    2666              : 
    2667              :   /// Return the first index of the specified basic
    2668              :   /// block in the value list for this PHI.  Returns -1 if no instance.
    2669              :   ///
    2670              :   int getBasicBlockIndex(const BasicBlock *BB) const {
    2671              :     for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
    2672              :       if (block_begin()[i] == BB)
    2673              :         return i;
    2674              :     return -1;
    2675              :   }
    2676              : 
    2677              :   Value *getIncomingValueForBlock(const BasicBlock *BB) const {
    2678              :     int Idx = getBasicBlockIndex(BB);
    2679              :     assert(Idx >= 0 && "Invalid basic block argument!");
    2680              :     return getIncomingValue(Idx);
    2681              :   }
    2682              : 
    2683              :   /// Set every incoming value(s) for block \p BB to \p V.
    2684              :   void setIncomingValueForBlock(const BasicBlock *BB, Value *V) {
    2685              :     assert(BB && "PHI node got a null basic block!");
    2686              :     bool Found = false;
    2687              :     for (unsigned Op = 0, NumOps = getNumOperands(); Op != NumOps; ++Op)
    2688              :       if (getIncomingBlock(Op) == BB) {
    2689              :         Found = true;
    2690              :         setIncomingValue(Op, V);
    2691              :       }
    2692              :     (void)Found;
    2693              :     assert(Found && "Invalid basic block argument to set!");
    2694              :   }
    2695              : 
    2696              :   /// If the specified PHI node always merges together the
    2697              :   /// same value, return the value, otherwise return null.
    2698              :   Value *hasConstantValue() const;
    2699              : 
    2700              :   /// Whether the specified PHI node always merges
    2701              :   /// together the same value, assuming undefs are equal to a unique
    2702              :   /// non-undef value.
    2703              :   bool hasConstantOrUndefValue() const;
    2704              : 
    2705              :   /// If the PHI node is complete which means all of its parent's predecessors
    2706              :   /// have incoming value in this PHI, return true, otherwise return false.
    2707              :   bool isComplete() const {
    2708              :     return llvm::all_of(predecessors(getParent()),
    2709              :                         [this](const BasicBlock *Pred) {
    2710              :                           return getBasicBlockIndex(Pred) >= 0;
    2711              :                         });
    2712              :   }
    2713              : 
    2714              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    2715              :   static bool classof(const Instruction *I) {
    2716              :     return I->getOpcode() == Instruction::PHI;
    2717              :   }
    2718              :   static bool classof(const Value *V) {
    2719              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    2720              :   }
    2721              : 
    2722              : private:
    2723              :   void growOperands();
    2724              : };
    2725              : 
    2726              : template <>
    2727              : struct OperandTraits<PHINode> : public HungoffOperandTraits<2> {
    2728              : };
    2729              : 
    2730              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(PHINode, Value)
    2731              : 
    2732              : //===----------------------------------------------------------------------===//
    2733              : //                           LandingPadInst Class
    2734              : //===----------------------------------------------------------------------===//
    2735              : 
    2736              : //===---------------------------------------------------------------------------
    2737              : /// The landingpad instruction holds all of the information
    2738              : /// necessary to generate correct exception handling. The landingpad instruction
    2739              : /// cannot be moved from the top of a landing pad block, which itself is
    2740              : /// accessible only from the 'unwind' edge of an invoke. This uses the
    2741              : /// SubclassData field in Value to store whether or not the landingpad is a
    2742              : /// cleanup.
    2743              : ///
    2744              : class LandingPadInst : public Instruction {
    2745              :   using CleanupField = BoolBitfieldElementT<0>;
    2746              : 
    2747              :   /// The number of operands actually allocated.  NumOperands is
    2748              :   /// the number actually in use.
    2749              :   unsigned ReservedSpace;
    2750              : 
    2751              :   LandingPadInst(const LandingPadInst &LP);
    2752              : 
    2753              : public:
    2754              :   enum ClauseType { Catch, Filter };
    2755              : 
    2756              : private:
    2757              :   explicit LandingPadInst(Type *RetTy, unsigned NumReservedValues,
    2758              :                           const Twine &NameStr, InsertPosition InsertBefore);
    2759              : 
    2760              :   // Allocate space for exactly zero operands.
    2761              :   void *operator new(size_t S) { return User::operator new(S); }
    2762              : 
    2763              :   void growOperands(unsigned Size);
    2764              :   void init(unsigned NumReservedValues, const Twine &NameStr);
    2765              : 
    2766              : protected:
    2767              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    2768              :   friend class Instruction;
    2769              : 
    2770              :   LandingPadInst *cloneImpl() const;
    2771              : 
    2772              : public:
    2773              :   void operator delete(void *Ptr) { User::operator delete(Ptr); }
    2774              : 
    2775              :   /// Constructors - NumReservedClauses is a hint for the number of incoming
    2776              :   /// clauses that this landingpad will have (use 0 if you really have no idea).
    2777              :   static LandingPadInst *Create(Type *RetTy, unsigned NumReservedClauses,
    2778              :                                 const Twine &NameStr = "",
    2779              :                                 InsertPosition InsertBefore = nullptr);
    2780              : 
    2781              :   /// Provide fast operand accessors
    2782              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    2783              : 
    2784              :   /// Return 'true' if this landingpad instruction is a
    2785              :   /// cleanup. I.e., it should be run when unwinding even if its landing pad
    2786              :   /// doesn't catch the exception.
    2787              :   bool isCleanup() const { return getSubclassData<CleanupField>(); }
    2788              : 
    2789              :   /// Indicate that this landingpad instruction is a cleanup.
    2790              :   void setCleanup(bool V) { setSubclassData<CleanupField>(V); }
    2791              : 
    2792              :   /// Add a catch or filter clause to the landing pad.
    2793              :   void addClause(Constant *ClauseVal);
    2794              : 
    2795              :   /// Get the value of the clause at index Idx. Use isCatch/isFilter to
    2796              :   /// determine what type of clause this is.
    2797              :   Constant *getClause(unsigned Idx) const {
    2798              :     return cast<Constant>(getOperandList()[Idx]);
    2799              :   }
    2800              : 
    2801              :   /// Return 'true' if the clause and index Idx is a catch clause.
    2802              :   bool isCatch(unsigned Idx) const {
    2803              :     return !isa<ArrayType>(getOperandList()[Idx]->getType());
    2804              :   }
    2805              : 
    2806              :   /// Return 'true' if the clause and index Idx is a filter clause.
    2807              :   bool isFilter(unsigned Idx) const {
    2808              :     return isa<ArrayType>(getOperandList()[Idx]->getType());
    2809              :   }
    2810              : 
    2811              :   /// Get the number of clauses for this landing pad.
    2812              :   unsigned getNumClauses() const { return getNumOperands(); }
    2813              : 
    2814              :   /// Grow the size of the operand list to accommodate the new
    2815              :   /// number of clauses.
    2816              :   void reserveClauses(unsigned Size) { growOperands(Size); }
    2817              : 
    2818              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    2819              :   static bool classof(const Instruction *I) {
    2820              :     return I->getOpcode() == Instruction::LandingPad;
    2821              :   }
    2822              :   static bool classof(const Value *V) {
    2823              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    2824              :   }
    2825              : };
    2826              : 
    2827              : template <>
    2828              : struct OperandTraits<LandingPadInst> : public HungoffOperandTraits<1> {
    2829              : };
    2830              : 
    2831              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(LandingPadInst, Value)
    2832              : 
    2833              : //===----------------------------------------------------------------------===//
    2834              : //                               ReturnInst Class
    2835              : //===----------------------------------------------------------------------===//
    2836              : 
    2837              : //===---------------------------------------------------------------------------
    2838              : /// Return a value (possibly void), from a function.  Execution
    2839              : /// does not continue in this function any longer.
    2840              : ///
    2841              : class ReturnInst : public Instruction {
    2842              :   ReturnInst(const ReturnInst &RI);
    2843              : 
    2844              : private:
    2845              :   // ReturnInst constructors:
    2846              :   // ReturnInst()                  - 'ret void' instruction
    2847              :   // ReturnInst(    null)          - 'ret void' instruction
    2848              :   // ReturnInst(Value* X)          - 'ret X'    instruction
    2849              :   // ReturnInst(null, Iterator It) - 'ret void' instruction, insert before I
    2850              :   // ReturnInst(Value* X, Iterator It) - 'ret X'    instruction, insert before I
    2851              :   // ReturnInst(    null, Inst *I) - 'ret void' instruction, insert before I
    2852              :   // ReturnInst(Value* X, Inst *I) - 'ret X'    instruction, insert before I
    2853              :   // ReturnInst(    null, BB *B)   - 'ret void' instruction, insert @ end of B
    2854              :   // ReturnInst(Value* X, BB *B)   - 'ret X'    instruction, insert @ end of B
    2855              :   //
    2856              :   // NOTE: If the Value* passed is of type void then the constructor behaves as
    2857              :   // if it was passed NULL.
    2858              :   explicit ReturnInst(LLVMContext &C, Value *retVal = nullptr,
    2859              :                       InsertPosition InsertBefore = nullptr);
    2860              : 
    2861              : protected:
    2862              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    2863              :   friend class Instruction;
    2864              : 
    2865              :   ReturnInst *cloneImpl() const;
    2866              : 
    2867              : public:
    2868            0 :   static ReturnInst *Create(LLVMContext &C, Value *retVal = nullptr,
    2869              :                             InsertPosition InsertBefore = nullptr) {
    2870            0 :     return new(!!retVal) ReturnInst(C, retVal, InsertBefore);
    2871              :   }
    2872              : 
    2873              :   static ReturnInst *Create(LLVMContext &C, BasicBlock *InsertAtEnd) {
    2874              :     return new (0) ReturnInst(C, nullptr, InsertAtEnd);
    2875              :   }
    2876              : 
    2877              :   /// Provide fast operand accessors
    2878              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    2879              : 
    2880              :   /// Convenience accessor. Returns null if there is no return value.
    2881              :   Value *getReturnValue() const {
    2882              :     return getNumOperands() != 0 ? getOperand(0) : nullptr;
    2883              :   }
    2884              : 
    2885              :   unsigned getNumSuccessors() const { return 0; }
    2886              : 
    2887              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    2888              :   static bool classof(const Instruction *I) {
    2889              :     return (I->getOpcode() == Instruction::Ret);
    2890              :   }
    2891              :   static bool classof(const Value *V) {
    2892              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    2893              :   }
    2894              : 
    2895              : private:
    2896              :   BasicBlock *getSuccessor(unsigned idx) const {
    2897              :     llvm_unreachable("ReturnInst has no successors!");
    2898              :   }
    2899              : 
    2900              :   void setSuccessor(unsigned idx, BasicBlock *B) {
    2901              :     llvm_unreachable("ReturnInst has no successors!");
    2902              :   }
    2903              : };
    2904              : 
    2905              : template <>
    2906              : struct OperandTraits<ReturnInst> : public VariadicOperandTraits<ReturnInst> {
    2907              : };
    2908              : 
    2909              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ReturnInst, Value)
    2910              : 
    2911              : //===----------------------------------------------------------------------===//
    2912              : //                               BranchInst Class
    2913              : //===----------------------------------------------------------------------===//
    2914              : 
    2915              : //===---------------------------------------------------------------------------
    2916              : /// Conditional or Unconditional Branch instruction.
    2917              : ///
    2918              : class BranchInst : public Instruction {
    2919              :   /// Ops list - Branches are strange.  The operands are ordered:
    2920              :   ///  [Cond, FalseDest,] TrueDest.  This makes some accessors faster because
    2921              :   /// they don't have to check for cond/uncond branchness. These are mostly
    2922              :   /// accessed relative from op_end().
    2923              :   BranchInst(const BranchInst &BI);
    2924              :   // BranchInst constructors (where {B, T, F} are blocks, and C is a condition):
    2925              :   // BranchInst(BB *B)                           - 'br B'
    2926              :   // BranchInst(BB* T, BB *F, Value *C)          - 'br C, T, F'
    2927              :   // BranchInst(BB* B, Iter It)                  - 'br B'        insert before I
    2928              :   // BranchInst(BB* T, BB *F, Value *C, Iter It) - 'br C, T, F', insert before I
    2929              :   // BranchInst(BB* B, Inst *I)                  - 'br B'        insert before I
    2930              :   // BranchInst(BB* T, BB *F, Value *C, Inst *I) - 'br C, T, F', insert before I
    2931              :   // BranchInst(BB* B, BB *I)                    - 'br B'        insert at end
    2932              :   // BranchInst(BB* T, BB *F, Value *C, BB *I)   - 'br C, T, F', insert at end
    2933              :   explicit BranchInst(BasicBlock *IfTrue,
    2934              :                       InsertPosition InsertBefore = nullptr);
    2935              :   BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *Cond,
    2936              :              InsertPosition InsertBefore = nullptr);
    2937              : 
    2938              :   void AssertOK();
    2939              : 
    2940              : protected:
    2941              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    2942              :   friend class Instruction;
    2943              : 
    2944              :   BranchInst *cloneImpl() const;
    2945              : 
    2946              : public:
    2947              :   /// Iterator type that casts an operand to a basic block.
    2948              :   ///
    2949              :   /// This only makes sense because the successors are stored as adjacent
    2950              :   /// operands for branch instructions.
    2951              :   struct succ_op_iterator
    2952              :       : iterator_adaptor_base<succ_op_iterator, value_op_iterator,
    2953              :                               std::random_access_iterator_tag, BasicBlock *,
    2954              :                               ptrdiff_t, BasicBlock *, BasicBlock *> {
    2955              :     explicit succ_op_iterator(value_op_iterator I) : iterator_adaptor_base(I) {}
    2956              : 
    2957              :     BasicBlock *operator*() const { return cast<BasicBlock>(*I); }
    2958              :     BasicBlock *operator->() const { return operator*(); }
    2959              :   };
    2960              : 
    2961              :   /// The const version of `succ_op_iterator`.
    2962              :   struct const_succ_op_iterator
    2963              :       : iterator_adaptor_base<const_succ_op_iterator, const_value_op_iterator,
    2964              :                               std::random_access_iterator_tag,
    2965              :                               const BasicBlock *, ptrdiff_t, const BasicBlock *,
    2966              :                               const BasicBlock *> {
    2967              :     explicit const_succ_op_iterator(const_value_op_iterator I)
    2968              :         : iterator_adaptor_base(I) {}
    2969              : 
    2970              :     const BasicBlock *operator*() const { return cast<BasicBlock>(*I); }
    2971              :     const BasicBlock *operator->() const { return operator*(); }
    2972              :   };
    2973              : 
    2974              :   static BranchInst *Create(BasicBlock *IfTrue,
    2975              :                             InsertPosition InsertBefore = nullptr) {
    2976              :     return new(1) BranchInst(IfTrue, InsertBefore);
    2977              :   }
    2978              : 
    2979              :   static BranchInst *Create(BasicBlock *IfTrue, BasicBlock *IfFalse,
    2980              :                             Value *Cond,
    2981              :                             InsertPosition InsertBefore = nullptr) {
    2982              :     return new(3) BranchInst(IfTrue, IfFalse, Cond, InsertBefore);
    2983              :   }
    2984              : 
    2985              :   /// Transparently provide more efficient getOperand methods.
    2986              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    2987              : 
    2988              :   bool isUnconditional() const { return getNumOperands() == 1; }
    2989              :   bool isConditional()   const { return getNumOperands() == 3; }
    2990              : 
    2991              :   Value *getCondition() const {
    2992              :     assert(isConditional() && "Cannot get condition of an uncond branch!");
    2993              :     return Op<-3>();
    2994              :   }
    2995              : 
    2996              :   void setCondition(Value *V) {
    2997              :     assert(isConditional() && "Cannot set condition of unconditional branch!");
    2998              :     Op<-3>() = V;
    2999              :   }
    3000              : 
    3001              :   unsigned getNumSuccessors() const { return 1+isConditional(); }
    3002              : 
    3003              :   BasicBlock *getSuccessor(unsigned i) const {
    3004              :     assert(i < getNumSuccessors() && "Successor # out of range for Branch!");
    3005              :     return cast_or_null<BasicBlock>((&Op<-1>() - i)->get());
    3006              :   }
    3007              : 
    3008              :   void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
    3009              :     assert(idx < getNumSuccessors() && "Successor # out of range for Branch!");
    3010              :     *(&Op<-1>() - idx) = NewSucc;
    3011              :   }
    3012              : 
    3013              :   /// Swap the successors of this branch instruction.
    3014              :   ///
    3015              :   /// Swaps the successors of the branch instruction. This also swaps any
    3016              :   /// branch weight metadata associated with the instruction so that it
    3017              :   /// continues to map correctly to each operand.
    3018              :   void swapSuccessors();
    3019              : 
    3020              :   iterator_range<succ_op_iterator> successors() {
    3021              :     return make_range(
    3022              :         succ_op_iterator(std::next(value_op_begin(), isConditional() ? 1 : 0)),
    3023              :         succ_op_iterator(value_op_end()));
    3024              :   }
    3025              : 
    3026              :   iterator_range<const_succ_op_iterator> successors() const {
    3027              :     return make_range(const_succ_op_iterator(
    3028              :                           std::next(value_op_begin(), isConditional() ? 1 : 0)),
    3029              :                       const_succ_op_iterator(value_op_end()));
    3030              :   }
    3031              : 
    3032              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    3033              :   static bool classof(const Instruction *I) {
    3034              :     return (I->getOpcode() == Instruction::Br);
    3035              :   }
    3036              :   static bool classof(const Value *V) {
    3037              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    3038              :   }
    3039              : };
    3040              : 
    3041              : template <>
    3042              : struct OperandTraits<BranchInst> : public VariadicOperandTraits<BranchInst, 1> {
    3043              : };
    3044              : 
    3045              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(BranchInst, Value)
    3046              : 
    3047              : //===----------------------------------------------------------------------===//
    3048              : //                               SwitchInst Class
    3049              : //===----------------------------------------------------------------------===//
    3050              : 
    3051              : //===---------------------------------------------------------------------------
    3052              : /// Multiway switch
    3053              : ///
    3054              : class SwitchInst : public Instruction {
    3055              :   unsigned ReservedSpace;
    3056              : 
    3057              :   // Operand[0]    = Value to switch on
    3058              :   // Operand[1]    = Default basic block destination
    3059              :   // Operand[2n  ] = Value to match
    3060              :   // Operand[2n+1] = BasicBlock to go to on match
    3061              :   SwitchInst(const SwitchInst &SI);
    3062              : 
    3063              :   /// Create a new switch instruction, specifying a value to switch on and a
    3064              :   /// default destination. The number of additional cases can be specified here
    3065              :   /// to make memory allocation more efficient. This constructor can also
    3066              :   /// auto-insert before another instruction.
    3067              :   SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases,
    3068              :              InsertPosition InsertBefore);
    3069              : 
    3070              :   // allocate space for exactly zero operands
    3071              :   void *operator new(size_t S) { return User::operator new(S); }
    3072              : 
    3073              :   void init(Value *Value, BasicBlock *Default, unsigned NumReserved);
    3074              :   void growOperands();
    3075              : 
    3076              : protected:
    3077              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    3078              :   friend class Instruction;
    3079              : 
    3080              :   SwitchInst *cloneImpl() const;
    3081              : 
    3082              : public:
    3083              :   void operator delete(void *Ptr) { User::operator delete(Ptr); }
    3084              : 
    3085              :   // -2
    3086              :   static const unsigned DefaultPseudoIndex = static_cast<unsigned>(~0L-1);
    3087              : 
    3088              :   template <typename CaseHandleT> class CaseIteratorImpl;
    3089              : 
    3090              :   /// A handle to a particular switch case. It exposes a convenient interface
    3091              :   /// to both the case value and the successor block.
    3092              :   ///
    3093              :   /// We define this as a template and instantiate it to form both a const and
    3094              :   /// non-const handle.
    3095              :   template <typename SwitchInstT, typename ConstantIntT, typename BasicBlockT>
    3096              :   class CaseHandleImpl {
    3097              :     // Directly befriend both const and non-const iterators.
    3098              :     friend class SwitchInst::CaseIteratorImpl<
    3099              :         CaseHandleImpl<SwitchInstT, ConstantIntT, BasicBlockT>>;
    3100              : 
    3101              :   protected:
    3102              :     // Expose the switch type we're parameterized with to the iterator.
    3103              :     using SwitchInstType = SwitchInstT;
    3104              : 
    3105              :     SwitchInstT *SI;
    3106              :     ptrdiff_t Index;
    3107              : 
    3108              :     CaseHandleImpl() = default;
    3109              :     CaseHandleImpl(SwitchInstT *SI, ptrdiff_t Index) : SI(SI), Index(Index) {}
    3110              : 
    3111              :   public:
    3112              :     /// Resolves case value for current case.
    3113              :     ConstantIntT *getCaseValue() const {
    3114              :       assert((unsigned)Index < SI->getNumCases() &&
    3115              :              "Index out the number of cases.");
    3116              :       return reinterpret_cast<ConstantIntT *>(SI->getOperand(2 + Index * 2));
    3117              :     }
    3118              : 
    3119              :     /// Resolves successor for current case.
    3120              :     BasicBlockT *getCaseSuccessor() const {
    3121              :       assert(((unsigned)Index < SI->getNumCases() ||
    3122              :               (unsigned)Index == DefaultPseudoIndex) &&
    3123              :              "Index out the number of cases.");
    3124              :       return SI->getSuccessor(getSuccessorIndex());
    3125              :     }
    3126              : 
    3127              :     /// Returns number of current case.
    3128              :     unsigned getCaseIndex() const { return Index; }
    3129              : 
    3130              :     /// Returns successor index for current case successor.
    3131              :     unsigned getSuccessorIndex() const {
    3132              :       assert(((unsigned)Index == DefaultPseudoIndex ||
    3133              :               (unsigned)Index < SI->getNumCases()) &&
    3134              :              "Index out the number of cases.");
    3135              :       return (unsigned)Index != DefaultPseudoIndex ? Index + 1 : 0;
    3136              :     }
    3137              : 
    3138              :     bool operator==(const CaseHandleImpl &RHS) const {
    3139              :       assert(SI == RHS.SI && "Incompatible operators.");
    3140              :       return Index == RHS.Index;
    3141              :     }
    3142              :   };
    3143              : 
    3144              :   using ConstCaseHandle =
    3145              :       CaseHandleImpl<const SwitchInst, const ConstantInt, const BasicBlock>;
    3146              : 
    3147              :   class CaseHandle
    3148              :       : public CaseHandleImpl<SwitchInst, ConstantInt, BasicBlock> {
    3149              :     friend class SwitchInst::CaseIteratorImpl<CaseHandle>;
    3150              : 
    3151              :   public:
    3152              :     CaseHandle(SwitchInst *SI, ptrdiff_t Index) : CaseHandleImpl(SI, Index) {}
    3153              : 
    3154              :     /// Sets the new value for current case.
    3155              :     void setValue(ConstantInt *V) const {
    3156              :       assert((unsigned)Index < SI->getNumCases() &&
    3157              :              "Index out the number of cases.");
    3158              :       SI->setOperand(2 + Index*2, reinterpret_cast<Value*>(V));
    3159              :     }
    3160              : 
    3161              :     /// Sets the new successor for current case.
    3162              :     void setSuccessor(BasicBlock *S) const {
    3163              :       SI->setSuccessor(getSuccessorIndex(), S);
    3164              :     }
    3165              :   };
    3166              : 
    3167              :   template <typename CaseHandleT>
    3168              :   class CaseIteratorImpl
    3169              :       : public iterator_facade_base<CaseIteratorImpl<CaseHandleT>,
    3170              :                                     std::random_access_iterator_tag,
    3171              :                                     const CaseHandleT> {
    3172              :     using SwitchInstT = typename CaseHandleT::SwitchInstType;
    3173              : 
    3174              :     CaseHandleT Case;
    3175              : 
    3176              :   public:
    3177              :     /// Default constructed iterator is in an invalid state until assigned to
    3178              :     /// a case for a particular switch.
    3179              :     CaseIteratorImpl() = default;
    3180              : 
    3181              :     /// Initializes case iterator for given SwitchInst and for given
    3182              :     /// case number.
    3183              :     CaseIteratorImpl(SwitchInstT *SI, unsigned CaseNum) : Case(SI, CaseNum) {}
    3184              : 
    3185              :     /// Initializes case iterator for given SwitchInst and for given
    3186              :     /// successor index.
    3187              :     static CaseIteratorImpl fromSuccessorIndex(SwitchInstT *SI,
    3188              :                                                unsigned SuccessorIndex) {
    3189              :       assert(SuccessorIndex < SI->getNumSuccessors() &&
    3190              :              "Successor index # out of range!");
    3191              :       return SuccessorIndex != 0 ? CaseIteratorImpl(SI, SuccessorIndex - 1)
    3192              :                                  : CaseIteratorImpl(SI, DefaultPseudoIndex);
    3193              :     }
    3194              : 
    3195              :     /// Support converting to the const variant. This will be a no-op for const
    3196              :     /// variant.
    3197              :     operator CaseIteratorImpl<ConstCaseHandle>() const {
    3198              :       return CaseIteratorImpl<ConstCaseHandle>(Case.SI, Case.Index);
    3199              :     }
    3200              : 
    3201              :     CaseIteratorImpl &operator+=(ptrdiff_t N) {
    3202              :       // Check index correctness after addition.
    3203              :       // Note: Index == getNumCases() means end().
    3204              :       assert(Case.Index + N >= 0 &&
    3205              :              (unsigned)(Case.Index + N) <= Case.SI->getNumCases() &&
    3206              :              "Case.Index out the number of cases.");
    3207              :       Case.Index += N;
    3208              :       return *this;
    3209              :     }
    3210              :     CaseIteratorImpl &operator-=(ptrdiff_t N) {
    3211              :       // Check index correctness after subtraction.
    3212              :       // Note: Case.Index == getNumCases() means end().
    3213              :       assert(Case.Index - N >= 0 &&
    3214              :              (unsigned)(Case.Index - N) <= Case.SI->getNumCases() &&
    3215              :              "Case.Index out the number of cases.");
    3216              :       Case.Index -= N;
    3217              :       return *this;
    3218              :     }
    3219              :     ptrdiff_t operator-(const CaseIteratorImpl &RHS) const {
    3220              :       assert(Case.SI == RHS.Case.SI && "Incompatible operators.");
    3221              :       return Case.Index - RHS.Case.Index;
    3222              :     }
    3223              :     bool operator==(const CaseIteratorImpl &RHS) const {
    3224              :       return Case == RHS.Case;
    3225              :     }
    3226              :     bool operator<(const CaseIteratorImpl &RHS) const {
    3227              :       assert(Case.SI == RHS.Case.SI && "Incompatible operators.");
    3228              :       return Case.Index < RHS.Case.Index;
    3229              :     }
    3230              :     const CaseHandleT &operator*() const { return Case; }
    3231              :   };
    3232              : 
    3233              :   using CaseIt = CaseIteratorImpl<CaseHandle>;
    3234              :   using ConstCaseIt = CaseIteratorImpl<ConstCaseHandle>;
    3235              : 
    3236              :   static SwitchInst *Create(Value *Value, BasicBlock *Default,
    3237              :                             unsigned NumCases,
    3238              :                             InsertPosition InsertBefore = nullptr) {
    3239              :     return new SwitchInst(Value, Default, NumCases, InsertBefore);
    3240              :   }
    3241              : 
    3242              :   /// Provide fast operand accessors
    3243              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    3244              : 
    3245              :   // Accessor Methods for Switch stmt
    3246              :   Value *getCondition() const { return getOperand(0); }
    3247              :   void setCondition(Value *V) { setOperand(0, V); }
    3248              : 
    3249              :   BasicBlock *getDefaultDest() const {
    3250              :     return cast<BasicBlock>(getOperand(1));
    3251              :   }
    3252              : 
    3253              :   /// Returns true if the default branch must result in immediate undefined
    3254              :   /// behavior, false otherwise.
    3255              :   bool defaultDestUndefined() const {
    3256              :     return isa<UnreachableInst>(getDefaultDest()->getFirstNonPHIOrDbg());
    3257              :   }
    3258              : 
    3259              :   void setDefaultDest(BasicBlock *DefaultCase) {
    3260              :     setOperand(1, reinterpret_cast<Value*>(DefaultCase));
    3261              :   }
    3262              : 
    3263              :   /// Return the number of 'cases' in this switch instruction, excluding the
    3264              :   /// default case.
    3265              :   unsigned getNumCases() const {
    3266              :     return getNumOperands()/2 - 1;
    3267              :   }
    3268              : 
    3269              :   /// Returns a read/write iterator that points to the first case in the
    3270              :   /// SwitchInst.
    3271              :   CaseIt case_begin() {
    3272              :     return CaseIt(this, 0);
    3273              :   }
    3274              : 
    3275              :   /// Returns a read-only iterator that points to the first case in the
    3276              :   /// SwitchInst.
    3277              :   ConstCaseIt case_begin() const {
    3278              :     return ConstCaseIt(this, 0);
    3279              :   }
    3280              : 
    3281              :   /// Returns a read/write iterator that points one past the last in the
    3282              :   /// SwitchInst.
    3283              :   CaseIt case_end() {
    3284              :     return CaseIt(this, getNumCases());
    3285              :   }
    3286              : 
    3287              :   /// Returns a read-only iterator that points one past the last in the
    3288              :   /// SwitchInst.
    3289              :   ConstCaseIt case_end() const {
    3290              :     return ConstCaseIt(this, getNumCases());
    3291              :   }
    3292              : 
    3293              :   /// Iteration adapter for range-for loops.
    3294              :   iterator_range<CaseIt> cases() {
    3295              :     return make_range(case_begin(), case_end());
    3296              :   }
    3297              : 
    3298              :   /// Constant iteration adapter for range-for loops.
    3299              :   iterator_range<ConstCaseIt> cases() const {
    3300              :     return make_range(case_begin(), case_end());
    3301              :   }
    3302              : 
    3303              :   /// Returns an iterator that points to the default case.
    3304              :   /// Note: this iterator allows to resolve successor only. Attempt
    3305              :   /// to resolve case value causes an assertion.
    3306              :   /// Also note, that increment and decrement also causes an assertion and
    3307              :   /// makes iterator invalid.
    3308              :   CaseIt case_default() {
    3309              :     return CaseIt(this, DefaultPseudoIndex);
    3310              :   }
    3311              :   ConstCaseIt case_default() const {
    3312              :     return ConstCaseIt(this, DefaultPseudoIndex);
    3313              :   }
    3314              : 
    3315              :   /// Search all of the case values for the specified constant. If it is
    3316              :   /// explicitly handled, return the case iterator of it, otherwise return
    3317              :   /// default case iterator to indicate that it is handled by the default
    3318              :   /// handler.
    3319              :   CaseIt findCaseValue(const ConstantInt *C) {
    3320              :     return CaseIt(
    3321              :         this,
    3322              :         const_cast<const SwitchInst *>(this)->findCaseValue(C)->getCaseIndex());
    3323              :   }
    3324              :   ConstCaseIt findCaseValue(const ConstantInt *C) const {
    3325              :     ConstCaseIt I = llvm::find_if(cases(), [C](const ConstCaseHandle &Case) {
    3326              :       return Case.getCaseValue() == C;
    3327              :     });
    3328              :     if (I != case_end())
    3329              :       return I;
    3330              : 
    3331              :     return case_default();
    3332              :   }
    3333              : 
    3334              :   /// Finds the unique case value for a given successor. Returns null if the
    3335              :   /// successor is not found, not unique, or is the default case.
    3336              :   ConstantInt *findCaseDest(BasicBlock *BB) {
    3337              :     if (BB == getDefaultDest())
    3338              :       return nullptr;
    3339              : 
    3340              :     ConstantInt *CI = nullptr;
    3341              :     for (auto Case : cases()) {
    3342              :       if (Case.getCaseSuccessor() != BB)
    3343              :         continue;
    3344              : 
    3345              :       if (CI)
    3346              :         return nullptr; // Multiple cases lead to BB.
    3347              : 
    3348              :       CI = Case.getCaseValue();
    3349              :     }
    3350              : 
    3351              :     return CI;
    3352              :   }
    3353              : 
    3354              :   /// Add an entry to the switch instruction.
    3355              :   /// Note:
    3356              :   /// This action invalidates case_end(). Old case_end() iterator will
    3357              :   /// point to the added case.
    3358              :   void addCase(ConstantInt *OnVal, BasicBlock *Dest);
    3359              : 
    3360              :   /// This method removes the specified case and its successor from the switch
    3361              :   /// instruction. Note that this operation may reorder the remaining cases at
    3362              :   /// index idx and above.
    3363              :   /// Note:
    3364              :   /// This action invalidates iterators for all cases following the one removed,
    3365              :   /// including the case_end() iterator. It returns an iterator for the next
    3366              :   /// case.
    3367              :   CaseIt removeCase(CaseIt I);
    3368              : 
    3369              :   unsigned getNumSuccessors() const { return getNumOperands()/2; }
    3370              :   BasicBlock *getSuccessor(unsigned idx) const {
    3371              :     assert(idx < getNumSuccessors() &&"Successor idx out of range for switch!");
    3372              :     return cast<BasicBlock>(getOperand(idx*2+1));
    3373              :   }
    3374              :   void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
    3375              :     assert(idx < getNumSuccessors() && "Successor # out of range for switch!");
    3376              :     setOperand(idx * 2 + 1, NewSucc);
    3377              :   }
    3378              : 
    3379              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    3380              :   static bool classof(const Instruction *I) {
    3381              :     return I->getOpcode() == Instruction::Switch;
    3382              :   }
    3383              :   static bool classof(const Value *V) {
    3384              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    3385              :   }
    3386              : };
    3387              : 
    3388              : /// A wrapper class to simplify modification of SwitchInst cases along with
    3389              : /// their prof branch_weights metadata.
    3390              : class SwitchInstProfUpdateWrapper {
    3391              :   SwitchInst &SI;
    3392              :   std::optional<SmallVector<uint32_t, 8>> Weights;
    3393              :   bool Changed = false;
    3394              : 
    3395              : protected:
    3396              :   MDNode *buildProfBranchWeightsMD();
    3397              : 
    3398              :   void init();
    3399              : 
    3400              : public:
    3401              :   using CaseWeightOpt = std::optional<uint32_t>;
    3402              :   SwitchInst *operator->() { return &SI; }
    3403              :   SwitchInst &operator*() { return SI; }
    3404              :   operator SwitchInst *() { return &SI; }
    3405              : 
    3406              :   SwitchInstProfUpdateWrapper(SwitchInst &SI) : SI(SI) { init(); }
    3407              : 
    3408              :   ~SwitchInstProfUpdateWrapper() {
    3409              :     if (Changed)
    3410              :       SI.setMetadata(LLVMContext::MD_prof, buildProfBranchWeightsMD());
    3411              :   }
    3412              : 
    3413              :   /// Delegate the call to the underlying SwitchInst::removeCase() and remove
    3414              :   /// correspondent branch weight.
    3415              :   SwitchInst::CaseIt removeCase(SwitchInst::CaseIt I);
    3416              : 
    3417              :   /// Delegate the call to the underlying SwitchInst::addCase() and set the
    3418              :   /// specified branch weight for the added case.
    3419              :   void addCase(ConstantInt *OnVal, BasicBlock *Dest, CaseWeightOpt W);
    3420              : 
    3421              :   /// Delegate the call to the underlying SwitchInst::eraseFromParent() and mark
    3422              :   /// this object to not touch the underlying SwitchInst in destructor.
    3423              :   Instruction::InstListType::iterator eraseFromParent();
    3424              : 
    3425              :   void setSuccessorWeight(unsigned idx, CaseWeightOpt W);
    3426              :   CaseWeightOpt getSuccessorWeight(unsigned idx);
    3427              : 
    3428              :   static CaseWeightOpt getSuccessorWeight(const SwitchInst &SI, unsigned idx);
    3429              : };
    3430              : 
    3431              : template <>
    3432              : struct OperandTraits<SwitchInst> : public HungoffOperandTraits<2> {
    3433              : };
    3434              : 
    3435              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(SwitchInst, Value)
    3436              : 
    3437              : //===----------------------------------------------------------------------===//
    3438              : //                             IndirectBrInst Class
    3439              : //===----------------------------------------------------------------------===//
    3440              : 
    3441              : //===---------------------------------------------------------------------------
    3442              : /// Indirect Branch Instruction.
    3443              : ///
    3444              : class IndirectBrInst : public Instruction {
    3445              :   unsigned ReservedSpace;
    3446              : 
    3447              :   // Operand[0]   = Address to jump to
    3448              :   // Operand[n+1] = n-th destination
    3449              :   IndirectBrInst(const IndirectBrInst &IBI);
    3450              : 
    3451              :   /// Create a new indirectbr instruction, specifying an
    3452              :   /// Address to jump to.  The number of expected destinations can be specified
    3453              :   /// here to make memory allocation more efficient.  This constructor can also
    3454              :   /// autoinsert before another instruction.
    3455              :   IndirectBrInst(Value *Address, unsigned NumDests,
    3456              :                  InsertPosition InsertBefore);
    3457              : 
    3458              :   // allocate space for exactly zero operands
    3459              :   void *operator new(size_t S) { return User::operator new(S); }
    3460              : 
    3461              :   void init(Value *Address, unsigned NumDests);
    3462              :   void growOperands();
    3463              : 
    3464              : protected:
    3465              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    3466              :   friend class Instruction;
    3467              : 
    3468              :   IndirectBrInst *cloneImpl() const;
    3469              : 
    3470              : public:
    3471              :   void operator delete(void *Ptr) { User::operator delete(Ptr); }
    3472              : 
    3473              :   /// Iterator type that casts an operand to a basic block.
    3474              :   ///
    3475              :   /// This only makes sense because the successors are stored as adjacent
    3476              :   /// operands for indirectbr instructions.
    3477              :   struct succ_op_iterator
    3478              :       : iterator_adaptor_base<succ_op_iterator, value_op_iterator,
    3479              :                               std::random_access_iterator_tag, BasicBlock *,
    3480              :                               ptrdiff_t, BasicBlock *, BasicBlock *> {
    3481              :     explicit succ_op_iterator(value_op_iterator I) : iterator_adaptor_base(I) {}
    3482              : 
    3483              :     BasicBlock *operator*() const { return cast<BasicBlock>(*I); }
    3484              :     BasicBlock *operator->() const { return operator*(); }
    3485              :   };
    3486              : 
    3487              :   /// The const version of `succ_op_iterator`.
    3488              :   struct const_succ_op_iterator
    3489              :       : iterator_adaptor_base<const_succ_op_iterator, const_value_op_iterator,
    3490              :                               std::random_access_iterator_tag,
    3491              :                               const BasicBlock *, ptrdiff_t, const BasicBlock *,
    3492              :                               const BasicBlock *> {
    3493              :     explicit const_succ_op_iterator(const_value_op_iterator I)
    3494              :         : iterator_adaptor_base(I) {}
    3495              : 
    3496              :     const BasicBlock *operator*() const { return cast<BasicBlock>(*I); }
    3497              :     const BasicBlock *operator->() const { return operator*(); }
    3498              :   };
    3499              : 
    3500              :   static IndirectBrInst *Create(Value *Address, unsigned NumDests,
    3501              :                                 InsertPosition InsertBefore = nullptr) {
    3502              :     return new IndirectBrInst(Address, NumDests, InsertBefore);
    3503              :   }
    3504              : 
    3505              :   /// Provide fast operand accessors.
    3506              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    3507              : 
    3508              :   // Accessor Methods for IndirectBrInst instruction.
    3509              :   Value *getAddress() { return getOperand(0); }
    3510              :   const Value *getAddress() const { return getOperand(0); }
    3511              :   void setAddress(Value *V) { setOperand(0, V); }
    3512              : 
    3513              :   /// return the number of possible destinations in this
    3514              :   /// indirectbr instruction.
    3515              :   unsigned getNumDestinations() const { return getNumOperands()-1; }
    3516              : 
    3517              :   /// Return the specified destination.
    3518              :   BasicBlock *getDestination(unsigned i) { return getSuccessor(i); }
    3519              :   const BasicBlock *getDestination(unsigned i) const { return getSuccessor(i); }
    3520              : 
    3521              :   /// Add a destination.
    3522              :   ///
    3523              :   void addDestination(BasicBlock *Dest);
    3524              : 
    3525              :   /// This method removes the specified successor from the
    3526              :   /// indirectbr instruction.
    3527              :   void removeDestination(unsigned i);
    3528              : 
    3529              :   unsigned getNumSuccessors() const { return getNumOperands()-1; }
    3530              :   BasicBlock *getSuccessor(unsigned i) const {
    3531              :     return cast<BasicBlock>(getOperand(i+1));
    3532              :   }
    3533              :   void setSuccessor(unsigned i, BasicBlock *NewSucc) {
    3534              :     setOperand(i + 1, NewSucc);
    3535              :   }
    3536              : 
    3537              :   iterator_range<succ_op_iterator> successors() {
    3538              :     return make_range(succ_op_iterator(std::next(value_op_begin())),
    3539              :                       succ_op_iterator(value_op_end()));
    3540              :   }
    3541              : 
    3542              :   iterator_range<const_succ_op_iterator> successors() const {
    3543              :     return make_range(const_succ_op_iterator(std::next(value_op_begin())),
    3544              :                       const_succ_op_iterator(value_op_end()));
    3545              :   }
    3546              : 
    3547              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    3548              :   static bool classof(const Instruction *I) {
    3549              :     return I->getOpcode() == Instruction::IndirectBr;
    3550              :   }
    3551              :   static bool classof(const Value *V) {
    3552              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    3553              :   }
    3554              : };
    3555              : 
    3556              : template <>
    3557              : struct OperandTraits<IndirectBrInst> : public HungoffOperandTraits<1> {
    3558              : };
    3559              : 
    3560              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(IndirectBrInst, Value)
    3561              : 
    3562              : //===----------------------------------------------------------------------===//
    3563              : //                               InvokeInst Class
    3564              : //===----------------------------------------------------------------------===//
    3565              : 
    3566              : /// Invoke instruction.  The SubclassData field is used to hold the
    3567              : /// calling convention of the call.
    3568              : ///
    3569              : class InvokeInst : public CallBase {
    3570              :   /// The number of operands for this call beyond the called function,
    3571              :   /// arguments, and operand bundles.
    3572              :   static constexpr int NumExtraOperands = 2;
    3573              : 
    3574              :   /// The index from the end of the operand array to the normal destination.
    3575              :   static constexpr int NormalDestOpEndIdx = -3;
    3576              : 
    3577              :   /// The index from the end of the operand array to the unwind destination.
    3578              :   static constexpr int UnwindDestOpEndIdx = -2;
    3579              : 
    3580              :   InvokeInst(const InvokeInst &BI);
    3581              : 
    3582              :   /// Construct an InvokeInst given a range of arguments.
    3583              :   ///
    3584              :   /// Construct an InvokeInst from a range of arguments
    3585              :   inline InvokeInst(FunctionType *Ty, Value *Func, BasicBlock *IfNormal,
    3586              :                     BasicBlock *IfException, ArrayRef<Value *> Args,
    3587              :                     ArrayRef<OperandBundleDef> Bundles, int NumOperands,
    3588              :                     const Twine &NameStr, InsertPosition InsertBefore);
    3589              : 
    3590              :   void init(FunctionType *Ty, Value *Func, BasicBlock *IfNormal,
    3591              :             BasicBlock *IfException, ArrayRef<Value *> Args,
    3592              :             ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr);
    3593              : 
    3594              :   /// Compute the number of operands to allocate.
    3595              :   static int ComputeNumOperands(int NumArgs, int NumBundleInputs = 0) {
    3596              :     // We need one operand for the called function, plus our extra operands and
    3597              :     // the input operand counts provided.
    3598              :     return 1 + NumExtraOperands + NumArgs + NumBundleInputs;
    3599              :   }
    3600              : 
    3601              : protected:
    3602              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    3603              :   friend class Instruction;
    3604              : 
    3605              :   InvokeInst *cloneImpl() const;
    3606              : 
    3607              : public:
    3608              :   static InvokeInst *Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal,
    3609              :                             BasicBlock *IfException, ArrayRef<Value *> Args,
    3610              :                             const Twine &NameStr,
    3611              :                             InsertPosition InsertBefore = nullptr) {
    3612              :     int NumOperands = ComputeNumOperands(Args.size());
    3613              :     return new (NumOperands)
    3614              :         InvokeInst(Ty, Func, IfNormal, IfException, Args, std::nullopt,
    3615              :                    NumOperands, NameStr, InsertBefore);
    3616              :   }
    3617              : 
    3618              :   static InvokeInst *Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal,
    3619              :                             BasicBlock *IfException, ArrayRef<Value *> Args,
    3620              :                             ArrayRef<OperandBundleDef> Bundles = std::nullopt,
    3621              :                             const Twine &NameStr = "",
    3622              :                             InsertPosition InsertBefore = nullptr) {
    3623              :     int NumOperands =
    3624              :         ComputeNumOperands(Args.size(), CountBundleInputs(Bundles));
    3625              :     unsigned DescriptorBytes = Bundles.size() * sizeof(BundleOpInfo);
    3626              : 
    3627              :     return new (NumOperands, DescriptorBytes)
    3628              :         InvokeInst(Ty, Func, IfNormal, IfException, Args, Bundles, NumOperands,
    3629              :                    NameStr, InsertBefore);
    3630              :   }
    3631              : 
    3632              :   static InvokeInst *Create(FunctionCallee Func, BasicBlock *IfNormal,
    3633              :                             BasicBlock *IfException, ArrayRef<Value *> Args,
    3634              :                             const Twine &NameStr,
    3635              :                             InsertPosition InsertBefore = nullptr) {
    3636              :     return Create(Func.getFunctionType(), Func.getCallee(), IfNormal,
    3637              :                   IfException, Args, std::nullopt, NameStr, InsertBefore);
    3638              :   }
    3639              : 
    3640              :   static InvokeInst *Create(FunctionCallee Func, BasicBlock *IfNormal,
    3641              :                             BasicBlock *IfException, ArrayRef<Value *> Args,
    3642              :                             ArrayRef<OperandBundleDef> Bundles = std::nullopt,
    3643              :                             const Twine &NameStr = "",
    3644              :                             InsertPosition InsertBefore = nullptr) {
    3645              :     return Create(Func.getFunctionType(), Func.getCallee(), IfNormal,
    3646              :                   IfException, Args, Bundles, NameStr, InsertBefore);
    3647              :   }
    3648              : 
    3649              :   /// Create a clone of \p II with a different set of operand bundles and
    3650              :   /// insert it before \p InsertBefore.
    3651              :   ///
    3652              :   /// The returned invoke instruction is identical to \p II in every way except
    3653              :   /// that the operand bundles for the new instruction are set to the operand
    3654              :   /// bundles in \p Bundles.
    3655              :   static InvokeInst *Create(InvokeInst *II, ArrayRef<OperandBundleDef> Bundles,
    3656              :                             InsertPosition InsertPt = nullptr);
    3657              : 
    3658              :   // get*Dest - Return the destination basic blocks...
    3659              :   BasicBlock *getNormalDest() const {
    3660              :     return cast<BasicBlock>(Op<NormalDestOpEndIdx>());
    3661              :   }
    3662              :   BasicBlock *getUnwindDest() const {
    3663              :     return cast<BasicBlock>(Op<UnwindDestOpEndIdx>());
    3664              :   }
    3665              :   void setNormalDest(BasicBlock *B) {
    3666              :     Op<NormalDestOpEndIdx>() = reinterpret_cast<Value *>(B);
    3667              :   }
    3668              :   void setUnwindDest(BasicBlock *B) {
    3669              :     Op<UnwindDestOpEndIdx>() = reinterpret_cast<Value *>(B);
    3670              :   }
    3671              : 
    3672              :   /// Get the landingpad instruction from the landing pad
    3673              :   /// block (the unwind destination).
    3674              :   LandingPadInst *getLandingPadInst() const;
    3675              : 
    3676              :   BasicBlock *getSuccessor(unsigned i) const {
    3677              :     assert(i < 2 && "Successor # out of range for invoke!");
    3678              :     return i == 0 ? getNormalDest() : getUnwindDest();
    3679              :   }
    3680              : 
    3681              :   void setSuccessor(unsigned i, BasicBlock *NewSucc) {
    3682              :     assert(i < 2 && "Successor # out of range for invoke!");
    3683              :     if (i == 0)
    3684              :       setNormalDest(NewSucc);
    3685              :     else
    3686              :       setUnwindDest(NewSucc);
    3687              :   }
    3688              : 
    3689              :   unsigned getNumSuccessors() const { return 2; }
    3690              : 
    3691              :   /// Updates profile metadata by scaling it by \p S / \p T.
    3692              :   void updateProfWeight(uint64_t S, uint64_t T);
    3693              : 
    3694              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    3695              :   static bool classof(const Instruction *I) {
    3696              :     return (I->getOpcode() == Instruction::Invoke);
    3697              :   }
    3698              :   static bool classof(const Value *V) {
    3699              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    3700              :   }
    3701              : 
    3702              : private:
    3703              :   // Shadow Instruction::setInstructionSubclassData with a private forwarding
    3704              :   // method so that subclasses cannot accidentally use it.
    3705              :   template <typename Bitfield>
    3706              :   void setSubclassData(typename Bitfield::Type Value) {
    3707              :     Instruction::setSubclassData<Bitfield>(Value);
    3708              :   }
    3709              : };
    3710              : 
    3711              : InvokeInst::InvokeInst(FunctionType *Ty, Value *Func, BasicBlock *IfNormal,
    3712              :                        BasicBlock *IfException, ArrayRef<Value *> Args,
    3713              :                        ArrayRef<OperandBundleDef> Bundles, int NumOperands,
    3714              :                        const Twine &NameStr, InsertPosition InsertBefore)
    3715              :     : CallBase(Ty->getReturnType(), Instruction::Invoke,
    3716              :                OperandTraits<CallBase>::op_end(this) - NumOperands, NumOperands,
    3717              :                InsertBefore) {
    3718              :   init(Ty, Func, IfNormal, IfException, Args, Bundles, NameStr);
    3719              : }
    3720              : 
    3721              : //===----------------------------------------------------------------------===//
    3722              : //                              CallBrInst Class
    3723              : //===----------------------------------------------------------------------===//
    3724              : 
    3725              : /// CallBr instruction, tracking function calls that may not return control but
    3726              : /// instead transfer it to a third location. The SubclassData field is used to
    3727              : /// hold the calling convention of the call.
    3728              : ///
    3729              : class CallBrInst : public CallBase {
    3730              : 
    3731              :   unsigned NumIndirectDests;
    3732              : 
    3733              :   CallBrInst(const CallBrInst &BI);
    3734              : 
    3735              :   /// Construct a CallBrInst given a range of arguments.
    3736              :   ///
    3737              :   /// Construct a CallBrInst from a range of arguments
    3738              :   inline CallBrInst(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest,
    3739              :                     ArrayRef<BasicBlock *> IndirectDests,
    3740              :                     ArrayRef<Value *> Args, ArrayRef<OperandBundleDef> Bundles,
    3741              :                     int NumOperands, const Twine &NameStr,
    3742              :                     InsertPosition InsertBefore);
    3743              : 
    3744              :   void init(FunctionType *FTy, Value *Func, BasicBlock *DefaultDest,
    3745              :             ArrayRef<BasicBlock *> IndirectDests, ArrayRef<Value *> Args,
    3746              :             ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr);
    3747              : 
    3748              :   /// Compute the number of operands to allocate.
    3749              :   static int ComputeNumOperands(int NumArgs, int NumIndirectDests,
    3750              :                                 int NumBundleInputs = 0) {
    3751              :     // We need one operand for the called function, plus our extra operands and
    3752              :     // the input operand counts provided.
    3753              :     return 2 + NumIndirectDests + NumArgs + NumBundleInputs;
    3754              :   }
    3755              : 
    3756              : protected:
    3757              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    3758              :   friend class Instruction;
    3759              : 
    3760              :   CallBrInst *cloneImpl() const;
    3761              : 
    3762              : public:
    3763              :   static CallBrInst *Create(FunctionType *Ty, Value *Func,
    3764              :                             BasicBlock *DefaultDest,
    3765              :                             ArrayRef<BasicBlock *> IndirectDests,
    3766              :                             ArrayRef<Value *> Args, const Twine &NameStr,
    3767              :                             InsertPosition InsertBefore = nullptr) {
    3768              :     int NumOperands = ComputeNumOperands(Args.size(), IndirectDests.size());
    3769              :     return new (NumOperands)
    3770              :         CallBrInst(Ty, Func, DefaultDest, IndirectDests, Args, std::nullopt,
    3771              :                    NumOperands, NameStr, InsertBefore);
    3772              :   }
    3773              : 
    3774              :   static CallBrInst *
    3775              :   Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest,
    3776              :          ArrayRef<BasicBlock *> IndirectDests, ArrayRef<Value *> Args,
    3777              :          ArrayRef<OperandBundleDef> Bundles = std::nullopt,
    3778              :          const Twine &NameStr = "", InsertPosition InsertBefore = nullptr) {
    3779              :     int NumOperands = ComputeNumOperands(Args.size(), IndirectDests.size(),
    3780              :                                          CountBundleInputs(Bundles));
    3781              :     unsigned DescriptorBytes = Bundles.size() * sizeof(BundleOpInfo);
    3782              : 
    3783              :     return new (NumOperands, DescriptorBytes)
    3784              :         CallBrInst(Ty, Func, DefaultDest, IndirectDests, Args, Bundles,
    3785              :                    NumOperands, NameStr, InsertBefore);
    3786              :   }
    3787              : 
    3788              :   static CallBrInst *Create(FunctionCallee Func, BasicBlock *DefaultDest,
    3789              :                             ArrayRef<BasicBlock *> IndirectDests,
    3790              :                             ArrayRef<Value *> Args, const Twine &NameStr,
    3791              :                             InsertPosition InsertBefore = nullptr) {
    3792              :     return Create(Func.getFunctionType(), Func.getCallee(), DefaultDest,
    3793              :                   IndirectDests, Args, NameStr, InsertBefore);
    3794              :   }
    3795              : 
    3796              :   static CallBrInst *Create(FunctionCallee Func, BasicBlock *DefaultDest,
    3797              :                             ArrayRef<BasicBlock *> IndirectDests,
    3798              :                             ArrayRef<Value *> Args,
    3799              :                             ArrayRef<OperandBundleDef> Bundles = std::nullopt,
    3800              :                             const Twine &NameStr = "",
    3801              :                             InsertPosition InsertBefore = nullptr) {
    3802              :     return Create(Func.getFunctionType(), Func.getCallee(), DefaultDest,
    3803              :                   IndirectDests, Args, Bundles, NameStr, InsertBefore);
    3804              :   }
    3805              : 
    3806              :   /// Create a clone of \p CBI with a different set of operand bundles and
    3807              :   /// insert it before \p InsertBefore.
    3808              :   ///
    3809              :   /// The returned callbr instruction is identical to \p CBI in every way
    3810              :   /// except that the operand bundles for the new instruction are set to the
    3811              :   /// operand bundles in \p Bundles.
    3812              :   static CallBrInst *Create(CallBrInst *CBI, ArrayRef<OperandBundleDef> Bundles,
    3813              :                             InsertPosition InsertBefore = nullptr);
    3814              : 
    3815              :   /// Return the number of callbr indirect dest labels.
    3816              :   ///
    3817              :   unsigned getNumIndirectDests() const { return NumIndirectDests; }
    3818              : 
    3819              :   /// getIndirectDestLabel - Return the i-th indirect dest label.
    3820              :   ///
    3821              :   Value *getIndirectDestLabel(unsigned i) const {
    3822              :     assert(i < getNumIndirectDests() && "Out of bounds!");
    3823              :     return getOperand(i + arg_size() + getNumTotalBundleOperands() + 1);
    3824              :   }
    3825              : 
    3826              :   Value *getIndirectDestLabelUse(unsigned i) const {
    3827              :     assert(i < getNumIndirectDests() && "Out of bounds!");
    3828              :     return getOperandUse(i + arg_size() + getNumTotalBundleOperands() + 1);
    3829              :   }
    3830              : 
    3831              :   // Return the destination basic blocks...
    3832              :   BasicBlock *getDefaultDest() const {
    3833              :     return cast<BasicBlock>(*(&Op<-1>() - getNumIndirectDests() - 1));
    3834              :   }
    3835              :   BasicBlock *getIndirectDest(unsigned i) const {
    3836              :     return cast_or_null<BasicBlock>(*(&Op<-1>() - getNumIndirectDests() + i));
    3837              :   }
    3838              :   SmallVector<BasicBlock *, 16> getIndirectDests() const {
    3839              :     SmallVector<BasicBlock *, 16> IndirectDests;
    3840              :     for (unsigned i = 0, e = getNumIndirectDests(); i < e; ++i)
    3841              :       IndirectDests.push_back(getIndirectDest(i));
    3842              :     return IndirectDests;
    3843              :   }
    3844              :   void setDefaultDest(BasicBlock *B) {
    3845              :     *(&Op<-1>() - getNumIndirectDests() - 1) = reinterpret_cast<Value *>(B);
    3846              :   }
    3847              :   void setIndirectDest(unsigned i, BasicBlock *B) {
    3848              :     *(&Op<-1>() - getNumIndirectDests() + i) = reinterpret_cast<Value *>(B);
    3849              :   }
    3850              : 
    3851              :   BasicBlock *getSuccessor(unsigned i) const {
    3852              :     assert(i < getNumSuccessors() + 1 &&
    3853              :            "Successor # out of range for callbr!");
    3854              :     return i == 0 ? getDefaultDest() : getIndirectDest(i - 1);
    3855              :   }
    3856              : 
    3857              :   void setSuccessor(unsigned i, BasicBlock *NewSucc) {
    3858              :     assert(i < getNumIndirectDests() + 1 &&
    3859              :            "Successor # out of range for callbr!");
    3860              :     return i == 0 ? setDefaultDest(NewSucc) : setIndirectDest(i - 1, NewSucc);
    3861              :   }
    3862              : 
    3863              :   unsigned getNumSuccessors() const { return getNumIndirectDests() + 1; }
    3864              : 
    3865              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    3866              :   static bool classof(const Instruction *I) {
    3867              :     return (I->getOpcode() == Instruction::CallBr);
    3868              :   }
    3869              :   static bool classof(const Value *V) {
    3870              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    3871              :   }
    3872              : 
    3873              : private:
    3874              :   // Shadow Instruction::setInstructionSubclassData with a private forwarding
    3875              :   // method so that subclasses cannot accidentally use it.
    3876              :   template <typename Bitfield>
    3877              :   void setSubclassData(typename Bitfield::Type Value) {
    3878              :     Instruction::setSubclassData<Bitfield>(Value);
    3879              :   }
    3880              : };
    3881              : 
    3882              : CallBrInst::CallBrInst(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest,
    3883              :                        ArrayRef<BasicBlock *> IndirectDests,
    3884              :                        ArrayRef<Value *> Args,
    3885              :                        ArrayRef<OperandBundleDef> Bundles, int NumOperands,
    3886              :                        const Twine &NameStr, InsertPosition InsertBefore)
    3887              :     : CallBase(Ty->getReturnType(), Instruction::CallBr,
    3888              :                OperandTraits<CallBase>::op_end(this) - NumOperands, NumOperands,
    3889              :                InsertBefore) {
    3890              :   init(Ty, Func, DefaultDest, IndirectDests, Args, Bundles, NameStr);
    3891              : }
    3892              : 
    3893              : //===----------------------------------------------------------------------===//
    3894              : //                              ResumeInst Class
    3895              : //===----------------------------------------------------------------------===//
    3896              : 
    3897              : //===---------------------------------------------------------------------------
    3898              : /// Resume the propagation of an exception.
    3899              : ///
    3900              : class ResumeInst : public Instruction {
    3901              :   ResumeInst(const ResumeInst &RI);
    3902              : 
    3903              :   explicit ResumeInst(Value *Exn, InsertPosition InsertBefore = nullptr);
    3904              : 
    3905              : protected:
    3906              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    3907              :   friend class Instruction;
    3908              : 
    3909              :   ResumeInst *cloneImpl() const;
    3910              : 
    3911              : public:
    3912              :   static ResumeInst *Create(Value *Exn, InsertPosition InsertBefore = nullptr) {
    3913              :     return new(1) ResumeInst(Exn, InsertBefore);
    3914              :   }
    3915              : 
    3916              :   /// Provide fast operand accessors
    3917              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    3918              : 
    3919              :   /// Convenience accessor.
    3920              :   Value *getValue() const { return Op<0>(); }
    3921              : 
    3922              :   unsigned getNumSuccessors() const { return 0; }
    3923              : 
    3924              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    3925              :   static bool classof(const Instruction *I) {
    3926              :     return I->getOpcode() == Instruction::Resume;
    3927              :   }
    3928              :   static bool classof(const Value *V) {
    3929              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    3930              :   }
    3931              : 
    3932              : private:
    3933              :   BasicBlock *getSuccessor(unsigned idx) const {
    3934              :     llvm_unreachable("ResumeInst has no successors!");
    3935              :   }
    3936              : 
    3937              :   void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
    3938              :     llvm_unreachable("ResumeInst has no successors!");
    3939              :   }
    3940              : };
    3941              : 
    3942              : template <>
    3943              : struct OperandTraits<ResumeInst> :
    3944              :     public FixedNumOperandTraits<ResumeInst, 1> {
    3945              : };
    3946              : 
    3947              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ResumeInst, Value)
    3948              : 
    3949              : //===----------------------------------------------------------------------===//
    3950              : //                         CatchSwitchInst Class
    3951              : //===----------------------------------------------------------------------===//
    3952              : class CatchSwitchInst : public Instruction {
    3953              :   using UnwindDestField = BoolBitfieldElementT<0>;
    3954              : 
    3955              :   /// The number of operands actually allocated.  NumOperands is
    3956              :   /// the number actually in use.
    3957              :   unsigned ReservedSpace;
    3958              : 
    3959              :   // Operand[0] = Outer scope
    3960              :   // Operand[1] = Unwind block destination
    3961              :   // Operand[n] = BasicBlock to go to on match
    3962              :   CatchSwitchInst(const CatchSwitchInst &CSI);
    3963              : 
    3964              :   /// Create a new switch instruction, specifying a
    3965              :   /// default destination.  The number of additional handlers can be specified
    3966              :   /// here to make memory allocation more efficient.
    3967              :   /// This constructor can also autoinsert before another instruction.
    3968              :   CatchSwitchInst(Value *ParentPad, BasicBlock *UnwindDest,
    3969              :                   unsigned NumHandlers, const Twine &NameStr,
    3970              :                   InsertPosition InsertBefore);
    3971              : 
    3972              :   // allocate space for exactly zero operands
    3973              :   void *operator new(size_t S) { return User::operator new(S); }
    3974              : 
    3975              :   void init(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumReserved);
    3976              :   void growOperands(unsigned Size);
    3977              : 
    3978              : protected:
    3979              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    3980              :   friend class Instruction;
    3981              : 
    3982              :   CatchSwitchInst *cloneImpl() const;
    3983              : 
    3984              : public:
    3985              :   void operator delete(void *Ptr) { return User::operator delete(Ptr); }
    3986              : 
    3987              :   static CatchSwitchInst *Create(Value *ParentPad, BasicBlock *UnwindDest,
    3988              :                                  unsigned NumHandlers,
    3989              :                                  const Twine &NameStr = "",
    3990              :                                  InsertPosition InsertBefore = nullptr) {
    3991              :     return new CatchSwitchInst(ParentPad, UnwindDest, NumHandlers, NameStr,
    3992              :                                InsertBefore);
    3993              :   }
    3994              : 
    3995              :   /// Provide fast operand accessors
    3996              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    3997              : 
    3998              :   // Accessor Methods for CatchSwitch stmt
    3999              :   Value *getParentPad() const { return getOperand(0); }
    4000              :   void setParentPad(Value *ParentPad) { setOperand(0, ParentPad); }
    4001              : 
    4002              :   // Accessor Methods for CatchSwitch stmt
    4003              :   bool hasUnwindDest() const { return getSubclassData<UnwindDestField>(); }
    4004              :   bool unwindsToCaller() const { return !hasUnwindDest(); }
    4005              :   BasicBlock *getUnwindDest() const {
    4006              :     if (hasUnwindDest())
    4007              :       return cast<BasicBlock>(getOperand(1));
    4008              :     return nullptr;
    4009              :   }
    4010              :   void setUnwindDest(BasicBlock *UnwindDest) {
    4011              :     assert(UnwindDest);
    4012              :     assert(hasUnwindDest());
    4013              :     setOperand(1, UnwindDest);
    4014              :   }
    4015              : 
    4016              :   /// return the number of 'handlers' in this catchswitch
    4017              :   /// instruction, except the default handler
    4018              :   unsigned getNumHandlers() const {
    4019              :     if (hasUnwindDest())
    4020              :       return getNumOperands() - 2;
    4021              :     return getNumOperands() - 1;
    4022              :   }
    4023              : 
    4024              : private:
    4025              :   static BasicBlock *handler_helper(Value *V) { return cast<BasicBlock>(V); }
    4026              :   static const BasicBlock *handler_helper(const Value *V) {
    4027              :     return cast<BasicBlock>(V);
    4028              :   }
    4029              : 
    4030              : public:
    4031              :   using DerefFnTy = BasicBlock *(*)(Value *);
    4032              :   using handler_iterator = mapped_iterator<op_iterator, DerefFnTy>;
    4033              :   using handler_range = iterator_range<handler_iterator>;
    4034              :   using ConstDerefFnTy = const BasicBlock *(*)(const Value *);
    4035              :   using const_handler_iterator =
    4036              :       mapped_iterator<const_op_iterator, ConstDerefFnTy>;
    4037              :   using const_handler_range = iterator_range<const_handler_iterator>;
    4038              : 
    4039              :   /// Returns an iterator that points to the first handler in CatchSwitchInst.
    4040              :   handler_iterator handler_begin() {
    4041              :     op_iterator It = op_begin() + 1;
    4042              :     if (hasUnwindDest())
    4043              :       ++It;
    4044              :     return handler_iterator(It, DerefFnTy(handler_helper));
    4045              :   }
    4046              : 
    4047              :   /// Returns an iterator that points to the first handler in the
    4048              :   /// CatchSwitchInst.
    4049              :   const_handler_iterator handler_begin() const {
    4050              :     const_op_iterator It = op_begin() + 1;
    4051              :     if (hasUnwindDest())
    4052              :       ++It;
    4053              :     return const_handler_iterator(It, ConstDerefFnTy(handler_helper));
    4054              :   }
    4055              : 
    4056              :   /// Returns a read-only iterator that points one past the last
    4057              :   /// handler in the CatchSwitchInst.
    4058              :   handler_iterator handler_end() {
    4059              :     return handler_iterator(op_end(), DerefFnTy(handler_helper));
    4060              :   }
    4061              : 
    4062              :   /// Returns an iterator that points one past the last handler in the
    4063              :   /// CatchSwitchInst.
    4064              :   const_handler_iterator handler_end() const {
    4065              :     return const_handler_iterator(op_end(), ConstDerefFnTy(handler_helper));
    4066              :   }
    4067              : 
    4068              :   /// iteration adapter for range-for loops.
    4069              :   handler_range handlers() {
    4070              :     return make_range(handler_begin(), handler_end());
    4071              :   }
    4072              : 
    4073              :   /// iteration adapter for range-for loops.
    4074              :   const_handler_range handlers() const {
    4075              :     return make_range(handler_begin(), handler_end());
    4076              :   }
    4077              : 
    4078              :   /// Add an entry to the switch instruction...
    4079              :   /// Note:
    4080              :   /// This action invalidates handler_end(). Old handler_end() iterator will
    4081              :   /// point to the added handler.
    4082              :   void addHandler(BasicBlock *Dest);
    4083              : 
    4084              :   void removeHandler(handler_iterator HI);
    4085              : 
    4086              :   unsigned getNumSuccessors() const { return getNumOperands() - 1; }
    4087              :   BasicBlock *getSuccessor(unsigned Idx) const {
    4088              :     assert(Idx < getNumSuccessors() &&
    4089              :            "Successor # out of range for catchswitch!");
    4090              :     return cast<BasicBlock>(getOperand(Idx + 1));
    4091              :   }
    4092              :   void setSuccessor(unsigned Idx, BasicBlock *NewSucc) {
    4093              :     assert(Idx < getNumSuccessors() &&
    4094              :            "Successor # out of range for catchswitch!");
    4095              :     setOperand(Idx + 1, NewSucc);
    4096              :   }
    4097              : 
    4098              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    4099              :   static bool classof(const Instruction *I) {
    4100              :     return I->getOpcode() == Instruction::CatchSwitch;
    4101              :   }
    4102              :   static bool classof(const Value *V) {
    4103              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4104              :   }
    4105              : };
    4106              : 
    4107              : template <>
    4108              : struct OperandTraits<CatchSwitchInst> : public HungoffOperandTraits<2> {};
    4109              : 
    4110              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CatchSwitchInst, Value)
    4111              : 
    4112              : //===----------------------------------------------------------------------===//
    4113              : //                               CleanupPadInst Class
    4114              : //===----------------------------------------------------------------------===//
    4115              : class CleanupPadInst : public FuncletPadInst {
    4116              : private:
    4117              :   explicit CleanupPadInst(Value *ParentPad, ArrayRef<Value *> Args,
    4118              :                           unsigned Values, const Twine &NameStr,
    4119              :                           InsertPosition InsertBefore)
    4120              :       : FuncletPadInst(Instruction::CleanupPad, ParentPad, Args, Values,
    4121              :                        NameStr, InsertBefore) {}
    4122              : 
    4123              : public:
    4124              :   static CleanupPadInst *Create(Value *ParentPad,
    4125              :                                 ArrayRef<Value *> Args = std::nullopt,
    4126              :                                 const Twine &NameStr = "",
    4127              :                                 InsertPosition InsertBefore = nullptr) {
    4128              :     unsigned Values = 1 + Args.size();
    4129              :     return new (Values)
    4130              :         CleanupPadInst(ParentPad, Args, Values, NameStr, InsertBefore);
    4131              :   }
    4132              : 
    4133              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    4134              :   static bool classof(const Instruction *I) {
    4135              :     return I->getOpcode() == Instruction::CleanupPad;
    4136              :   }
    4137              :   static bool classof(const Value *V) {
    4138              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4139              :   }
    4140              : };
    4141              : 
    4142              : //===----------------------------------------------------------------------===//
    4143              : //                               CatchPadInst Class
    4144              : //===----------------------------------------------------------------------===//
    4145              : class CatchPadInst : public FuncletPadInst {
    4146              : private:
    4147              :   explicit CatchPadInst(Value *CatchSwitch, ArrayRef<Value *> Args,
    4148              :                         unsigned Values, const Twine &NameStr,
    4149              :                         InsertPosition InsertBefore)
    4150              :       : FuncletPadInst(Instruction::CatchPad, CatchSwitch, Args, Values,
    4151              :                        NameStr, InsertBefore) {}
    4152              : 
    4153              : public:
    4154              :   static CatchPadInst *Create(Value *CatchSwitch, ArrayRef<Value *> Args,
    4155              :                               const Twine &NameStr = "",
    4156              :                               InsertPosition InsertBefore = nullptr) {
    4157              :     unsigned Values = 1 + Args.size();
    4158              :     return new (Values)
    4159              :         CatchPadInst(CatchSwitch, Args, Values, NameStr, InsertBefore);
    4160              :   }
    4161              : 
    4162              :   /// Convenience accessors
    4163              :   CatchSwitchInst *getCatchSwitch() const {
    4164              :     return cast<CatchSwitchInst>(Op<-1>());
    4165              :   }
    4166              :   void setCatchSwitch(Value *CatchSwitch) {
    4167              :     assert(CatchSwitch);
    4168              :     Op<-1>() = CatchSwitch;
    4169              :   }
    4170              : 
    4171              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    4172              :   static bool classof(const Instruction *I) {
    4173              :     return I->getOpcode() == Instruction::CatchPad;
    4174              :   }
    4175              :   static bool classof(const Value *V) {
    4176              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4177              :   }
    4178              : };
    4179              : 
    4180              : //===----------------------------------------------------------------------===//
    4181              : //                               CatchReturnInst Class
    4182              : //===----------------------------------------------------------------------===//
    4183              : 
    4184              : class CatchReturnInst : public Instruction {
    4185              :   CatchReturnInst(const CatchReturnInst &RI);
    4186              :   CatchReturnInst(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore);
    4187              : 
    4188              :   void init(Value *CatchPad, BasicBlock *BB);
    4189              : 
    4190              : protected:
    4191              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4192              :   friend class Instruction;
    4193              : 
    4194              :   CatchReturnInst *cloneImpl() const;
    4195              : 
    4196              : public:
    4197              :   static CatchReturnInst *Create(Value *CatchPad, BasicBlock *BB,
    4198              :                                  InsertPosition InsertBefore = nullptr) {
    4199              :     assert(CatchPad);
    4200              :     assert(BB);
    4201              :     return new (2) CatchReturnInst(CatchPad, BB, InsertBefore);
    4202              :   }
    4203              : 
    4204              :   /// Provide fast operand accessors
    4205              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    4206              : 
    4207              :   /// Convenience accessors.
    4208              :   CatchPadInst *getCatchPad() const { return cast<CatchPadInst>(Op<0>()); }
    4209              :   void setCatchPad(CatchPadInst *CatchPad) {
    4210              :     assert(CatchPad);
    4211              :     Op<0>() = CatchPad;
    4212              :   }
    4213              : 
    4214              :   BasicBlock *getSuccessor() const { return cast<BasicBlock>(Op<1>()); }
    4215              :   void setSuccessor(BasicBlock *NewSucc) {
    4216              :     assert(NewSucc);
    4217              :     Op<1>() = NewSucc;
    4218              :   }
    4219              :   unsigned getNumSuccessors() const { return 1; }
    4220              : 
    4221              :   /// Get the parentPad of this catchret's catchpad's catchswitch.
    4222              :   /// The successor block is implicitly a member of this funclet.
    4223              :   Value *getCatchSwitchParentPad() const {
    4224              :     return getCatchPad()->getCatchSwitch()->getParentPad();
    4225              :   }
    4226              : 
    4227              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    4228              :   static bool classof(const Instruction *I) {
    4229              :     return (I->getOpcode() == Instruction::CatchRet);
    4230              :   }
    4231              :   static bool classof(const Value *V) {
    4232              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4233              :   }
    4234              : 
    4235              : private:
    4236              :   BasicBlock *getSuccessor(unsigned Idx) const {
    4237              :     assert(Idx < getNumSuccessors() && "Successor # out of range for catchret!");
    4238              :     return getSuccessor();
    4239              :   }
    4240              : 
    4241              :   void setSuccessor(unsigned Idx, BasicBlock *B) {
    4242              :     assert(Idx < getNumSuccessors() && "Successor # out of range for catchret!");
    4243              :     setSuccessor(B);
    4244              :   }
    4245              : };
    4246              : 
    4247              : template <>
    4248              : struct OperandTraits<CatchReturnInst>
    4249              :     : public FixedNumOperandTraits<CatchReturnInst, 2> {};
    4250              : 
    4251              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CatchReturnInst, Value)
    4252              : 
    4253              : //===----------------------------------------------------------------------===//
    4254              : //                               CleanupReturnInst Class
    4255              : //===----------------------------------------------------------------------===//
    4256              : 
    4257              : class CleanupReturnInst : public Instruction {
    4258              :   using UnwindDestField = BoolBitfieldElementT<0>;
    4259              : 
    4260              : private:
    4261              :   CleanupReturnInst(const CleanupReturnInst &RI);
    4262              :   CleanupReturnInst(Value *CleanupPad, BasicBlock *UnwindBB, unsigned Values,
    4263              :                     InsertPosition InsertBefore = nullptr);
    4264              : 
    4265              :   void init(Value *CleanupPad, BasicBlock *UnwindBB);
    4266              : 
    4267              : protected:
    4268              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4269              :   friend class Instruction;
    4270              : 
    4271              :   CleanupReturnInst *cloneImpl() const;
    4272              : 
    4273              : public:
    4274              :   static CleanupReturnInst *Create(Value *CleanupPad,
    4275              :                                    BasicBlock *UnwindBB = nullptr,
    4276              :                                    InsertPosition InsertBefore = nullptr) {
    4277              :     assert(CleanupPad);
    4278              :     unsigned Values = 1;
    4279              :     if (UnwindBB)
    4280              :       ++Values;
    4281              :     return new (Values)
    4282              :         CleanupReturnInst(CleanupPad, UnwindBB, Values, InsertBefore);
    4283              :   }
    4284              : 
    4285              :   /// Provide fast operand accessors
    4286              :   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
    4287              : 
    4288              :   bool hasUnwindDest() const { return getSubclassData<UnwindDestField>(); }
    4289              :   bool unwindsToCaller() const { return !hasUnwindDest(); }
    4290              : 
    4291              :   /// Convenience accessor.
    4292              :   CleanupPadInst *getCleanupPad() const {
    4293              :     return cast<CleanupPadInst>(Op<0>());
    4294              :   }
    4295              :   void setCleanupPad(CleanupPadInst *CleanupPad) {
    4296              :     assert(CleanupPad);
    4297              :     Op<0>() = CleanupPad;
    4298              :   }
    4299              : 
    4300              :   unsigned getNumSuccessors() const { return hasUnwindDest() ? 1 : 0; }
    4301              : 
    4302              :   BasicBlock *getUnwindDest() const {
    4303              :     return hasUnwindDest() ? cast<BasicBlock>(Op<1>()) : nullptr;
    4304              :   }
    4305              :   void setUnwindDest(BasicBlock *NewDest) {
    4306              :     assert(NewDest);
    4307              :     assert(hasUnwindDest());
    4308              :     Op<1>() = NewDest;
    4309              :   }
    4310              : 
    4311              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    4312              :   static bool classof(const Instruction *I) {
    4313              :     return (I->getOpcode() == Instruction::CleanupRet);
    4314              :   }
    4315              :   static bool classof(const Value *V) {
    4316              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4317              :   }
    4318              : 
    4319              : private:
    4320              :   BasicBlock *getSuccessor(unsigned Idx) const {
    4321              :     assert(Idx == 0);
    4322              :     return getUnwindDest();
    4323              :   }
    4324              : 
    4325              :   void setSuccessor(unsigned Idx, BasicBlock *B) {
    4326              :     assert(Idx == 0);
    4327              :     setUnwindDest(B);
    4328              :   }
    4329              : 
    4330              :   // Shadow Instruction::setInstructionSubclassData with a private forwarding
    4331              :   // method so that subclasses cannot accidentally use it.
    4332              :   template <typename Bitfield>
    4333              :   void setSubclassData(typename Bitfield::Type Value) {
    4334              :     Instruction::setSubclassData<Bitfield>(Value);
    4335              :   }
    4336              : };
    4337              : 
    4338              : template <>
    4339              : struct OperandTraits<CleanupReturnInst>
    4340              :     : public VariadicOperandTraits<CleanupReturnInst, /*MINARITY=*/1> {};
    4341              : 
    4342              : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CleanupReturnInst, Value)
    4343              : 
    4344              : //===----------------------------------------------------------------------===//
    4345              : //                           UnreachableInst Class
    4346              : //===----------------------------------------------------------------------===//
    4347              : 
    4348              : //===---------------------------------------------------------------------------
    4349              : /// This function has undefined behavior.  In particular, the
    4350              : /// presence of this instruction indicates some higher level knowledge that the
    4351              : /// end of the block cannot be reached.
    4352              : ///
    4353              : class UnreachableInst : public Instruction {
    4354              : protected:
    4355              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4356              :   friend class Instruction;
    4357              : 
    4358              :   UnreachableInst *cloneImpl() const;
    4359              : 
    4360              : public:
    4361              :   explicit UnreachableInst(LLVMContext &C,
    4362              :                            InsertPosition InsertBefore = nullptr);
    4363              : 
    4364              :   // allocate space for exactly zero operands
    4365              :   void *operator new(size_t S) { return User::operator new(S, 0); }
    4366              :   void operator delete(void *Ptr) { User::operator delete(Ptr); }
    4367              : 
    4368              :   unsigned getNumSuccessors() const { return 0; }
    4369              : 
    4370              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    4371              :   static bool classof(const Instruction *I) {
    4372              :     return I->getOpcode() == Instruction::Unreachable;
    4373              :   }
    4374              :   static bool classof(const Value *V) {
    4375              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4376              :   }
    4377              : 
    4378              : private:
    4379              :   BasicBlock *getSuccessor(unsigned idx) const {
    4380              :     llvm_unreachable("UnreachableInst has no successors!");
    4381              :   }
    4382              : 
    4383              :   void setSuccessor(unsigned idx, BasicBlock *B) {
    4384              :     llvm_unreachable("UnreachableInst has no successors!");
    4385              :   }
    4386              : };
    4387              : 
    4388              : //===----------------------------------------------------------------------===//
    4389              : //                                 TruncInst Class
    4390              : //===----------------------------------------------------------------------===//
    4391              : 
    4392              : /// This class represents a truncation of integer types.
    4393              : class TruncInst : public CastInst {
    4394              : protected:
    4395              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4396              :   friend class Instruction;
    4397              : 
    4398              :   /// Clone an identical TruncInst
    4399              :   TruncInst *cloneImpl() const;
    4400              : 
    4401              : public:
    4402              :   enum { AnyWrap = 0, NoUnsignedWrap = (1 << 0), NoSignedWrap = (1 << 1) };
    4403              : 
    4404              :   /// Constructor with insert-before-instruction semantics
    4405              :   TruncInst(Value *S,                  ///< The value to be truncated
    4406              :             Type *Ty,                  ///< The (smaller) type to truncate to
    4407              :             const Twine &NameStr = "", ///< A name for the new instruction
    4408              :             InsertPosition InsertBefore =
    4409              :                 nullptr ///< Where to insert the new instruction
    4410              :   );
    4411              : 
    4412              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    4413              :   static bool classof(const Instruction *I) {
    4414              :     return I->getOpcode() == Trunc;
    4415              :   }
    4416              :   static bool classof(const Value *V) {
    4417              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4418              :   }
    4419              : 
    4420              :   void setHasNoUnsignedWrap(bool B) {
    4421              :     SubclassOptionalData =
    4422              :         (SubclassOptionalData & ~NoUnsignedWrap) | (B * NoUnsignedWrap);
    4423              :   }
    4424              :   void setHasNoSignedWrap(bool B) {
    4425              :     SubclassOptionalData =
    4426              :         (SubclassOptionalData & ~NoSignedWrap) | (B * NoSignedWrap);
    4427              :   }
    4428              : 
    4429              :   /// Test whether this operation is known to never
    4430              :   /// undergo unsigned overflow, aka the nuw property.
    4431              :   bool hasNoUnsignedWrap() const {
    4432              :     return SubclassOptionalData & NoUnsignedWrap;
    4433              :   }
    4434              : 
    4435              :   /// Test whether this operation is known to never
    4436              :   /// undergo signed overflow, aka the nsw property.
    4437              :   bool hasNoSignedWrap() const {
    4438              :     return (SubclassOptionalData & NoSignedWrap) != 0;
    4439              :   }
    4440              : 
    4441              :   /// Returns the no-wrap kind of the operation.
    4442              :   unsigned getNoWrapKind() const {
    4443              :     unsigned NoWrapKind = 0;
    4444              :     if (hasNoUnsignedWrap())
    4445              :       NoWrapKind |= NoUnsignedWrap;
    4446              : 
    4447              :     if (hasNoSignedWrap())
    4448              :       NoWrapKind |= NoSignedWrap;
    4449              : 
    4450              :     return NoWrapKind;
    4451              :   }
    4452              : };
    4453              : 
    4454              : //===----------------------------------------------------------------------===//
    4455              : //                                 ZExtInst Class
    4456              : //===----------------------------------------------------------------------===//
    4457              : 
    4458              : /// This class represents zero extension of integer types.
    4459              : class ZExtInst : public CastInst {
    4460              : protected:
    4461              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4462              :   friend class Instruction;
    4463              : 
    4464              :   /// Clone an identical ZExtInst
    4465              :   ZExtInst *cloneImpl() const;
    4466              : 
    4467              : public:
    4468              :   /// Constructor with insert-before-instruction semantics
    4469              :   ZExtInst(Value *S,                  ///< The value to be zero extended
    4470              :            Type *Ty,                  ///< The type to zero extend to
    4471              :            const Twine &NameStr = "", ///< A name for the new instruction
    4472              :            InsertPosition InsertBefore =
    4473              :                nullptr ///< Where to insert the new instruction
    4474              :   );
    4475              : 
    4476              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    4477              :   static bool classof(const Instruction *I) {
    4478              :     return I->getOpcode() == ZExt;
    4479              :   }
    4480              :   static bool classof(const Value *V) {
    4481              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4482              :   }
    4483              : };
    4484              : 
    4485              : //===----------------------------------------------------------------------===//
    4486              : //                                 SExtInst Class
    4487              : //===----------------------------------------------------------------------===//
    4488              : 
    4489              : /// This class represents a sign extension of integer types.
    4490              : class SExtInst : public CastInst {
    4491              : protected:
    4492              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4493              :   friend class Instruction;
    4494              : 
    4495              :   /// Clone an identical SExtInst
    4496              :   SExtInst *cloneImpl() const;
    4497              : 
    4498              : public:
    4499              :   /// Constructor with insert-before-instruction semantics
    4500              :   SExtInst(Value *S,                  ///< The value to be sign extended
    4501              :            Type *Ty,                  ///< The type to sign extend to
    4502              :            const Twine &NameStr = "", ///< A name for the new instruction
    4503              :            InsertPosition InsertBefore =
    4504              :                nullptr ///< Where to insert the new instruction
    4505              :   );
    4506              : 
    4507              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    4508              :   static bool classof(const Instruction *I) {
    4509              :     return I->getOpcode() == SExt;
    4510              :   }
    4511              :   static bool classof(const Value *V) {
    4512              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4513              :   }
    4514              : };
    4515              : 
    4516              : //===----------------------------------------------------------------------===//
    4517              : //                                 FPTruncInst Class
    4518              : //===----------------------------------------------------------------------===//
    4519              : 
    4520              : /// This class represents a truncation of floating point types.
    4521              : class FPTruncInst : public CastInst {
    4522              : protected:
    4523              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4524              :   friend class Instruction;
    4525              : 
    4526              :   /// Clone an identical FPTruncInst
    4527              :   FPTruncInst *cloneImpl() const;
    4528              : 
    4529              : public:                 /// Constructor with insert-before-instruction semantics
    4530              :   FPTruncInst(Value *S, ///< The value to be truncated
    4531              :               Type *Ty, ///< The type to truncate to
    4532              :               const Twine &NameStr = "", ///< A name for the new instruction
    4533              :               InsertPosition InsertBefore =
    4534              :                   nullptr ///< Where to insert the new instruction
    4535              :   );
    4536              : 
    4537              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    4538              :   static bool classof(const Instruction *I) {
    4539              :     return I->getOpcode() == FPTrunc;
    4540              :   }
    4541              :   static bool classof(const Value *V) {
    4542              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4543              :   }
    4544              : };
    4545              : 
    4546              : //===----------------------------------------------------------------------===//
    4547              : //                                 FPExtInst Class
    4548              : //===----------------------------------------------------------------------===//
    4549              : 
    4550              : /// This class represents an extension of floating point types.
    4551              : class FPExtInst : public CastInst {
    4552              : protected:
    4553              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4554              :   friend class Instruction;
    4555              : 
    4556              :   /// Clone an identical FPExtInst
    4557              :   FPExtInst *cloneImpl() const;
    4558              : 
    4559              : public:
    4560              :   /// Constructor with insert-before-instruction semantics
    4561              :   FPExtInst(Value *S,                  ///< The value to be extended
    4562              :             Type *Ty,                  ///< The type to extend to
    4563              :             const Twine &NameStr = "", ///< A name for the new instruction
    4564              :             InsertPosition InsertBefore =
    4565              :                 nullptr ///< Where to insert the new instruction
    4566              :   );
    4567              : 
    4568              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    4569              :   static bool classof(const Instruction *I) {
    4570              :     return I->getOpcode() == FPExt;
    4571              :   }
    4572              :   static bool classof(const Value *V) {
    4573              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4574              :   }
    4575              : };
    4576              : 
    4577              : //===----------------------------------------------------------------------===//
    4578              : //                                 UIToFPInst Class
    4579              : //===----------------------------------------------------------------------===//
    4580              : 
    4581              : /// This class represents a cast unsigned integer to floating point.
    4582              : class UIToFPInst : public CastInst {
    4583              : protected:
    4584              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4585              :   friend class Instruction;
    4586              : 
    4587              :   /// Clone an identical UIToFPInst
    4588              :   UIToFPInst *cloneImpl() const;
    4589              : 
    4590              : public:
    4591              :   /// Constructor with insert-before-instruction semantics
    4592              :   UIToFPInst(Value *S,                  ///< The value to be converted
    4593              :              Type *Ty,                  ///< The type to convert to
    4594              :              const Twine &NameStr = "", ///< A name for the new instruction
    4595              :              InsertPosition InsertBefore =
    4596              :                  nullptr ///< Where to insert the new instruction
    4597              :   );
    4598              : 
    4599              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    4600              :   static bool classof(const Instruction *I) {
    4601              :     return I->getOpcode() == UIToFP;
    4602              :   }
    4603              :   static bool classof(const Value *V) {
    4604              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4605              :   }
    4606              : };
    4607              : 
    4608              : //===----------------------------------------------------------------------===//
    4609              : //                                 SIToFPInst Class
    4610              : //===----------------------------------------------------------------------===//
    4611              : 
    4612              : /// This class represents a cast from signed integer to floating point.
    4613              : class SIToFPInst : public CastInst {
    4614              : protected:
    4615              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4616              :   friend class Instruction;
    4617              : 
    4618              :   /// Clone an identical SIToFPInst
    4619              :   SIToFPInst *cloneImpl() const;
    4620              : 
    4621              : public:
    4622              :   /// Constructor with insert-before-instruction semantics
    4623              :   SIToFPInst(Value *S,                  ///< The value to be converted
    4624              :              Type *Ty,                  ///< The type to convert to
    4625              :              const Twine &NameStr = "", ///< A name for the new instruction
    4626              :              InsertPosition InsertBefore =
    4627              :                  nullptr ///< Where to insert the new instruction
    4628              :   );
    4629              : 
    4630              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    4631              :   static bool classof(const Instruction *I) {
    4632              :     return I->getOpcode() == SIToFP;
    4633              :   }
    4634              :   static bool classof(const Value *V) {
    4635              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4636              :   }
    4637              : };
    4638              : 
    4639              : //===----------------------------------------------------------------------===//
    4640              : //                                 FPToUIInst Class
    4641              : //===----------------------------------------------------------------------===//
    4642              : 
    4643              : /// This class represents a cast from floating point to unsigned integer
    4644              : class FPToUIInst  : public CastInst {
    4645              : protected:
    4646              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4647              :   friend class Instruction;
    4648              : 
    4649              :   /// Clone an identical FPToUIInst
    4650              :   FPToUIInst *cloneImpl() const;
    4651              : 
    4652              : public:
    4653              :   /// Constructor with insert-before-instruction semantics
    4654              :   FPToUIInst(Value *S,                  ///< The value to be converted
    4655              :              Type *Ty,                  ///< The type to convert to
    4656              :              const Twine &NameStr = "", ///< A name for the new instruction
    4657              :              InsertPosition InsertBefore =
    4658              :                  nullptr ///< Where to insert the new instruction
    4659              :   );
    4660              : 
    4661              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    4662              :   static bool classof(const Instruction *I) {
    4663              :     return I->getOpcode() == FPToUI;
    4664              :   }
    4665              :   static bool classof(const Value *V) {
    4666              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4667              :   }
    4668              : };
    4669              : 
    4670              : //===----------------------------------------------------------------------===//
    4671              : //                                 FPToSIInst Class
    4672              : //===----------------------------------------------------------------------===//
    4673              : 
    4674              : /// This class represents a cast from floating point to signed integer.
    4675              : class FPToSIInst  : public CastInst {
    4676              : protected:
    4677              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4678              :   friend class Instruction;
    4679              : 
    4680              :   /// Clone an identical FPToSIInst
    4681              :   FPToSIInst *cloneImpl() const;
    4682              : 
    4683              : public:
    4684              :   /// Constructor with insert-before-instruction semantics
    4685              :   FPToSIInst(Value *S,                  ///< The value to be converted
    4686              :              Type *Ty,                  ///< The type to convert to
    4687              :              const Twine &NameStr = "", ///< A name for the new instruction
    4688              :              InsertPosition InsertBefore =
    4689              :                  nullptr ///< Where to insert the new instruction
    4690              :   );
    4691              : 
    4692              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
    4693              :   static bool classof(const Instruction *I) {
    4694              :     return I->getOpcode() == FPToSI;
    4695              :   }
    4696              :   static bool classof(const Value *V) {
    4697              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4698              :   }
    4699              : };
    4700              : 
    4701              : //===----------------------------------------------------------------------===//
    4702              : //                                 IntToPtrInst Class
    4703              : //===----------------------------------------------------------------------===//
    4704              : 
    4705              : /// This class represents a cast from an integer to a pointer.
    4706              : class IntToPtrInst : public CastInst {
    4707              : public:
    4708              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4709              :   friend class Instruction;
    4710              : 
    4711              :   /// Constructor with insert-before-instruction semantics
    4712              :   IntToPtrInst(Value *S,                  ///< The value to be converted
    4713              :                Type *Ty,                  ///< The type to convert to
    4714              :                const Twine &NameStr = "", ///< A name for the new instruction
    4715              :                InsertPosition InsertBefore =
    4716              :                    nullptr ///< Where to insert the new instruction
    4717              :   );
    4718              : 
    4719              :   /// Clone an identical IntToPtrInst.
    4720              :   IntToPtrInst *cloneImpl() const;
    4721              : 
    4722              :   /// Returns the address space of this instruction's pointer type.
    4723              :   unsigned getAddressSpace() const {
    4724              :     return getType()->getPointerAddressSpace();
    4725              :   }
    4726              : 
    4727              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    4728              :   static bool classof(const Instruction *I) {
    4729              :     return I->getOpcode() == IntToPtr;
    4730              :   }
    4731              :   static bool classof(const Value *V) {
    4732              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4733              :   }
    4734              : };
    4735              : 
    4736              : //===----------------------------------------------------------------------===//
    4737              : //                                 PtrToIntInst Class
    4738              : //===----------------------------------------------------------------------===//
    4739              : 
    4740              : /// This class represents a cast from a pointer to an integer.
    4741              : class PtrToIntInst : public CastInst {
    4742              : protected:
    4743              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4744              :   friend class Instruction;
    4745              : 
    4746              :   /// Clone an identical PtrToIntInst.
    4747              :   PtrToIntInst *cloneImpl() const;
    4748              : 
    4749              : public:
    4750              :   /// Constructor with insert-before-instruction semantics
    4751              :   PtrToIntInst(Value *S,                  ///< The value to be converted
    4752              :                Type *Ty,                  ///< The type to convert to
    4753              :                const Twine &NameStr = "", ///< A name for the new instruction
    4754              :                InsertPosition InsertBefore =
    4755              :                    nullptr ///< Where to insert the new instruction
    4756              :   );
    4757              : 
    4758              :   /// Gets the pointer operand.
    4759              :   Value *getPointerOperand() { return getOperand(0); }
    4760              :   /// Gets the pointer operand.
    4761              :   const Value *getPointerOperand() const { return getOperand(0); }
    4762              :   /// Gets the operand index of the pointer operand.
    4763              :   static unsigned getPointerOperandIndex() { return 0U; }
    4764              : 
    4765              :   /// Returns the address space of the pointer operand.
    4766              :   unsigned getPointerAddressSpace() const {
    4767              :     return getPointerOperand()->getType()->getPointerAddressSpace();
    4768              :   }
    4769              : 
    4770              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    4771              :   static bool classof(const Instruction *I) {
    4772              :     return I->getOpcode() == PtrToInt;
    4773              :   }
    4774              :   static bool classof(const Value *V) {
    4775              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4776              :   }
    4777              : };
    4778              : 
    4779              : //===----------------------------------------------------------------------===//
    4780              : //                             BitCastInst Class
    4781              : //===----------------------------------------------------------------------===//
    4782              : 
    4783              : /// This class represents a no-op cast from one type to another.
    4784              : class BitCastInst : public CastInst {
    4785              : protected:
    4786              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4787              :   friend class Instruction;
    4788              : 
    4789              :   /// Clone an identical BitCastInst.
    4790              :   BitCastInst *cloneImpl() const;
    4791              : 
    4792              : public:
    4793              :   /// Constructor with insert-before-instruction semantics
    4794              :   BitCastInst(Value *S,                  ///< The value to be casted
    4795              :               Type *Ty,                  ///< The type to casted to
    4796              :               const Twine &NameStr = "", ///< A name for the new instruction
    4797              :               InsertPosition InsertBefore =
    4798              :                   nullptr ///< Where to insert the new instruction
    4799              :   );
    4800              : 
    4801              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    4802              :   static bool classof(const Instruction *I) {
    4803              :     return I->getOpcode() == BitCast;
    4804              :   }
    4805              :   static bool classof(const Value *V) {
    4806              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4807              :   }
    4808              : };
    4809              : 
    4810              : //===----------------------------------------------------------------------===//
    4811              : //                          AddrSpaceCastInst Class
    4812              : //===----------------------------------------------------------------------===//
    4813              : 
    4814              : /// This class represents a conversion between pointers from one address space
    4815              : /// to another.
    4816              : class AddrSpaceCastInst : public CastInst {
    4817              : protected:
    4818              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4819              :   friend class Instruction;
    4820              : 
    4821              :   /// Clone an identical AddrSpaceCastInst.
    4822              :   AddrSpaceCastInst *cloneImpl() const;
    4823              : 
    4824              : public:
    4825              :   /// Constructor with insert-before-instruction semantics
    4826              :   AddrSpaceCastInst(
    4827              :       Value *S,                  ///< The value to be casted
    4828              :       Type *Ty,                  ///< The type to casted to
    4829              :       const Twine &NameStr = "", ///< A name for the new instruction
    4830              :       InsertPosition InsertBefore =
    4831              :           nullptr ///< Where to insert the new instruction
    4832              :   );
    4833              : 
    4834              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    4835              :   static bool classof(const Instruction *I) {
    4836              :     return I->getOpcode() == AddrSpaceCast;
    4837              :   }
    4838              :   static bool classof(const Value *V) {
    4839              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4840              :   }
    4841              : 
    4842              :   /// Gets the pointer operand.
    4843              :   Value *getPointerOperand() {
    4844              :     return getOperand(0);
    4845              :   }
    4846              : 
    4847              :   /// Gets the pointer operand.
    4848              :   const Value *getPointerOperand() const {
    4849              :     return getOperand(0);
    4850              :   }
    4851              : 
    4852              :   /// Gets the operand index of the pointer operand.
    4853              :   static unsigned getPointerOperandIndex() {
    4854              :     return 0U;
    4855              :   }
    4856              : 
    4857              :   /// Returns the address space of the pointer operand.
    4858              :   unsigned getSrcAddressSpace() const {
    4859              :     return getPointerOperand()->getType()->getPointerAddressSpace();
    4860              :   }
    4861              : 
    4862              :   /// Returns the address space of the result.
    4863              :   unsigned getDestAddressSpace() const {
    4864              :     return getType()->getPointerAddressSpace();
    4865              :   }
    4866              : };
    4867              : 
    4868              : //===----------------------------------------------------------------------===//
    4869              : //                          Helper functions
    4870              : //===----------------------------------------------------------------------===//
    4871              : 
    4872              : /// A helper function that returns the pointer operand of a load or store
    4873              : /// instruction. Returns nullptr if not load or store.
    4874              : inline const Value *getLoadStorePointerOperand(const Value *V) {
    4875              :   if (auto *Load = dyn_cast<LoadInst>(V))
    4876              :     return Load->getPointerOperand();
    4877              :   if (auto *Store = dyn_cast<StoreInst>(V))
    4878              :     return Store->getPointerOperand();
    4879              :   return nullptr;
    4880              : }
    4881              : inline Value *getLoadStorePointerOperand(Value *V) {
    4882              :   return const_cast<Value *>(
    4883              :       getLoadStorePointerOperand(static_cast<const Value *>(V)));
    4884              : }
    4885              : 
    4886              : /// A helper function that returns the pointer operand of a load, store
    4887              : /// or GEP instruction. Returns nullptr if not load, store, or GEP.
    4888              : inline const Value *getPointerOperand(const Value *V) {
    4889              :   if (auto *Ptr = getLoadStorePointerOperand(V))
    4890              :     return Ptr;
    4891              :   if (auto *Gep = dyn_cast<GetElementPtrInst>(V))
    4892              :     return Gep->getPointerOperand();
    4893              :   return nullptr;
    4894              : }
    4895              : inline Value *getPointerOperand(Value *V) {
    4896              :   return const_cast<Value *>(getPointerOperand(static_cast<const Value *>(V)));
    4897              : }
    4898              : 
    4899              : /// A helper function that returns the alignment of load or store instruction.
    4900              : inline Align getLoadStoreAlignment(Value *I) {
    4901              :   assert((isa<LoadInst>(I) || isa<StoreInst>(I)) &&
    4902              :          "Expected Load or Store instruction");
    4903              :   if (auto *LI = dyn_cast<LoadInst>(I))
    4904              :     return LI->getAlign();
    4905              :   return cast<StoreInst>(I)->getAlign();
    4906              : }
    4907              : 
    4908              : /// A helper function that returns the address space of the pointer operand of
    4909              : /// load or store instruction.
    4910              : inline unsigned getLoadStoreAddressSpace(Value *I) {
    4911              :   assert((isa<LoadInst>(I) || isa<StoreInst>(I)) &&
    4912              :          "Expected Load or Store instruction");
    4913              :   if (auto *LI = dyn_cast<LoadInst>(I))
    4914              :     return LI->getPointerAddressSpace();
    4915              :   return cast<StoreInst>(I)->getPointerAddressSpace();
    4916              : }
    4917              : 
    4918              : /// A helper function that returns the type of a load or store instruction.
    4919              : inline Type *getLoadStoreType(Value *I) {
    4920              :   assert((isa<LoadInst>(I) || isa<StoreInst>(I)) &&
    4921              :          "Expected Load or Store instruction");
    4922              :   if (auto *LI = dyn_cast<LoadInst>(I))
    4923              :     return LI->getType();
    4924              :   return cast<StoreInst>(I)->getValueOperand()->getType();
    4925              : }
    4926              : 
    4927              : /// A helper function that returns an atomic operation's sync scope; returns
    4928              : /// std::nullopt if it is not an atomic operation.
    4929              : inline std::optional<SyncScope::ID> getAtomicSyncScopeID(const Instruction *I) {
    4930              :   if (!I->isAtomic())
    4931              :     return std::nullopt;
    4932              :   if (auto *AI = dyn_cast<LoadInst>(I))
    4933              :     return AI->getSyncScopeID();
    4934              :   if (auto *AI = dyn_cast<StoreInst>(I))
    4935              :     return AI->getSyncScopeID();
    4936              :   if (auto *AI = dyn_cast<FenceInst>(I))
    4937              :     return AI->getSyncScopeID();
    4938              :   if (auto *AI = dyn_cast<AtomicCmpXchgInst>(I))
    4939              :     return AI->getSyncScopeID();
    4940              :   if (auto *AI = dyn_cast<AtomicRMWInst>(I))
    4941              :     return AI->getSyncScopeID();
    4942              :   llvm_unreachable("unhandled atomic operation");
    4943              : }
    4944              : 
    4945              : //===----------------------------------------------------------------------===//
    4946              : //                              FreezeInst Class
    4947              : //===----------------------------------------------------------------------===//
    4948              : 
    4949              : /// This class represents a freeze function that returns random concrete
    4950              : /// value if an operand is either a poison value or an undef value
    4951              : class FreezeInst : public UnaryInstruction {
    4952              : protected:
    4953              :   // Note: Instruction needs to be a friend here to call cloneImpl.
    4954              :   friend class Instruction;
    4955              : 
    4956              :   /// Clone an identical FreezeInst
    4957              :   FreezeInst *cloneImpl() const;
    4958              : 
    4959              : public:
    4960              :   explicit FreezeInst(Value *S, const Twine &NameStr = "",
    4961              :                       InsertPosition InsertBefore = nullptr);
    4962              : 
    4963              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    4964              :   static inline bool classof(const Instruction *I) {
    4965              :     return I->getOpcode() == Freeze;
    4966              :   }
    4967              :   static inline bool classof(const Value *V) {
    4968              :     return isa<Instruction>(V) && classof(cast<Instruction>(V));
    4969              :   }
    4970              : };
    4971              : 
    4972              : } // end namespace llvm
    4973              : 
    4974              : #endif // LLVM_IR_INSTRUCTIONS_H
        

Generated by: LCOV version 2.0-1