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