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