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