LCOV - code coverage report
Current view: top level - /usr/lib/llvm-19/include/llvm/IR - Instructions.h (source / functions) Coverage Total Hit
Test: PostgreSQL 20devel Lines: 0.0 % 20 0
Test Date: 2026-07-03 19:57:34 Functions: 0.0 % 6 0
Legend: Lines:     hit not hit
Branches: + taken - not taken # not executed
Branches: 0.0 % 18 0

             Branch data     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                 :           0 :   static bool classof(const Instruction *I) {
    1537                 :           0 :     return I->getOpcode() == Instruction::Call;
    1538                 :             :   }
    1539                 :           0 :   static bool classof(const Value *V) {
    1540   [ #  #  #  # ]:           0 :     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