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()) {
3703 if (Weights->size() >= 2) {
3704 setBranchWeights(SI, Weights.value(), /*IsExpected=*/false);
3705 return;
3706 }
3707 // In some cases while simplifying switch instructions, we end up with
3708 // degenerate switch instructions (e.g., only contains the default case).
3709 // We drop profile metadata in such cases rather than updating given it
3710 // does not convey anything.
3711 SI.setMetadata(LLVMContext::MD_prof, nullptr);
3712 }
3713 }
3714
3715 /// Delegate the call to the underlying SwitchInst::removeCase() and remove
3716 /// correspondent branch weight.
3718
3719 /// Replace the default destination by given case. Delegate the call to
3720 /// the underlying SwitchInst::setDefaultDest and remove correspondent branch
3721 /// weight.
3723
3724 /// Delegate the call to the underlying SwitchInst::addCase() and set the
3725 /// specified branch weight for the added case.
3726 LLVM_ABI void addCase(ConstantInt *OnVal, BasicBlock *Dest, CaseWeightOpt W);
3727
3728 /// Delegate the call to the underlying SwitchInst::eraseFromParent() and mark
3729 /// this object to not touch the underlying SwitchInst in destructor.
3731
3732 LLVM_ABI void setSuccessorWeight(unsigned idx, CaseWeightOpt W);
3734
3736 unsigned idx);
3737};
3738
3739template <> struct OperandTraits<SwitchInst> : public HungoffOperandTraits {};
3740
3742
3743//===----------------------------------------------------------------------===//
3744// IndirectBrInst Class
3745//===----------------------------------------------------------------------===//
3746
3747//===---------------------------------------------------------------------------
3748/// Indirect Branch Instruction.
3749///
3750class IndirectBrInst : public Instruction {
3751 constexpr static HungOffOperandsAllocMarker AllocMarker{};
3752
3753 unsigned ReservedSpace;
3754
3755 // Operand[0] = Address to jump to
3756 // Operand[n+1] = n-th destination
3757 IndirectBrInst(const IndirectBrInst &IBI);
3758
3759 /// Create a new indirectbr instruction, specifying an
3760 /// Address to jump to. The number of expected destinations can be specified
3761 /// here to make memory allocation more efficient. This constructor can also
3762 /// autoinsert before another instruction.
3763 LLVM_ABI IndirectBrInst(Value *Address, unsigned NumDests,
3764 InsertPosition InsertBefore);
3765
3766 // allocate space for exactly zero operands
3767 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
3768
3769 void init(Value *Address, unsigned NumDests);
3770 void growOperands();
3771
3772protected:
3773 // Note: Instruction needs to be a friend here to call cloneImpl.
3774 friend class Instruction;
3775
3776 LLVM_ABI IndirectBrInst *cloneImpl() const;
3777
3778public:
3779 void operator delete(void *Ptr) { User::operator delete(Ptr, AllocMarker); }
3780
3781 static IndirectBrInst *Create(Value *Address, unsigned NumDests,
3782 InsertPosition InsertBefore = nullptr) {
3783 return new IndirectBrInst(Address, NumDests, InsertBefore);
3784 }
3785
3786 /// Provide fast operand accessors.
3788
3789 // Accessor Methods for IndirectBrInst instruction.
3790 Value *getAddress() { return getOperand(0); }
3791 const Value *getAddress() const { return getOperand(0); }
3792 void setAddress(Value *V) { setOperand(0, V); }
3793
3794 /// return the number of possible destinations in this
3795 /// indirectbr instruction.
3796 unsigned getNumDestinations() const { return getNumOperands()-1; }
3797
3798 /// Return the specified destination.
3799 BasicBlock *getDestination(unsigned i) { return getSuccessor(i); }
3800 const BasicBlock *getDestination(unsigned i) const { return getSuccessor(i); }
3801
3802 /// Add a destination.
3803 ///
3804 LLVM_ABI void addDestination(BasicBlock *Dest);
3805
3806 /// This method removes the specified successor from the
3807 /// indirectbr instruction.
3808 LLVM_ABI void removeDestination(unsigned i);
3809
3810 unsigned getNumSuccessors() const { return getNumOperands()-1; }
3811 BasicBlock *getSuccessor(unsigned i) const {
3812 return cast<BasicBlock>(getOperand(i+1));
3813 }
3814 void setSuccessor(unsigned i, BasicBlock *NewSucc) {
3815 setOperand(i + 1, NewSucc);
3816 }
3817
3822
3827
3828 // Methods for support type inquiry through isa, cast, and dyn_cast:
3829 static bool classof(const Instruction *I) {
3830 return I->getOpcode() == Instruction::IndirectBr;
3831 }
3832 static bool classof(const Value *V) {
3834 }
3835};
3836
3837template <>
3839
3841
3842//===----------------------------------------------------------------------===//
3843// InvokeInst Class
3844//===----------------------------------------------------------------------===//
3845
3846/// Invoke instruction. The SubclassData field is used to hold the
3847/// calling convention of the call.
3848///
3849class InvokeInst : public CallBase {
3850 /// The number of operands for this call beyond the called function,
3851 /// arguments, and operand bundles.
3852 static constexpr int NumExtraOperands = 2;
3853
3854 /// The index from the end of the operand array to the normal destination.
3855 static constexpr int NormalDestOpEndIdx = -3;
3856
3857 /// The index from the end of the operand array to the unwind destination.
3858 static constexpr int UnwindDestOpEndIdx = -2;
3859
3860 InvokeInst(const InvokeInst &BI, AllocInfo AllocInfo);
3861
3862 /// Construct an InvokeInst given a range of arguments.
3863 ///
3864 /// Construct an InvokeInst from a range of arguments
3865 inline InvokeInst(FunctionType *Ty, Value *Func, BasicBlock *IfNormal,
3866 BasicBlock *IfException, ArrayRef<Value *> Args,
3868 const Twine &NameStr, InsertPosition InsertBefore);
3869
3870 LLVM_ABI void init(FunctionType *Ty, Value *Func, BasicBlock *IfNormal,
3871 BasicBlock *IfException, ArrayRef<Value *> Args,
3872 ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr);
3873
3874 /// Compute the number of operands to allocate.
3875 static unsigned ComputeNumOperands(unsigned NumArgs,
3876 size_t NumBundleInputs = 0) {
3877 // We need one operand for the called function, plus our extra operands and
3878 // the input operand counts provided.
3879 return 1 + NumExtraOperands + NumArgs + unsigned(NumBundleInputs);
3880 }
3881
3882protected:
3883 // Note: Instruction needs to be a friend here to call cloneImpl.
3884 friend class Instruction;
3885
3886 LLVM_ABI InvokeInst *cloneImpl() const;
3887
3888public:
3889 static InvokeInst *Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal,
3890 BasicBlock *IfException, ArrayRef<Value *> Args,
3891 const Twine &NameStr,
3892 InsertPosition InsertBefore = nullptr) {
3893 IntrusiveOperandsAllocMarker AllocMarker{
3894 ComputeNumOperands(unsigned(Args.size()))};
3895 return new (AllocMarker) InvokeInst(Ty, Func, IfNormal, IfException, Args,
3896 {}, AllocMarker, NameStr, InsertBefore);
3897 }
3898
3899 static InvokeInst *Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal,
3900 BasicBlock *IfException, ArrayRef<Value *> Args,
3901 ArrayRef<OperandBundleDef> Bundles = {},
3902 const Twine &NameStr = "",
3903 InsertPosition InsertBefore = nullptr) {
3904 IntrusiveOperandsAndDescriptorAllocMarker AllocMarker{
3905 ComputeNumOperands(Args.size(), CountBundleInputs(Bundles)),
3906 unsigned(Bundles.size() * sizeof(BundleOpInfo))};
3907
3908 return new (AllocMarker)
3909 InvokeInst(Ty, Func, IfNormal, IfException, Args, Bundles, AllocMarker,
3910 NameStr, InsertBefore);
3911 }
3912
3913 static InvokeInst *Create(FunctionCallee Func, BasicBlock *IfNormal,
3914 BasicBlock *IfException, ArrayRef<Value *> Args,
3915 const Twine &NameStr,
3916 InsertPosition InsertBefore = nullptr) {
3917 return Create(Func.getFunctionType(), Func.getCallee(), IfNormal,
3918 IfException, Args, {}, NameStr, InsertBefore);
3919 }
3920
3921 static InvokeInst *Create(FunctionCallee Func, BasicBlock *IfNormal,
3922 BasicBlock *IfException, ArrayRef<Value *> Args,
3923 ArrayRef<OperandBundleDef> Bundles = {},
3924 const Twine &NameStr = "",
3925 InsertPosition InsertBefore = nullptr) {
3926 return Create(Func.getFunctionType(), Func.getCallee(), IfNormal,
3927 IfException, Args, Bundles, NameStr, InsertBefore);
3928 }
3929
3930 /// Create a clone of \p II with a different set of operand bundles and
3931 /// insert it before \p InsertBefore.
3932 ///
3933 /// The returned invoke instruction is identical to \p II in every way except
3934 /// that the operand bundles for the new instruction are set to the operand
3935 /// bundles in \p Bundles.
3936 LLVM_ABI static InvokeInst *Create(InvokeInst *II,
3938 InsertPosition InsertPt = nullptr);
3939
3940 // get*Dest - Return the destination basic blocks...
3948 Op<NormalDestOpEndIdx>() = reinterpret_cast<Value *>(B);
3949 }
3951 Op<UnwindDestOpEndIdx>() = reinterpret_cast<Value *>(B);
3952 }
3953
3954 /// Get the landingpad instruction from the landing pad
3955 /// block (the unwind destination).
3956 LLVM_ABI LandingPadInst *getLandingPadInst() const;
3957
3958 BasicBlock *getSuccessor(unsigned i) const {
3959 assert(i < 2 && "Successor # out of range for invoke!");
3960 return i == 0 ? getNormalDest() : getUnwindDest();
3961 }
3962
3963 void setSuccessor(unsigned i, BasicBlock *NewSucc) {
3964 assert(i < 2 && "Successor # out of range for invoke!");
3965 if (i == 0)
3966 setNormalDest(NewSucc);
3967 else
3968 setUnwindDest(NewSucc);
3969 }
3970
3971 unsigned getNumSuccessors() const { return 2; }
3972
3981
3982 /// Updates profile metadata by scaling it by \p S / \p T.
3983 LLVM_ABI void updateProfWeight(uint64_t S, uint64_t T);
3984
3985 // Methods for support type inquiry through isa, cast, and dyn_cast:
3986 static bool classof(const Instruction *I) {
3987 return (I->getOpcode() == Instruction::Invoke);
3988 }
3989 static bool classof(const Value *V) {
3991 }
3992
3993private:
3994 // Shadow Instruction::setInstructionSubclassData with a private forwarding
3995 // method so that subclasses cannot accidentally use it.
3996 template <typename Bitfield>
3997 void setSubclassData(typename Bitfield::Type Value) {
3999 }
4000};
4001
4002InvokeInst::InvokeInst(FunctionType *Ty, Value *Func, BasicBlock *IfNormal,
4003 BasicBlock *IfException, ArrayRef<Value *> Args,
4005 const Twine &NameStr, InsertPosition InsertBefore)
4006 : CallBase(Ty->getReturnType(), Instruction::Invoke, AllocInfo,
4007 InsertBefore) {
4008 init(Ty, Func, IfNormal, IfException, Args, Bundles, NameStr);
4009}
4010
4011//===----------------------------------------------------------------------===//
4012// CallBrInst Class
4013//===----------------------------------------------------------------------===//
4014
4015/// CallBr instruction, tracking function calls that may not return control but
4016/// instead transfer it to a third location. The SubclassData field is used to
4017/// hold the calling convention of the call.
4018///
4019class CallBrInst : public CallBase {
4020
4021 unsigned NumIndirectDests;
4022
4023 CallBrInst(const CallBrInst &BI, AllocInfo AllocInfo);
4024
4025 /// Construct a CallBrInst given a range of arguments.
4026 ///
4027 /// Construct a CallBrInst from a range of arguments
4028 inline CallBrInst(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest,
4029 ArrayRef<BasicBlock *> IndirectDests,
4031 AllocInfo AllocInfo, const Twine &NameStr,
4032 InsertPosition InsertBefore);
4033
4034 LLVM_ABI void init(FunctionType *FTy, Value *Func, BasicBlock *DefaultDest,
4035 ArrayRef<BasicBlock *> IndirectDests,
4037 const Twine &NameStr);
4038
4039 /// Compute the number of operands to allocate.
4040 static unsigned ComputeNumOperands(int NumArgs, int NumIndirectDests,
4041 int NumBundleInputs = 0) {
4042 // We need one operand for the called function, plus our extra operands and
4043 // the input operand counts provided.
4044 return unsigned(2 + NumIndirectDests + NumArgs + NumBundleInputs);
4045 }
4046
4047protected:
4048 // Note: Instruction needs to be a friend here to call cloneImpl.
4049 friend class Instruction;
4050
4051 LLVM_ABI CallBrInst *cloneImpl() const;
4052
4053public:
4054 static CallBrInst *Create(FunctionType *Ty, Value *Func,
4055 BasicBlock *DefaultDest,
4056 ArrayRef<BasicBlock *> IndirectDests,
4057 ArrayRef<Value *> Args, const Twine &NameStr,
4058 InsertPosition InsertBefore = nullptr) {
4059 IntrusiveOperandsAllocMarker AllocMarker{
4060 ComputeNumOperands(Args.size(), IndirectDests.size())};
4061 return new (AllocMarker)
4062 CallBrInst(Ty, Func, DefaultDest, IndirectDests, Args, {}, AllocMarker,
4063 NameStr, InsertBefore);
4064 }
4065
4066 static CallBrInst *
4067 Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest,
4068 ArrayRef<BasicBlock *> IndirectDests, ArrayRef<Value *> Args,
4069 ArrayRef<OperandBundleDef> Bundles = {}, const Twine &NameStr = "",
4070 InsertPosition InsertBefore = nullptr) {
4071 IntrusiveOperandsAndDescriptorAllocMarker AllocMarker{
4072 ComputeNumOperands(Args.size(), IndirectDests.size(),
4073 CountBundleInputs(Bundles)),
4074 unsigned(Bundles.size() * sizeof(BundleOpInfo))};
4075
4076 return new (AllocMarker)
4077 CallBrInst(Ty, Func, DefaultDest, IndirectDests, Args, Bundles,
4078 AllocMarker, NameStr, InsertBefore);
4079 }
4080
4081 static CallBrInst *Create(FunctionCallee Func, BasicBlock *DefaultDest,
4082 ArrayRef<BasicBlock *> IndirectDests,
4083 ArrayRef<Value *> Args, const Twine &NameStr,
4084 InsertPosition InsertBefore = nullptr) {
4085 return Create(Func.getFunctionType(), Func.getCallee(), DefaultDest,
4086 IndirectDests, Args, NameStr, InsertBefore);
4087 }
4088
4089 static CallBrInst *Create(FunctionCallee Func, BasicBlock *DefaultDest,
4090 ArrayRef<BasicBlock *> IndirectDests,
4091 ArrayRef<Value *> Args,
4092 ArrayRef<OperandBundleDef> Bundles = {},
4093 const Twine &NameStr = "",
4094 InsertPosition InsertBefore = nullptr) {
4095 return Create(Func.getFunctionType(), Func.getCallee(), DefaultDest,
4096 IndirectDests, Args, Bundles, NameStr, InsertBefore);
4097 }
4098
4099 /// Create a clone of \p CBI with a different set of operand bundles and
4100 /// insert it before \p InsertBefore.
4101 ///
4102 /// The returned callbr instruction is identical to \p CBI in every way
4103 /// except that the operand bundles for the new instruction are set to the
4104 /// operand bundles in \p Bundles.
4105 LLVM_ABI static CallBrInst *Create(CallBrInst *CBI,
4107 InsertPosition InsertBefore = nullptr);
4108
4109 /// Return the number of callbr indirect dest labels.
4110 ///
4111 unsigned getNumIndirectDests() const { return NumIndirectDests; }
4112
4113 /// getIndirectDestLabel - Return the i-th indirect dest label.
4114 ///
4115 Value *getIndirectDestLabel(unsigned i) const {
4116 assert(i < getNumIndirectDests() && "Out of bounds!");
4117 return getOperand(i + arg_size() + getNumTotalBundleOperands() + 1);
4118 }
4119
4120 Value *getIndirectDestLabelUse(unsigned i) const {
4121 assert(i < getNumIndirectDests() && "Out of bounds!");
4122 return getOperandUse(i + arg_size() + getNumTotalBundleOperands() + 1);
4123 }
4124
4125 // Return the destination basic blocks...
4127 return cast<BasicBlock>(*(&Op<-1>() - getNumIndirectDests() - 1));
4128 }
4129 BasicBlock *getIndirectDest(unsigned i) const {
4131 }
4133 SmallVector<BasicBlock *, 16> IndirectDests;
4134 for (unsigned i = 0, e = getNumIndirectDests(); i < e; ++i)
4135 IndirectDests.push_back(getIndirectDest(i));
4136 return IndirectDests;
4137 }
4139 *(&Op<-1>() - getNumIndirectDests() - 1) = reinterpret_cast<Value *>(B);
4140 }
4141 void setIndirectDest(unsigned i, BasicBlock *B) {
4142 *(&Op<-1>() - getNumIndirectDests() + i) = reinterpret_cast<Value *>(B);
4143 }
4144
4145 BasicBlock *getSuccessor(unsigned i) const {
4146 assert(i < getNumSuccessors() + 1 &&
4147 "Successor # out of range for callbr!");
4148 return i == 0 ? getDefaultDest() : getIndirectDest(i - 1);
4149 }
4150
4151 void setSuccessor(unsigned i, BasicBlock *NewSucc) {
4152 assert(i < getNumIndirectDests() + 1 &&
4153 "Successor # out of range for callbr!");
4154 return i == 0 ? setDefaultDest(NewSucc) : setIndirectDest(i - 1, NewSucc);
4155 }
4156
4157 unsigned getNumSuccessors() const { return getNumIndirectDests() + 1; }
4158
4167
4168 // Methods for support type inquiry through isa, cast, and dyn_cast:
4169 static bool classof(const Instruction *I) {
4170 return (I->getOpcode() == Instruction::CallBr);
4171 }
4172 static bool classof(const Value *V) {
4174 }
4175
4176private:
4177 // Shadow Instruction::setInstructionSubclassData with a private forwarding
4178 // method so that subclasses cannot accidentally use it.
4179 template <typename Bitfield>
4180 void setSubclassData(typename Bitfield::Type Value) {
4182 }
4183};
4184
4185CallBrInst::CallBrInst(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest,
4186 ArrayRef<BasicBlock *> IndirectDests,
4187 ArrayRef<Value *> Args,
4189 const Twine &NameStr, InsertPosition InsertBefore)
4190 : CallBase(Ty->getReturnType(), Instruction::CallBr, AllocInfo,
4191 InsertBefore) {
4192 init(Ty, Func, DefaultDest, IndirectDests, Args, Bundles, NameStr);
4193}
4194
4195//===----------------------------------------------------------------------===//
4196// ResumeInst Class
4197//===----------------------------------------------------------------------===//
4198
4199//===---------------------------------------------------------------------------
4200/// Resume the propagation of an exception.
4201///
4202class ResumeInst : public Instruction {
4203 constexpr static IntrusiveOperandsAllocMarker AllocMarker{1};
4204
4205 ResumeInst(const ResumeInst &RI);
4206
4207 LLVM_ABI explicit ResumeInst(Value *Exn,
4208 InsertPosition InsertBefore = nullptr);
4209
4210protected:
4211 // Note: Instruction needs to be a friend here to call cloneImpl.
4212 friend class Instruction;
4213
4214 LLVM_ABI ResumeInst *cloneImpl() const;
4215
4216public:
4217 static ResumeInst *Create(Value *Exn, InsertPosition InsertBefore = nullptr) {
4218 return new (AllocMarker) ResumeInst(Exn, InsertBefore);
4219 }
4220
4221 /// Provide fast operand accessors
4223
4224 /// Convenience accessor.
4225 Value *getValue() const { return Op<0>(); }
4226
4227 unsigned getNumSuccessors() const { return 0; }
4228
4229 // Methods for support type inquiry through isa, cast, and dyn_cast:
4230 static bool classof(const Instruction *I) {
4231 return I->getOpcode() == Instruction::Resume;
4232 }
4233 static bool classof(const Value *V) {
4235 }
4236
4237private:
4238 BasicBlock *getSuccessor(unsigned idx) const {
4239 llvm_unreachable("ResumeInst has no successors!");
4240 }
4241
4242 void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
4243 llvm_unreachable("ResumeInst has no successors!");
4244 }
4245
4246 iterator_range<succ_iterator> successors() {
4247 return {succ_iterator(op_end()), succ_iterator(op_end())};
4248 }
4249 iterator_range<const_succ_iterator> successors() const {
4251 }
4252};
4253
4254template <>
4256 public FixedNumOperandTraits<ResumeInst, 1> {
4257};
4258
4260
4261//===----------------------------------------------------------------------===//
4262// CatchSwitchInst Class
4263//===----------------------------------------------------------------------===//
4264class CatchSwitchInst : public Instruction {
4265 using UnwindDestField = BoolBitfieldElementT<0>;
4266
4267 constexpr static HungOffOperandsAllocMarker AllocMarker{};
4268
4269 /// The number of operands actually allocated. NumOperands is
4270 /// the number actually in use.
4271 unsigned ReservedSpace;
4272
4273 // Operand[0] = Outer scope
4274 // Operand[1] = Unwind block destination
4275 // Operand[n] = BasicBlock to go to on match
4276 CatchSwitchInst(const CatchSwitchInst &CSI);
4277
4278 /// Create a new switch instruction, specifying a
4279 /// default destination. The number of additional handlers can be specified
4280 /// here to make memory allocation more efficient.
4281 /// This constructor can also autoinsert before another instruction.
4282 LLVM_ABI CatchSwitchInst(Value *ParentPad, BasicBlock *UnwindDest,
4283 unsigned NumHandlers, const Twine &NameStr,
4284 InsertPosition InsertBefore);
4285
4286 // allocate space for exactly zero operands
4287 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
4288
4289 void init(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumReserved);
4290 void growOperands(unsigned Size);
4291
4292protected:
4293 // Note: Instruction needs to be a friend here to call cloneImpl.
4294 friend class Instruction;
4295
4296 LLVM_ABI CatchSwitchInst *cloneImpl() const;
4297
4298public:
4299 void operator delete(void *Ptr) {
4300 return User::operator delete(Ptr, AllocMarker);
4301 }
4302
4303 static CatchSwitchInst *Create(Value *ParentPad, BasicBlock *UnwindDest,
4304 unsigned NumHandlers,
4305 const Twine &NameStr = "",
4306 InsertPosition InsertBefore = nullptr) {
4307 return new CatchSwitchInst(ParentPad, UnwindDest, NumHandlers, NameStr,
4308 InsertBefore);
4309 }
4310
4311 /// Provide fast operand accessors
4313
4314 // Accessor Methods for CatchSwitch stmt
4315 Value *getParentPad() const { return getOperand(0); }
4316 void setParentPad(Value *ParentPad) { setOperand(0, ParentPad); }
4317
4318 // Accessor Methods for CatchSwitch stmt
4320 bool unwindsToCaller() const { return !hasUnwindDest(); }
4322 if (hasUnwindDest())
4323 return cast<BasicBlock>(getOperand(1));
4324 return nullptr;
4325 }
4326 void setUnwindDest(BasicBlock *UnwindDest) {
4327 assert(UnwindDest);
4329 setOperand(1, UnwindDest);
4330 }
4331
4332 /// return the number of 'handlers' in this catchswitch
4333 /// instruction, except the default handler
4334 unsigned getNumHandlers() const {
4335 if (hasUnwindDest())
4336 return getNumOperands() - 2;
4337 return getNumOperands() - 1;
4338 }
4339
4340private:
4341 static BasicBlock *handler_helper(Value *V) { return cast<BasicBlock>(V); }
4342 static const BasicBlock *handler_helper(const Value *V) {
4343 return cast<BasicBlock>(V);
4344 }
4345
4346public:
4347 using DerefFnTy = BasicBlock *(*)(Value *);
4350 using ConstDerefFnTy = const BasicBlock *(*)(const Value *);
4354
4355 /// Returns an iterator that points to the first handler in CatchSwitchInst.
4357 op_iterator It = op_begin() + 1;
4358 if (hasUnwindDest())
4359 ++It;
4360 return handler_iterator(It, DerefFnTy(handler_helper));
4361 }
4362
4363 /// Returns an iterator that points to the first handler in the
4364 /// CatchSwitchInst.
4366 const_op_iterator It = op_begin() + 1;
4367 if (hasUnwindDest())
4368 ++It;
4369 return const_handler_iterator(It, ConstDerefFnTy(handler_helper));
4370 }
4371
4372 /// Returns a read-only iterator that points one past the last
4373 /// handler in the CatchSwitchInst.
4375 return handler_iterator(op_end(), DerefFnTy(handler_helper));
4376 }
4377
4378 /// Returns an iterator that points one past the last handler in the
4379 /// CatchSwitchInst.
4381 return const_handler_iterator(op_end(), ConstDerefFnTy(handler_helper));
4382 }
4383
4384 /// iteration adapter for range-for loops.
4388
4389 /// iteration adapter for range-for loops.
4393
4394 /// Add an entry to the switch instruction...
4395 /// Note:
4396 /// This action invalidates handler_end(). Old handler_end() iterator will
4397 /// point to the added handler.
4398 LLVM_ABI void addHandler(BasicBlock *Dest);
4399
4400 LLVM_ABI void removeHandler(handler_iterator HI);
4401
4402 unsigned getNumSuccessors() const { return getNumOperands() - 1; }
4403 BasicBlock *getSuccessor(unsigned Idx) const {
4404 assert(Idx < getNumSuccessors() &&
4405 "Successor # out of range for catchswitch!");
4406 return cast<BasicBlock>(getOperand(Idx + 1));
4407 }
4408 void setSuccessor(unsigned Idx, BasicBlock *NewSucc) {
4409 assert(Idx < getNumSuccessors() &&
4410 "Successor # out of range for catchswitch!");
4411 setOperand(Idx + 1, NewSucc);
4412 }
4413
4421
4422 // Methods for support type inquiry through isa, cast, and dyn_cast:
4423 static bool classof(const Instruction *I) {
4424 return I->getOpcode() == Instruction::CatchSwitch;
4425 }
4426 static bool classof(const Value *V) {
4428 }
4429};
4430
4431template <>
4433
4435
4436//===----------------------------------------------------------------------===//
4437// CleanupPadInst Class
4438//===----------------------------------------------------------------------===//
4439class CleanupPadInst : public FuncletPadInst {
4440private:
4441 explicit CleanupPadInst(Value *ParentPad, ArrayRef<Value *> Args,
4442 AllocInfo AllocInfo, const Twine &NameStr,
4443 InsertPosition InsertBefore)
4444 : FuncletPadInst(Instruction::CleanupPad, ParentPad, Args, AllocInfo,
4445 NameStr, InsertBefore) {}
4446
4447public:
4448 static CleanupPadInst *Create(Value *ParentPad, ArrayRef<Value *> Args = {},
4449 const Twine &NameStr = "",
4450 InsertPosition InsertBefore = nullptr) {
4451 IntrusiveOperandsAllocMarker AllocMarker{unsigned(1 + Args.size())};
4452 return new (AllocMarker)
4453 CleanupPadInst(ParentPad, Args, AllocMarker, NameStr, InsertBefore);
4454 }
4455
4456 /// Methods for support type inquiry through isa, cast, and dyn_cast:
4457 static bool classof(const Instruction *I) {
4458 return I->getOpcode() == Instruction::CleanupPad;
4459 }
4460 static bool classof(const Value *V) {
4462 }
4463};
4464
4465//===----------------------------------------------------------------------===//
4466// CatchPadInst Class
4467//===----------------------------------------------------------------------===//
4468class CatchPadInst : public FuncletPadInst {
4469private:
4470 explicit CatchPadInst(Value *CatchSwitch, ArrayRef<Value *> Args,
4471 AllocInfo AllocInfo, const Twine &NameStr,
4472 InsertPosition InsertBefore)
4473 : FuncletPadInst(Instruction::CatchPad, CatchSwitch, Args, AllocInfo,
4474 NameStr, InsertBefore) {}
4475
4476public:
4477 static CatchPadInst *Create(Value *CatchSwitch, ArrayRef<Value *> Args,
4478 const Twine &NameStr = "",
4479 InsertPosition InsertBefore = nullptr) {
4480 IntrusiveOperandsAllocMarker AllocMarker{unsigned(1 + Args.size())};
4481 return new (AllocMarker)
4482 CatchPadInst(CatchSwitch, Args, AllocMarker, NameStr, InsertBefore);
4483 }
4484
4485 /// Convenience accessors
4489 void setCatchSwitch(Value *CatchSwitch) {
4490 assert(CatchSwitch);
4491 Op<-1>() = CatchSwitch;
4492 }
4493
4494 /// Methods for support type inquiry through isa, cast, and dyn_cast:
4495 static bool classof(const Instruction *I) {
4496 return I->getOpcode() == Instruction::CatchPad;
4497 }
4498 static bool classof(const Value *V) {
4500 }
4501};
4502
4503//===----------------------------------------------------------------------===//
4504// CatchReturnInst Class
4505//===----------------------------------------------------------------------===//
4506
4507class CatchReturnInst : public Instruction {
4508 constexpr static IntrusiveOperandsAllocMarker AllocMarker{2};
4509
4510 CatchReturnInst(const CatchReturnInst &RI);
4511 LLVM_ABI CatchReturnInst(Value *CatchPad, BasicBlock *BB,
4512 InsertPosition InsertBefore);
4513
4514 void init(Value *CatchPad, BasicBlock *BB);
4515
4516protected:
4517 // Note: Instruction needs to be a friend here to call cloneImpl.
4518 friend class Instruction;
4519
4520 LLVM_ABI CatchReturnInst *cloneImpl() const;
4521
4522public:
4523 static CatchReturnInst *Create(Value *CatchPad, BasicBlock *BB,
4524 InsertPosition InsertBefore = nullptr) {
4525 assert(CatchPad);
4526 assert(BB);
4527 return new (AllocMarker) CatchReturnInst(CatchPad, BB, InsertBefore);
4528 }
4529
4530 /// Provide fast operand accessors
4532
4533 /// Convenience accessors.
4535 void setCatchPad(CatchPadInst *CatchPad) {
4536 assert(CatchPad);
4537 Op<0>() = CatchPad;
4538 }
4539
4541 void setSuccessor(BasicBlock *NewSucc) {
4542 assert(NewSucc);
4543 Op<1>() = NewSucc;
4544 }
4545 unsigned getNumSuccessors() const { return 1; }
4546
4547 /// Get the parentPad of this catchret's catchpad's catchswitch.
4548 /// The successor block is implicitly a member of this funclet.
4552
4553 // Methods for support type inquiry through isa, cast, and dyn_cast:
4554 static bool classof(const Instruction *I) {
4555 return (I->getOpcode() == Instruction::CatchRet);
4556 }
4557 static bool classof(const Value *V) {
4559 }
4560
4561private:
4562 BasicBlock *getSuccessor(unsigned Idx) const {
4563 assert(Idx < getNumSuccessors() && "Successor # out of range for catchret!");
4564 return getSuccessor();
4565 }
4566
4567 void setSuccessor(unsigned Idx, BasicBlock *B) {
4568 assert(Idx < getNumSuccessors() && "Successor # out of range for catchret!");
4569 setSuccessor(B);
4570 }
4571
4572 iterator_range<succ_iterator> successors() {
4573 return {succ_iterator(std::next(op_begin())), succ_iterator(op_end())};
4574 }
4575 iterator_range<const_succ_iterator> successors() const {
4576 return {const_succ_iterator(std::next(op_begin())),
4578 }
4579};
4580
4581template <>
4583 : public FixedNumOperandTraits<CatchReturnInst, 2> {};
4584
4586
4587//===----------------------------------------------------------------------===//
4588// CleanupReturnInst Class
4589//===----------------------------------------------------------------------===//
4590
4591class CleanupReturnInst : public Instruction {
4592 using UnwindDestField = BoolBitfieldElementT<0>;
4593
4594private:
4595 CleanupReturnInst(const CleanupReturnInst &RI, AllocInfo AllocInfo);
4596 LLVM_ABI CleanupReturnInst(Value *CleanupPad, BasicBlock *UnwindBB,
4598 InsertPosition InsertBefore = nullptr);
4599
4600 void init(Value *CleanupPad, BasicBlock *UnwindBB);
4601
4602protected:
4603 // Note: Instruction needs to be a friend here to call cloneImpl.
4604 friend class Instruction;
4605
4606 LLVM_ABI CleanupReturnInst *cloneImpl() const;
4607
4608public:
4609 static CleanupReturnInst *Create(Value *CleanupPad,
4610 BasicBlock *UnwindBB = nullptr,
4611 InsertPosition InsertBefore = nullptr) {
4612 assert(CleanupPad);
4613 unsigned Values = 1;
4614 if (UnwindBB)
4615 ++Values;
4616 IntrusiveOperandsAllocMarker AllocMarker{Values};
4617 return new (AllocMarker)
4618 CleanupReturnInst(CleanupPad, UnwindBB, AllocMarker, InsertBefore);
4619 }
4620
4621 /// Provide fast operand accessors
4623
4625 bool unwindsToCaller() const { return !hasUnwindDest(); }
4626
4627 /// Convenience accessor.
4629 return cast<CleanupPadInst>(Op<0>());
4630 }
4631 void setCleanupPad(CleanupPadInst *CleanupPad) {
4632 assert(CleanupPad);
4633 Op<0>() = CleanupPad;
4634 }
4635
4636 unsigned getNumSuccessors() const { return hasUnwindDest() ? 1 : 0; }
4637
4639 return hasUnwindDest() ? cast<BasicBlock>(Op<1>()) : nullptr;
4640 }
4641 void setUnwindDest(BasicBlock *NewDest) {
4642 assert(NewDest);
4644 Op<1>() = NewDest;
4645 }
4646
4647 // Methods for support type inquiry through isa, cast, and dyn_cast:
4648 static bool classof(const Instruction *I) {
4649 return (I->getOpcode() == Instruction::CleanupRet);
4650 }
4651 static bool classof(const Value *V) {
4653 }
4654
4655private:
4656 BasicBlock *getSuccessor(unsigned Idx) const {
4657 assert(Idx == 0);
4658 return getUnwindDest();
4659 }
4660
4661 void setSuccessor(unsigned Idx, BasicBlock *B) {
4662 assert(Idx == 0);
4663 setUnwindDest(B);
4664 }
4665
4667 return {succ_iterator(std::next(op_begin())), succ_iterator(op_end())};
4668 }
4670 return {const_succ_iterator(std::next(op_begin())),
4671 const_succ_iterator(op_end())};
4672 }
4673
4674 // Shadow Instruction::setInstructionSubclassData with a private forwarding
4675 // method so that subclasses cannot accidentally use it.
4676 template <typename Bitfield>
4677 void setSubclassData(typename Bitfield::Type Value) {
4679 }
4680};
4681
4682template <>
4684 : public VariadicOperandTraits<CleanupReturnInst> {};
4685
4687
4688//===----------------------------------------------------------------------===//
4689// UnreachableInst Class
4690//===----------------------------------------------------------------------===//
4691
4692//===---------------------------------------------------------------------------
4693/// This function has undefined behavior. In particular, the
4694/// presence of this instruction indicates some higher level knowledge that the
4695/// end of the block cannot be reached.
4696///
4698 constexpr static IntrusiveOperandsAllocMarker AllocMarker{0};
4699
4700protected:
4701 // Note: Instruction needs to be a friend here to call cloneImpl.
4702 friend class Instruction;
4703
4705
4706public:
4708 InsertPosition InsertBefore = nullptr);
4709
4710 // allocate space for exactly zero operands
4711 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
4712 void operator delete(void *Ptr) { User::operator delete(Ptr, AllocMarker); }
4713
4714 unsigned getNumSuccessors() const { return 0; }
4715
4716 // Methods for support type inquiry through isa, cast, and dyn_cast:
4717 static bool classof(const Instruction *I) {
4718 return I->getOpcode() == Instruction::Unreachable;
4719 }
4720 static bool classof(const Value *V) {
4722 }
4723
4724 // Whether to do target lowering in SelectionDAG.
4725 LLVM_ABI bool shouldLowerToTrap(bool TrapUnreachable,
4726 bool NoTrapAfterNoreturn) const;
4727
4728private:
4729 BasicBlock *getSuccessor(unsigned idx) const {
4730 llvm_unreachable("UnreachableInst has no successors!");
4731 }
4732
4733 void setSuccessor(unsigned idx, BasicBlock *B) {
4734 llvm_unreachable("UnreachableInst has no successors!");
4735 }
4736
4738 return {succ_iterator(op_end()), succ_iterator(op_end())};
4739 }
4741 return {const_succ_iterator(op_end()), const_succ_iterator(op_end())};
4742 }
4743};
4744
4745//===----------------------------------------------------------------------===//
4746// TruncInst Class
4747//===----------------------------------------------------------------------===//
4748
4749/// This class represents a truncation of integer types.
4750class TruncInst : public CastInst {
4751protected:
4752 // Note: Instruction needs to be a friend here to call cloneImpl.
4753 friend class Instruction;
4754
4755 /// Clone an identical TruncInst
4756 LLVM_ABI TruncInst *cloneImpl() const;
4757
4758public:
4759 enum { AnyWrap = 0, NoUnsignedWrap = (1 << 0), NoSignedWrap = (1 << 1) };
4760
4761 /// Constructor with insert-before-instruction semantics
4762 LLVM_ABI
4763 TruncInst(Value *S, ///< The value to be truncated
4764 Type *Ty, ///< The (smaller) type to truncate to
4765 const Twine &NameStr = "", ///< A name for the new instruction
4766 InsertPosition InsertBefore =
4767 nullptr ///< Where to insert the new instruction
4768 );
4769
4770 /// Methods for support type inquiry through isa, cast, and dyn_cast:
4771 static bool classof(const Instruction *I) {
4772 return I->getOpcode() == Trunc;
4773 }
4774 static bool classof(const Value *V) {
4776 }
4777
4786
4787 /// Test whether this operation is known to never
4788 /// undergo unsigned overflow, aka the nuw property.
4789 bool hasNoUnsignedWrap() const {
4791 }
4792
4793 /// Test whether this operation is known to never
4794 /// undergo signed overflow, aka the nsw property.
4795 bool hasNoSignedWrap() const {
4796 return (SubclassOptionalData & NoSignedWrap) != 0;
4797 }
4798
4799 /// Returns the no-wrap kind of the operation.
4800 unsigned getNoWrapKind() const {
4801 unsigned NoWrapKind = 0;
4802 if (hasNoUnsignedWrap())
4803 NoWrapKind |= NoUnsignedWrap;
4804
4805 if (hasNoSignedWrap())
4806 NoWrapKind |= NoSignedWrap;
4807
4808 return NoWrapKind;
4809 }
4810};
4811
4812//===----------------------------------------------------------------------===//
4813// ZExtInst Class
4814//===----------------------------------------------------------------------===//
4815
4816/// This class represents zero extension of integer types.
4817class ZExtInst : public CastInst {
4818protected:
4819 // Note: Instruction needs to be a friend here to call cloneImpl.
4820 friend class Instruction;
4821
4822 /// Clone an identical ZExtInst
4823 LLVM_ABI ZExtInst *cloneImpl() const;
4824
4825public:
4826 /// Constructor with insert-before-instruction semantics
4827 LLVM_ABI
4828 ZExtInst(Value *S, ///< The value to be zero extended
4829 Type *Ty, ///< The type to zero extend to
4830 const Twine &NameStr = "", ///< A name for the new instruction
4831 InsertPosition InsertBefore =
4832 nullptr ///< Where to insert the new instruction
4833 );
4834
4835 /// Methods for support type inquiry through isa, cast, and dyn_cast:
4836 static bool classof(const Instruction *I) {
4837 return I->getOpcode() == ZExt;
4838 }
4839 static bool classof(const Value *V) {
4841 }
4842};
4843
4844//===----------------------------------------------------------------------===//
4845// SExtInst Class
4846//===----------------------------------------------------------------------===//
4847
4848/// This class represents a sign extension of integer types.
4849class SExtInst : public CastInst {
4850protected:
4851 // Note: Instruction needs to be a friend here to call cloneImpl.
4852 friend class Instruction;
4853
4854 /// Clone an identical SExtInst
4855 LLVM_ABI SExtInst *cloneImpl() const;
4856
4857public:
4858 /// Constructor with insert-before-instruction semantics
4859 LLVM_ABI
4860 SExtInst(Value *S, ///< The value to be sign extended
4861 Type *Ty, ///< The type to sign extend to
4862 const Twine &NameStr = "", ///< A name for the new instruction
4863 InsertPosition InsertBefore =
4864 nullptr ///< Where to insert the new instruction
4865 );
4866
4867 /// Methods for support type inquiry through isa, cast, and dyn_cast:
4868 static bool classof(const Instruction *I) {
4869 return I->getOpcode() == SExt;
4870 }
4871 static bool classof(const Value *V) {
4873 }
4874};
4875
4876//===----------------------------------------------------------------------===//
4877// FPTruncInst Class
4878//===----------------------------------------------------------------------===//
4879
4880/// This class represents a truncation of floating point types.
4881class FPTruncInst : public CastInst {
4882protected:
4883 // Note: Instruction needs to be a friend here to call cloneImpl.
4884 friend class Instruction;
4885
4886 /// Clone an identical FPTruncInst
4888
4889public: /// Constructor with insert-before-instruction semantics
4890 LLVM_ABI
4891 FPTruncInst(Value *S, ///< The value to be truncated
4892 Type *Ty, ///< The type to truncate to
4893 const Twine &NameStr = "", ///< A name for the new instruction
4894 InsertPosition InsertBefore =
4895 nullptr ///< Where to insert the new instruction
4896 );
4897
4898 /// Methods for support type inquiry through isa, cast, and dyn_cast:
4899 static bool classof(const Instruction *I) {
4900 return I->getOpcode() == FPTrunc;
4901 }
4902 static bool classof(const Value *V) {
4904 }
4905};
4906
4907//===----------------------------------------------------------------------===//
4908// FPExtInst Class
4909//===----------------------------------------------------------------------===//
4910
4911/// This class represents an extension of floating point types.
4912class FPExtInst : public CastInst {
4913protected:
4914 // Note: Instruction needs to be a friend here to call cloneImpl.
4915 friend class Instruction;
4916
4917 /// Clone an identical FPExtInst
4918 LLVM_ABI FPExtInst *cloneImpl() const;
4919
4920public:
4921 /// Constructor with insert-before-instruction semantics
4922 LLVM_ABI
4923 FPExtInst(Value *S, ///< The value to be extended
4924 Type *Ty, ///< The type to extend to
4925 const Twine &NameStr = "", ///< A name for the new instruction
4926 InsertPosition InsertBefore =
4927 nullptr ///< Where to insert the new instruction
4928 );
4929
4930 /// Methods for support type inquiry through isa, cast, and dyn_cast:
4931 static bool classof(const Instruction *I) {
4932 return I->getOpcode() == FPExt;
4933 }
4934 static bool classof(const Value *V) {
4936 }
4937};
4938
4939//===----------------------------------------------------------------------===//
4940// UIToFPInst Class
4941//===----------------------------------------------------------------------===//
4942
4943/// This class represents a cast unsigned integer to floating point.
4944class UIToFPInst : public CastInst {
4945protected:
4946 // Note: Instruction needs to be a friend here to call cloneImpl.
4947 friend class Instruction;
4948
4949 /// Clone an identical UIToFPInst
4950 LLVM_ABI UIToFPInst *cloneImpl() const;
4951
4952public:
4953 /// Constructor with insert-before-instruction semantics
4954 LLVM_ABI
4955 UIToFPInst(Value *S, ///< The value to be converted
4956 Type *Ty, ///< The type to convert to
4957 const Twine &NameStr = "", ///< A name for the new instruction
4958 InsertPosition InsertBefore =
4959 nullptr ///< Where to insert the new instruction
4960 );
4961
4962 /// Methods for support type inquiry through isa, cast, and dyn_cast:
4963 static bool classof(const Instruction *I) {
4964 return I->getOpcode() == UIToFP;
4965 }
4966 static bool classof(const Value *V) {
4968 }
4969};
4970
4971//===----------------------------------------------------------------------===//
4972// SIToFPInst Class
4973//===----------------------------------------------------------------------===//
4974
4975/// This class represents a cast from signed integer to floating point.
4976class SIToFPInst : public CastInst {
4977protected:
4978 // Note: Instruction needs to be a friend here to call cloneImpl.
4979 friend class Instruction;
4980
4981 /// Clone an identical SIToFPInst
4982 LLVM_ABI SIToFPInst *cloneImpl() const;
4983
4984public:
4985 /// Constructor with insert-before-instruction semantics
4986 LLVM_ABI
4987 SIToFPInst(Value *S, ///< The value to be converted
4988 Type *Ty, ///< The type to convert to
4989 const Twine &NameStr = "", ///< A name for the new instruction
4990 InsertPosition InsertBefore =
4991 nullptr ///< Where to insert the new instruction
4992 );
4993
4994 /// Methods for support type inquiry through isa, cast, and dyn_cast:
4995 static bool classof(const Instruction *I) {
4996 return I->getOpcode() == SIToFP;
4997 }
4998 static bool classof(const Value *V) {
5000 }
5001};
5002
5003//===----------------------------------------------------------------------===//
5004// FPToUIInst Class
5005//===----------------------------------------------------------------------===//
5006
5007/// This class represents a cast from floating point to unsigned integer
5008class FPToUIInst : public CastInst {
5009protected:
5010 // Note: Instruction needs to be a friend here to call cloneImpl.
5011 friend class Instruction;
5012
5013 /// Clone an identical FPToUIInst
5014 LLVM_ABI FPToUIInst *cloneImpl() const;
5015
5016public:
5017 /// Constructor with insert-before-instruction semantics
5018 LLVM_ABI
5019 FPToUIInst(Value *S, ///< The value to be converted
5020 Type *Ty, ///< The type to convert to
5021 const Twine &NameStr = "", ///< A name for the new instruction
5022 InsertPosition InsertBefore =
5023 nullptr ///< Where to insert the new instruction
5024 );
5025
5026 /// Methods for support type inquiry through isa, cast, and dyn_cast:
5027 static bool classof(const Instruction *I) {
5028 return I->getOpcode() == FPToUI;
5029 }
5030 static bool classof(const Value *V) {
5032 }
5033};
5034
5035//===----------------------------------------------------------------------===//
5036// FPToSIInst Class
5037//===----------------------------------------------------------------------===//
5038
5039/// This class represents a cast from floating point to signed integer.
5040class FPToSIInst : public CastInst {
5041protected:
5042 // Note: Instruction needs to be a friend here to call cloneImpl.
5043 friend class Instruction;
5044
5045 /// Clone an identical FPToSIInst
5046 LLVM_ABI FPToSIInst *cloneImpl() const;
5047
5048public:
5049 /// Constructor with insert-before-instruction semantics
5050 LLVM_ABI
5051 FPToSIInst(Value *S, ///< The value to be converted
5052 Type *Ty, ///< The type to convert to
5053 const Twine &NameStr = "", ///< A name for the new instruction
5054 InsertPosition InsertBefore =
5055 nullptr ///< Where to insert the new instruction
5056 );
5057
5058 /// Methods for support type inquiry through isa, cast, and dyn_cast:
5059 static bool classof(const Instruction *I) {
5060 return I->getOpcode() == FPToSI;
5061 }
5062 static bool classof(const Value *V) {
5064 }
5065};
5066
5067//===----------------------------------------------------------------------===//
5068// IntToPtrInst Class
5069//===----------------------------------------------------------------------===//
5070
5071/// This class represents a cast from an integer to a pointer.
5072class IntToPtrInst : public CastInst {
5073public:
5074 // Note: Instruction needs to be a friend here to call cloneImpl.
5075 friend class Instruction;
5076
5077 /// Constructor with insert-before-instruction semantics
5078 LLVM_ABI
5079 IntToPtrInst(Value *S, ///< The value to be converted
5080 Type *Ty, ///< The type to convert to
5081 const Twine &NameStr = "", ///< A name for the new instruction
5082 InsertPosition InsertBefore =
5083 nullptr ///< Where to insert the new instruction
5084 );
5085
5086 /// Clone an identical IntToPtrInst.
5088
5089 /// Returns the address space of this instruction's pointer type.
5090 unsigned getAddressSpace() const {
5091 return getType()->getPointerAddressSpace();
5092 }
5093
5094 // Methods for support type inquiry through isa, cast, and dyn_cast:
5095 static bool classof(const Instruction *I) {
5096 return I->getOpcode() == IntToPtr;
5097 }
5098 static bool classof(const Value *V) {
5100 }
5101};
5102
5103//===----------------------------------------------------------------------===//
5104// PtrToIntInst Class
5105//===----------------------------------------------------------------------===//
5106
5107/// This class represents a cast from a pointer to an integer.
5108class PtrToIntInst : public CastInst {
5109protected:
5110 // Note: Instruction needs to be a friend here to call cloneImpl.
5111 friend class Instruction;
5112
5113 /// Clone an identical PtrToIntInst.
5115
5116public:
5117 /// Constructor with insert-before-instruction semantics
5118 LLVM_ABI
5119 PtrToIntInst(Value *S, ///< The value to be converted
5120 Type *Ty, ///< The type to convert to
5121 const Twine &NameStr = "", ///< A name for the new instruction
5122 InsertPosition InsertBefore =
5123 nullptr ///< Where to insert the new instruction
5124 );
5125
5126 /// Gets the pointer operand.
5128 /// Gets the pointer operand.
5129 const Value *getPointerOperand() const { return getOperand(0); }
5130 /// Gets the operand index of the pointer operand.
5131 static unsigned getPointerOperandIndex() { return 0U; }
5132
5133 /// Returns the address space of the pointer operand.
5134 unsigned getPointerAddressSpace() const {
5136 }
5137
5138 // Methods for support type inquiry through isa, cast, and dyn_cast:
5139 static bool classof(const Instruction *I) {
5140 return I->getOpcode() == PtrToInt;
5141 }
5142 static bool classof(const Value *V) {
5144 }
5145};
5146
5147/// This class represents a cast from a pointer to an address (non-capturing
5148/// ptrtoint).
5149class PtrToAddrInst : public CastInst {
5150protected:
5151 // Note: Instruction needs to be a friend here to call cloneImpl.
5152 friend class Instruction;
5153
5154 /// Clone an identical PtrToAddrInst.
5155 PtrToAddrInst *cloneImpl() const;
5156
5157public:
5158 /// Constructor with insert-before-instruction semantics
5159 PtrToAddrInst(Value *S, ///< The value to be converted
5160 Type *Ty, ///< The type to convert to
5161 const Twine &NameStr = "", ///< A name for the new instruction
5162 InsertPosition InsertBefore =
5163 nullptr ///< Where to insert the new instruction
5164 );
5165
5166 /// Gets the pointer operand.
5168 /// Gets the pointer operand.
5169 const Value *getPointerOperand() const { return getOperand(0); }
5170 /// Gets the operand index of the pointer operand.
5171 static unsigned getPointerOperandIndex() { return 0U; }
5172
5173 /// Returns the address space of the pointer operand.
5174 unsigned getPointerAddressSpace() const {
5176 }
5177
5178 // Methods for support type inquiry through isa, cast, and dyn_cast:
5179 static bool classof(const Instruction *I) {
5180 return I->getOpcode() == PtrToAddr;
5181 }
5182 static bool classof(const Value *V) {
5184 }
5185};
5186
5187//===----------------------------------------------------------------------===//
5188// BitCastInst Class
5189//===----------------------------------------------------------------------===//
5190
5191/// This class represents a no-op cast from one type to another.
5192class BitCastInst : public CastInst {
5193protected:
5194 // Note: Instruction needs to be a friend here to call cloneImpl.
5195 friend class Instruction;
5196
5197 /// Clone an identical BitCastInst.
5199
5200public:
5201 /// Constructor with insert-before-instruction semantics
5202 LLVM_ABI
5203 BitCastInst(Value *S, ///< The value to be casted
5204 Type *Ty, ///< The type to casted to
5205 const Twine &NameStr = "", ///< A name for the new instruction
5206 InsertPosition InsertBefore =
5207 nullptr ///< Where to insert the new instruction
5208 );
5209
5210 // Methods for support type inquiry through isa, cast, and dyn_cast:
5211 static bool classof(const Instruction *I) {
5212 return I->getOpcode() == BitCast;
5213 }
5214 static bool classof(const Value *V) {
5216 }
5217};
5218
5219//===----------------------------------------------------------------------===//
5220// AddrSpaceCastInst Class
5221//===----------------------------------------------------------------------===//
5222
5223/// This class represents a conversion between pointers from one address space
5224/// to another.
5226protected:
5227 // Note: Instruction needs to be a friend here to call cloneImpl.
5228 friend class Instruction;
5229
5230 /// Clone an identical AddrSpaceCastInst.
5232
5233public:
5234 /// Constructor with insert-before-instruction semantics
5236 Value *S, ///< The value to be casted
5237 Type *Ty, ///< The type to casted to
5238 const Twine &NameStr = "", ///< A name for the new instruction
5239 InsertPosition InsertBefore =
5240 nullptr ///< Where to insert the new instruction
5241 );
5242
5243 // Methods for support type inquiry through isa, cast, and dyn_cast:
5244 static bool classof(const Instruction *I) {
5245 return I->getOpcode() == AddrSpaceCast;
5246 }
5247 static bool classof(const Value *V) {
5249 }
5250
5251 /// Gets the pointer operand.
5253 return getOperand(0);
5254 }
5255
5256 /// Gets the pointer operand.
5257 const Value *getPointerOperand() const {
5258 return getOperand(0);
5259 }
5260
5261 /// Gets the operand index of the pointer operand.
5262 static unsigned getPointerOperandIndex() {
5263 return 0U;
5264 }
5265
5266 /// Returns the address space of the pointer operand.
5267 unsigned getSrcAddressSpace() const {
5269 }
5270
5271 /// Returns the address space of the result.
5272 unsigned getDestAddressSpace() const {
5273 return getType()->getPointerAddressSpace();
5274 }
5275};
5276
5277//===----------------------------------------------------------------------===//
5278// Helper functions
5279//===----------------------------------------------------------------------===//
5280
5281/// A helper function that returns the pointer operand of a load or store
5282/// instruction. Returns nullptr if not load or store.
5283inline const Value *getLoadStorePointerOperand(const Value *V) {
5284 if (auto *Load = dyn_cast<LoadInst>(V))
5285 return Load->getPointerOperand();
5286 if (auto *Store = dyn_cast<StoreInst>(V))
5287 return Store->getPointerOperand();
5288 return nullptr;
5289}
5291 return const_cast<Value *>(
5292 getLoadStorePointerOperand(static_cast<const Value *>(V)));
5293}
5294
5295/// A helper function that returns the pointer operand of a load, store
5296/// or GEP instruction. Returns nullptr if not load, store, or GEP.
5297inline const Value *getPointerOperand(const Value *V) {
5298 if (auto *Ptr = getLoadStorePointerOperand(V))
5299 return Ptr;
5300 if (auto *Gep = dyn_cast<GetElementPtrInst>(V))
5301 return Gep->getPointerOperand();
5302 return nullptr;
5303}
5305 return const_cast<Value *>(getPointerOperand(static_cast<const Value *>(V)));
5306}
5307
5308/// A helper function that returns the alignment of load or store instruction.
5311 "Expected Load or Store instruction");
5312 if (auto *LI = dyn_cast<LoadInst>(I))
5313 return LI->getAlign();
5314 return cast<StoreInst>(I)->getAlign();
5315}
5316
5317/// A helper function that set the alignment of load or store instruction.
5318inline void setLoadStoreAlignment(Value *I, Align NewAlign) {
5320 "Expected Load or Store instruction");
5321 if (auto *LI = dyn_cast<LoadInst>(I))
5322 LI->setAlignment(NewAlign);
5323 else
5324 cast<StoreInst>(I)->setAlignment(NewAlign);
5325}
5326
5327/// A helper function that returns the address space of the pointer operand of
5328/// load or store instruction.
5329inline unsigned getLoadStoreAddressSpace(const Value *I) {
5331 "Expected Load or Store instruction");
5332 if (auto *LI = dyn_cast<LoadInst>(I))
5333 return LI->getPointerAddressSpace();
5334 return cast<StoreInst>(I)->getPointerAddressSpace();
5335}
5336
5337/// A helper function that returns the type of a load or store instruction.
5338inline Type *getLoadStoreType(const Value *I) {
5340 "Expected Load or Store instruction");
5341 if (auto *LI = dyn_cast<LoadInst>(I))
5342 return LI->getType();
5343 return cast<StoreInst>(I)->getValueOperand()->getType();
5344}
5345
5346/// A helper function that returns an atomic operation's sync scope; returns
5347/// std::nullopt if it is not an atomic operation.
5348inline std::optional<SyncScope::ID> getAtomicSyncScopeID(const Instruction *I) {
5349 if (!I->isAtomic())
5350 return std::nullopt;
5351 if (auto *AI = dyn_cast<LoadInst>(I))
5352 return AI->getSyncScopeID();
5353 if (auto *AI = dyn_cast<StoreInst>(I))
5354 return AI->getSyncScopeID();
5355 if (auto *AI = dyn_cast<FenceInst>(I))
5356 return AI->getSyncScopeID();
5357 if (auto *AI = dyn_cast<AtomicCmpXchgInst>(I))
5358 return AI->getSyncScopeID();
5359 if (auto *AI = dyn_cast<AtomicRMWInst>(I))
5360 return AI->getSyncScopeID();
5361 llvm_unreachable("unhandled atomic operation");
5362}
5363
5364/// A helper function that sets an atomic operation's sync scope.
5366 assert(I->isAtomic());
5367 if (auto *AI = dyn_cast<LoadInst>(I))
5368 AI->setSyncScopeID(SSID);
5369 else if (auto *AI = dyn_cast<StoreInst>(I))
5370 AI->setSyncScopeID(SSID);
5371 else if (auto *AI = dyn_cast<FenceInst>(I))
5372 AI->setSyncScopeID(SSID);
5373 else if (auto *AI = dyn_cast<AtomicCmpXchgInst>(I))
5374 AI->setSyncScopeID(SSID);
5375 else if (auto *AI = dyn_cast<AtomicRMWInst>(I))
5376 AI->setSyncScopeID(SSID);
5377 else
5378 llvm_unreachable("unhandled atomic operation");
5379}
5380
5381//===----------------------------------------------------------------------===//
5382// FreezeInst Class
5383//===----------------------------------------------------------------------===//
5384
5385/// This class represents a freeze function that returns random concrete
5386/// value if an operand is either a poison value or an undef value
5388protected:
5389 // Note: Instruction needs to be a friend here to call cloneImpl.
5390 friend class Instruction;
5391
5392 /// Clone an identical FreezeInst
5393 LLVM_ABI FreezeInst *cloneImpl() const;
5394
5395public:
5396 LLVM_ABI explicit FreezeInst(Value *S, const Twine &NameStr = "",
5397 InsertPosition InsertBefore = nullptr);
5398
5399 // Methods for support type inquiry through isa, cast, and dyn_cast:
5400 static inline bool classof(const Instruction *I) {
5401 return I->getOpcode() == Freeze;
5402 }
5403 static inline bool classof(const Value *V) {
5405 }
5406};
5407
5408} // end namespace llvm
5409
5410#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 Value
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:255
user_iterator_impl< const User > const_user_iterator
Definition Value.h:392
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:393
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.
@ 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 value is 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...