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