LLVM 24.0.0git
InstrTypes.h
Go to the documentation of this file.
1//===- llvm/InstrTypes.h - Important Instruction subclasses -----*- 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 defines various meta classes of instructions that exist in the VM
10// representation. Specific concrete subclasses of these may be found in the
11// i*.h files...
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_IR_INSTRTYPES_H
16#define LLVM_IR_INSTRTYPES_H
17
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/Sequence.h"
21#include "llvm/ADT/StringMap.h"
22#include "llvm/ADT/Twine.h"
24#include "llvm/IR/Attributes.h"
25#include "llvm/IR/CallingConv.h"
27#include "llvm/IR/FMF.h"
28#include "llvm/IR/Function.h"
29#include "llvm/IR/Instruction.h"
30#include "llvm/IR/LLVMContext.h"
32#include "llvm/IR/User.h"
34#include <algorithm>
35#include <cassert>
36#include <cstddef>
37#include <cstdint>
38#include <iterator>
39#include <optional>
40#include <string>
41#include <vector>
42
43namespace llvm {
44
45class StringRef;
46class Type;
47class Value;
48class ConstantRange;
49
50namespace Intrinsic {
51typedef unsigned ID;
52}
53
54/// Provide fast-math flags storage, instructions that support fast-math flags
55/// should inherit from this class.
57 friend class FPMathOperator;
58
59protected:
61};
62
63//===----------------------------------------------------------------------===//
64// UnaryInstruction Class
65//===----------------------------------------------------------------------===//
66
68 constexpr static IntrusiveOperandsAllocMarker AllocMarker{1};
69
70protected:
71 UnaryInstruction(Type *Ty, unsigned iType, Value *V,
72 InsertPosition InsertBefore = nullptr)
73 : Instruction(Ty, iType, AllocMarker, InsertBefore) {
74 Op<0>() = V;
75 }
76
77public:
78 // allocate space for exactly one operand
79 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
80 void operator delete(void *Ptr) { User::operator delete(Ptr, AllocMarker); }
81
82 /// Transparently provide more efficient getOperand methods.
84
85 // Methods for support type inquiry through isa, cast, and dyn_cast:
86 static bool classof(const Instruction *I) {
87 return I->isUnaryOp() || I->getOpcode() == Instruction::Alloca ||
88 I->getOpcode() == Instruction::Load ||
89 I->getOpcode() == Instruction::VAArg ||
90 I->getOpcode() == Instruction::ExtractValue ||
91 I->getOpcode() == Instruction::Freeze ||
92 (I->getOpcode() >= CastOpsBegin && I->getOpcode() < CastOpsEnd);
93 }
94 static bool classof(const Value *V) {
96 }
97};
98
99template <>
101 public FixedNumOperandTraits<UnaryInstruction, 1> {
102};
103
105
106//===----------------------------------------------------------------------===//
107// UnaryOperator Class
108//===----------------------------------------------------------------------===//
109
111 void AssertOK();
112
113protected:
114 LLVM_ABI UnaryOperator(UnaryOps iType, Value *S, Type *Ty, const Twine &Name,
115 InsertPosition InsertBefore);
116
117 // Note: Instruction needs to be a friend here to call cloneImpl.
118 friend class Instruction;
119
121
122public:
123 /// Construct a unary instruction, given the opcode and an operand.
124 /// Optionally (if InstBefore is specified) insert the instruction
125 /// into a BasicBlock right before the specified instruction. The specified
126 /// Instruction is allowed to be a dereferenced end iterator.
127 ///
129 const Twine &Name = Twine(),
130 InsertPosition InsertBefore = nullptr);
131
132 /// These methods just forward to Create, and are useful when you
133 /// statically know what type of instruction you're going to create. These
134 /// helpers just save some typing.
135#define HANDLE_UNARY_INST(N, OPC, CLASS) \
136 static UnaryOperator *Create##OPC(Value *V, const Twine &Name = "") { \
137 return Create(Instruction::OPC, V, Name); \
138 }
139#include "llvm/IR/Instruction.def"
140#define HANDLE_UNARY_INST(N, OPC, CLASS) \
141 static UnaryOperator *Create##OPC(Value *V, const Twine &Name, \
142 InsertPosition InsertBefore = nullptr) { \
143 return Create(Instruction::OPC, V, Name, InsertBefore); \
144 }
145#include "llvm/IR/Instruction.def"
146
147 static UnaryOperator *
149 const Twine &Name = "",
150 InsertPosition InsertBefore = nullptr) {
151 UnaryOperator *UO = Create(Opc, V, Name, InsertBefore);
152 UO->copyIRFlags(CopyO);
153 return UO;
154 }
155
157 const Twine &Name = "",
158 InsertPosition InsertBefore = nullptr) {
159 return CreateWithCopiedFlags(Instruction::FNeg, Op, FMFSource, Name,
160 InsertBefore);
161 }
162
164 return static_cast<UnaryOps>(Instruction::getOpcode());
165 }
166
167 // Methods for support type inquiry through isa, cast, and dyn_cast:
168 static bool classof(const Instruction *I) {
169 return I->isUnaryOp();
170 }
171 static bool classof(const Value *V) {
173 }
174};
175
176/// Unary operators support fast-math flags, users should not use this
177/// class directly, Unary can create instructions with correct type
178/// automatically.
180 // Note: Instruction needs to be a friend here to call cloneImpl.
181 friend class Instruction;
182 friend class UnaryOperator;
184
186
187public:
188 // Methods for support type inquiry through isa, cast, and dyn_cast:
189 static bool classof(const Instruction *I) {
190 switch (I->getOpcode()) {
191 case Instruction::FNeg:
192 return true;
193 default:
194 return false;
195 }
196 }
197 static bool classof(const Value *V) {
199 }
200};
201
202//===----------------------------------------------------------------------===//
203// BinaryOperator Class
204//===----------------------------------------------------------------------===//
205
207 constexpr static IntrusiveOperandsAllocMarker AllocMarker{2};
208
209 void AssertOK();
210
211protected:
213 const Twine &Name, InsertPosition InsertBefore);
214
215 // Note: Instruction needs to be a friend here to call cloneImpl.
216 friend class Instruction;
217
219
220public:
221 // allocate space for exactly two operands
222 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
223 void operator delete(void *Ptr) { User::operator delete(Ptr, AllocMarker); }
224
225 /// Transparently provide more efficient getOperand methods.
227
228 /// Construct a binary instruction, given the opcode and the two
229 /// operands. Optionally (if InstBefore is specified) insert the instruction
230 /// into a BasicBlock right before the specified instruction. The specified
231 /// Instruction is allowed to be a dereferenced end iterator.
232 ///
234 const Twine &Name = Twine(),
235 InsertPosition InsertBefore = nullptr);
236
237 /// These methods just forward to Create, and are useful when you
238 /// statically know what type of instruction you're going to create. These
239 /// helpers just save some typing.
240#define HANDLE_BINARY_INST(N, OPC, CLASS) \
241 static BinaryOperator *Create##OPC(Value *V1, Value *V2, \
242 const Twine &Name = "") { \
243 return Create(Instruction::OPC, V1, V2, Name); \
244 }
245#include "llvm/IR/Instruction.def"
246#define HANDLE_BINARY_INST(N, OPC, CLASS) \
247 static BinaryOperator *Create##OPC(Value *V1, Value *V2, const Twine &Name, \
248 InsertPosition InsertBefore) { \
249 return Create(Instruction::OPC, V1, V2, Name, InsertBefore); \
250 }
251#include "llvm/IR/Instruction.def"
252
253 static BinaryOperator *
255 const Twine &Name = "",
256 InsertPosition InsertBefore = nullptr) {
257 BinaryOperator *BO = Create(Opc, V1, V2, Name, InsertBefore);
258 BO->copyIRFlags(CopyO);
259 return BO;
260 }
261
263 FastMathFlags FMF,
264 const Twine &Name = "",
265 InsertPosition InsertBefore = nullptr) {
266 BinaryOperator *BO = Create(Opc, V1, V2, Name, InsertBefore);
267 BO->setFastMathFlags(FMF);
268 return BO;
269 }
270
272 const Twine &Name = "") {
273 return CreateWithFMF(Instruction::FAdd, V1, V2, FMF, Name);
274 }
276 const Twine &Name = "") {
277 return CreateWithFMF(Instruction::FSub, V1, V2, FMF, Name);
278 }
280 const Twine &Name = "") {
281 return CreateWithFMF(Instruction::FMul, V1, V2, FMF, Name);
282 }
284 const Twine &Name = "") {
285 return CreateWithFMF(Instruction::FDiv, V1, V2, FMF, Name);
286 }
287
290 const Twine &Name = "") {
291 return CreateWithCopiedFlags(Instruction::FAdd, V1, V2, FMFSource, Name);
292 }
295 const Twine &Name = "") {
296 return CreateWithCopiedFlags(Instruction::FSub, V1, V2, FMFSource, Name);
297 }
300 const Twine &Name = "") {
301 return CreateWithCopiedFlags(Instruction::FMul, V1, V2, FMFSource, Name);
302 }
305 const Twine &Name = "") {
306 return CreateWithCopiedFlags(Instruction::FDiv, V1, V2, FMFSource, Name);
307 }
310 const Twine &Name = "") {
311 return CreateWithCopiedFlags(Instruction::FRem, V1, V2, FMFSource, Name);
312 }
313
315 const Twine &Name = "") {
316 BinaryOperator *BO = Create(Opc, V1, V2, Name);
317 BO->setHasNoSignedWrap(true);
318 return BO;
319 }
320
322 const Twine &Name,
323 InsertPosition InsertBefore) {
324 BinaryOperator *BO = Create(Opc, V1, V2, Name, InsertBefore);
325 BO->setHasNoSignedWrap(true);
326 return BO;
327 }
328
330 const Twine &Name = "") {
331 BinaryOperator *BO = Create(Opc, V1, V2, Name);
332 BO->setHasNoUnsignedWrap(true);
333 return BO;
334 }
335
337 const Twine &Name,
338 InsertPosition InsertBefore) {
339 BinaryOperator *BO = Create(Opc, V1, V2, Name, InsertBefore);
340 BO->setHasNoUnsignedWrap(true);
341 return BO;
342 }
343
345 const Twine &Name = "") {
346 BinaryOperator *BO = Create(Opc, V1, V2, Name);
347 BO->setIsExact(true);
348 return BO;
349 }
350
352 const Twine &Name,
353 InsertPosition InsertBefore) {
354 BinaryOperator *BO = Create(Opc, V1, V2, Name, InsertBefore);
355 BO->setIsExact(true);
356 return BO;
357 }
358
359 static inline BinaryOperator *
360 CreateDisjoint(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name = "");
361 static inline BinaryOperator *CreateDisjoint(BinaryOps Opc, Value *V1,
362 Value *V2, const Twine &Name,
363 InsertPosition InsertBefore);
364
365#define DEFINE_HELPERS(OPC, NUWNSWEXACT) \
366 static BinaryOperator *Create##NUWNSWEXACT##OPC(Value *V1, Value *V2, \
367 const Twine &Name = "") { \
368 return Create##NUWNSWEXACT(Instruction::OPC, V1, V2, Name); \
369 } \
370 static BinaryOperator *Create##NUWNSWEXACT##OPC( \
371 Value *V1, Value *V2, const Twine &Name, \
372 InsertPosition InsertBefore = nullptr) { \
373 return Create##NUWNSWEXACT(Instruction::OPC, V1, V2, Name, InsertBefore); \
374 }
375
376 DEFINE_HELPERS(Add, NSW) // CreateNSWAdd
377 DEFINE_HELPERS(Add, NUW) // CreateNUWAdd
378 DEFINE_HELPERS(Sub, NSW) // CreateNSWSub
379 DEFINE_HELPERS(Sub, NUW) // CreateNUWSub
380 DEFINE_HELPERS(Mul, NSW) // CreateNSWMul
381 DEFINE_HELPERS(Mul, NUW) // CreateNUWMul
382 DEFINE_HELPERS(Shl, NSW) // CreateNSWShl
383 DEFINE_HELPERS(Shl, NUW) // CreateNUWShl
384
385 DEFINE_HELPERS(SDiv, Exact) // CreateExactSDiv
386 DEFINE_HELPERS(UDiv, Exact) // CreateExactUDiv
387 DEFINE_HELPERS(AShr, Exact) // CreateExactAShr
388 DEFINE_HELPERS(LShr, Exact) // CreateExactLShr
389
390 DEFINE_HELPERS(Or, Disjoint) // CreateDisjointOr
391
392#undef DEFINE_HELPERS
393
394 /// Helper functions to construct and inspect unary operations (NEG and NOT)
395 /// via binary operators SUB and XOR:
396 ///
397 /// Create the NEG and NOT instructions out of SUB and XOR instructions.
398 ///
399 LLVM_ABI static BinaryOperator *
400 CreateNeg(Value *Op, const Twine &Name = "",
401 InsertPosition InsertBefore = nullptr);
402 LLVM_ABI static BinaryOperator *
403 CreateNSWNeg(Value *Op, const Twine &Name = "",
404 InsertPosition InsertBefore = nullptr);
405 LLVM_ABI static BinaryOperator *
406 CreateNot(Value *Op, const Twine &Name = "",
407 InsertPosition InsertBefore = nullptr);
408
410 return static_cast<BinaryOps>(Instruction::getOpcode());
411 }
412
413 /// Exchange the two operands to this instruction.
414 /// This instruction is safe to use on any binary instruction and
415 /// does not modify the semantics of the instruction. If the instruction
416 /// cannot be reversed (ie, it's a Div), then return true.
417 ///
418 LLVM_ABI bool swapOperands();
419
420 // Methods for support type inquiry through isa, cast, and dyn_cast:
421 static bool classof(const Instruction *I) {
422 return I->isBinaryOp();
423 }
424 static bool classof(const Value *V) {
426 }
427};
428
429template <>
431 public FixedNumOperandTraits<BinaryOperator, 2> {
432};
433
435
436/// An or instruction, which can be marked as "disjoint", indicating that the
437/// inputs don't have a 1 in the same bit position. Meaning this instruction
438/// can also be treated as an add.
440public:
441 enum { IsDisjoint = (1 << 0) };
442
447
448 bool isDisjoint() const { return SubclassOptionalData & IsDisjoint; }
449
450 static bool classof(const Instruction *I) {
451 return I->getOpcode() == Instruction::Or;
452 }
453
454 static bool classof(const Value *V) {
456 }
457};
458
460 Value *V2, const Twine &Name) {
461 BinaryOperator *BO = Create(Opc, V1, V2, Name);
462 cast<PossiblyDisjointInst>(BO)->setIsDisjoint(true);
463 return BO;
464}
466 Value *V2, const Twine &Name,
467 InsertPosition InsertBefore) {
468 BinaryOperator *BO = Create(Opc, V1, V2, Name, InsertBefore);
469 cast<PossiblyDisjointInst>(BO)->setIsDisjoint(true);
470 return BO;
471}
472
473/// Binary operators support fast-math flags, users should not use this
474/// class directly, BinaryOperator can create instructions with correct type
475/// automatically.
477 // Note: Instruction needs to be a friend here to call cloneImpl.
478 friend class Instruction;
479 friend class BinaryOperator;
482
483public:
484 static bool classof(const Instruction *I) {
485 switch (I->getOpcode()) {
486 case Instruction::FAdd:
487 case Instruction::FSub:
488 case Instruction::FMul:
489 case Instruction::FDiv:
490 case Instruction::FRem:
491 return true;
492 default:
493 return false;
494 }
495 }
496
497 static bool classof(const Value *V) {
499 }
500};
501
502//===----------------------------------------------------------------------===//
503// CastInst Class
504//===----------------------------------------------------------------------===//
505
506/// This is the base class for all instructions that perform data
507/// casts. It is simply provided so that instruction category testing
508/// can be performed with code like:
509///
510/// if (isa<CastInst>(Instr)) { ... }
511/// Base class of casting instructions.
513protected:
514 /// Constructor with insert-before-instruction semantics for subclasses
515 CastInst(Type *Ty, unsigned iType, Value *S, const Twine &NameStr = "",
516 InsertPosition InsertBefore = nullptr)
517 : UnaryInstruction(Ty, iType, S, InsertBefore) {
518 setName(NameStr);
519 }
520
521public:
522 /// Provides a way to construct any of the CastInst subclasses using an
523 /// opcode instead of the subclass's constructor. The opcode must be in the
524 /// CastOps category (Instruction::isCast(opcode) returns true). This
525 /// constructor has insert-before-instruction semantics to automatically
526 /// insert the new CastInst before InsertBefore (if it is non-null).
527 /// Construct any of the CastInst subclasses
528 LLVM_ABI static CastInst *Create(
529 Instruction::CastOps, ///< The opcode of the cast instruction
530 Value *S, ///< The value to be casted (operand 0)
531 Type *Ty, ///< The type to which cast should be made
532 const Twine &Name = "", ///< Name for the instruction
533 InsertPosition InsertBefore = nullptr ///< Place to insert the instruction
534 );
535
536 /// Create a ZExt or BitCast cast instruction
538 Value *S, ///< The value to be casted (operand 0)
539 Type *Ty, ///< The type to which cast should be made
540 const Twine &Name = "", ///< Name for the instruction
541 InsertPosition InsertBefore = nullptr ///< Place to insert the instruction
542 );
543
544 /// Create a SExt or BitCast cast instruction
546 Value *S, ///< The value to be casted (operand 0)
547 Type *Ty, ///< The type to which cast should be made
548 const Twine &Name = "", ///< Name for the instruction
549 InsertPosition InsertBefore = nullptr ///< Place to insert the instruction
550 );
551
552 /// Create a BitCast, AddrSpaceCast or a PtrToInt cast instruction.
554 Value *S, ///< The pointer value to be casted (operand 0)
555 Type *Ty, ///< The type to which cast should be made
556 const Twine &Name = "", ///< Name for the instruction
557 InsertPosition InsertBefore = nullptr ///< Place to insert the instruction
558 );
559
560 /// Create a BitCast or an AddrSpaceCast cast instruction.
562 Value *S, ///< The pointer value to be casted (operand 0)
563 Type *Ty, ///< The type to which cast should be made
564 const Twine &Name = "", ///< Name for the instruction
565 InsertPosition InsertBefore = nullptr ///< Place to insert the instruction
566 );
567
568 /// Create a BitCast, a PtrToInt, or an IntToPTr cast instruction.
569 ///
570 /// If the value is a pointer type and the destination an integer type,
571 /// creates a PtrToInt cast. If the value is an integer type and the
572 /// destination a pointer type, creates an IntToPtr cast. Otherwise, creates
573 /// a bitcast.
575 Value *S, ///< The pointer value to be casted (operand 0)
576 Type *Ty, ///< The type to which cast should be made
577 const Twine &Name = "", ///< Name for the instruction
578 InsertPosition InsertBefore = nullptr ///< Place to insert the instruction
579 );
580
581 /// Create a ZExt, BitCast, or Trunc for int -> int casts.
583 Value *S, ///< The pointer value to be casted (operand 0)
584 Type *Ty, ///< The type to which cast should be made
585 bool isSigned, ///< Whether to regard S as signed or not
586 const Twine &Name = "", ///< Name for the instruction
587 InsertPosition InsertBefore = nullptr ///< Place to insert the instruction
588 );
589
590 /// Create an FPExt, BitCast, or FPTrunc for fp -> fp casts
592 Value *S, ///< The floating point value to be casted
593 Type *Ty, ///< The floating point type to cast to
594 const Twine &Name = "", ///< Name for the instruction
595 InsertPosition InsertBefore = nullptr ///< Place to insert the instruction
596 );
597
598 /// Create a Trunc or BitCast cast instruction
600 Value *S, ///< The value to be casted (operand 0)
601 Type *Ty, ///< The type to which cast should be made
602 const Twine &Name = "", ///< Name for the instruction
603 InsertPosition InsertBefore = nullptr ///< Place to insert the instruction
604 );
605
606 /// Check whether a bitcast between these types is valid
607 LLVM_ABI static bool
608 isBitCastable(Type *SrcTy, ///< The Type from which the value should be cast.
609 Type *DestTy ///< The Type to which the value should be cast.
610 );
611
612 /// Check whether a bitcast, inttoptr, or ptrtoint cast between these
613 /// types is valid and a no-op.
614 ///
615 /// This ensures that any pointer<->integer cast has enough bits in the
616 /// integer and any other cast is a bitcast.
618 Type *SrcTy, ///< The Type from which the value should be cast.
619 Type *DestTy, ///< The Type to which the value should be cast.
620 const DataLayout &DL);
621
622 /// Returns the opcode necessary to cast Val into Ty using usual casting
623 /// rules.
624 /// Infer the opcode for cast operand and type
626 getCastOpcode(const Value *Val, ///< The value to cast
627 bool SrcIsSigned, ///< Whether to treat the source as signed
628 Type *Ty, ///< The Type to which the value should be casted
629 bool DstIsSigned ///< Whether to treate the dest. as signed
630 );
631
632 /// There are several places where we need to know if a cast instruction
633 /// only deals with integer source and destination types. To simplify that
634 /// logic, this method is provided.
635 /// @returns true iff the cast has only integral typed operand and dest type.
636 /// Determine if this is an integer-only cast.
637 LLVM_ABI bool isIntegerCast() const;
638
639 /// A no-op cast is one that can be effected without changing any bits.
640 /// It implies that the source and destination types are the same size. The
641 /// DataLayout argument is to determine the pointer size when examining casts
642 /// involving Integer and Pointer types. They are no-op casts if the integer
643 /// is the same size as the pointer. However, pointer size varies with
644 /// platform. Note that a precondition of this method is that the cast is
645 /// legal - i.e. the instruction formed with these operands would verify.
646 LLVM_ABI static bool
647 isNoopCast(Instruction::CastOps Opcode, ///< Opcode of cast
648 Type *SrcTy, ///< SrcTy of cast
649 Type *DstTy, ///< DstTy of cast
650 const DataLayout &DL ///< DataLayout to get the Int Ptr type from.
651 );
652
653 /// Determine if this cast is a no-op cast.
654 ///
655 /// \param DL is the DataLayout to determine pointer size.
656 LLVM_ABI bool isNoopCast(const DataLayout &DL) const;
657
658 /// Determine how a pair of casts can be eliminated, if they can be at all.
659 /// This is a helper function for both CastInst and ConstantExpr.
660 /// @returns 0 if the CastInst pair can't be eliminated, otherwise
661 /// returns Instruction::CastOps value for a cast that can replace
662 /// the pair, casting SrcTy to DstTy.
663 /// Determine if a cast pair is eliminable
664 LLVM_ABI static unsigned isEliminableCastPair(
665 Instruction::CastOps firstOpcode, ///< Opcode of first cast
666 Instruction::CastOps secondOpcode, ///< Opcode of second cast
667 Type *SrcTy, ///< SrcTy of 1st cast
668 Type *MidTy, ///< DstTy of 1st cast & SrcTy of 2nd cast
669 Type *DstTy, ///< DstTy of 2nd cast
670 const DataLayout *DL ///< Optional data layout
671 );
672
673 /// Return the opcode of this CastInst
677
678 /// Return the source type, as a convenience
679 Type* getSrcTy() const { return getOperand(0)->getType(); }
680 /// Return the destination type, as a convenience
681 Type* getDestTy() const { return getType(); }
682
683 /// This method can be used to determine if a cast from SrcTy to DstTy using
684 /// Opcode op is valid or not.
685 /// @returns true iff the proposed cast is valid.
686 /// Determine if a cast is valid without creating one.
687 LLVM_ABI static bool castIsValid(Instruction::CastOps op, Type *SrcTy,
688 Type *DstTy);
689 static bool castIsValid(Instruction::CastOps op, Value *S, Type *DstTy) {
690 return castIsValid(op, S->getType(), DstTy);
691 }
692
693 /// Methods for support type inquiry through isa, cast, and dyn_cast:
694 static bool classof(const Instruction *I) {
695 return I->isCast();
696 }
697 static bool classof(const Value *V) {
699 }
700};
701
702/// Instruction that can have a nneg flag (zext/uitofp).
704public:
705 enum { NonNeg = (1 << 0) };
706
707 static bool classof(const Instruction *I) {
708 switch (I->getOpcode()) {
709 case Instruction::ZExt:
710 case Instruction::UIToFP:
711 return true;
712 default:
713 return false;
714 }
715 }
716
717 static bool classof(const Value *V) {
719 }
720};
721
722//===----------------------------------------------------------------------===//
723// CmpInst Class
724//===----------------------------------------------------------------------===//
725
726/// This class is the base class for the comparison instructions.
727/// Abstract base class of comparison instructions.
728class CmpInst : public Instruction {
729 constexpr static IntrusiveOperandsAllocMarker AllocMarker{2};
730
731public:
732 /// This enumeration lists the possible predicates for CmpInst subclasses.
733 /// Values in the range 0-31 are reserved for FCmpInst, while values in the
734 /// range 32-64 are reserved for ICmpInst. This is necessary to ensure the
735 /// predicate values are not overlapping between the classes.
736 ///
737 /// Some passes (e.g. InstCombine) depend on the bit-wise characteristics of
738 /// FCMP_* values. Changing the bit patterns requires a potential change to
739 /// those passes.
740 enum Predicate : unsigned {
741 // Opcode U L G E Intuitive operation
742 FCMP_FALSE = 0, ///< 0 0 0 0 Always false (always folded)
743 FCMP_OEQ = 1, ///< 0 0 0 1 True if ordered and equal
744 FCMP_OGT = 2, ///< 0 0 1 0 True if ordered and greater than
745 FCMP_OGE = 3, ///< 0 0 1 1 True if ordered and greater than or equal
746 FCMP_OLT = 4, ///< 0 1 0 0 True if ordered and less than
747 FCMP_OLE = 5, ///< 0 1 0 1 True if ordered and less than or equal
748 FCMP_ONE = 6, ///< 0 1 1 0 True if ordered and operands are unequal
749 FCMP_ORD = 7, ///< 0 1 1 1 True if ordered (no nans)
750 FCMP_UNO = 8, ///< 1 0 0 0 True if unordered: isnan(X) | isnan(Y)
751 FCMP_UEQ = 9, ///< 1 0 0 1 True if unordered or equal
752 FCMP_UGT = 10, ///< 1 0 1 0 True if unordered or greater than
753 FCMP_UGE = 11, ///< 1 0 1 1 True if unordered, greater than, or equal
754 FCMP_ULT = 12, ///< 1 1 0 0 True if unordered or less than
755 FCMP_ULE = 13, ///< 1 1 0 1 True if unordered, less than, or equal
756 FCMP_UNE = 14, ///< 1 1 1 0 True if unordered or not equal
757 FCMP_TRUE = 15, ///< 1 1 1 1 Always true (always folded)
761 ICMP_EQ = 32, ///< equal
762 ICMP_NE = 33, ///< not equal
763 ICMP_UGT = 34, ///< unsigned greater than
764 ICMP_UGE = 35, ///< unsigned greater or equal
765 ICMP_ULT = 36, ///< unsigned less than
766 ICMP_ULE = 37, ///< unsigned less or equal
767 ICMP_SGT = 38, ///< signed greater than
768 ICMP_SGE = 39, ///< signed greater or equal
769 ICMP_SLT = 40, ///< signed less than
770 ICMP_SLE = 41, ///< signed less or equal
774 };
777
778 /// Returns the sequence of all FCmp predicates.
784
785 /// Returns the sequence of all ICmp predicates.
791
792protected:
794 Value *LHS, Value *RHS, const Twine &Name = "",
795 InsertPosition InsertBefore = nullptr);
796
797public:
798 // allocate space for exactly two operands
799 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
800 void operator delete(void *Ptr) { User::operator delete(Ptr, AllocMarker); }
801
802 /// Construct a compare instruction, given the opcode, the predicate and
803 /// the two operands. Optionally (if InstBefore is specified) insert the
804 /// instruction into a BasicBlock right before the specified instruction.
805 /// The specified Instruction is allowed to be a dereferenced end iterator.
806 /// Create a CmpInst
808 Value *S2, const Twine &Name = "",
809 InsertPosition InsertBefore = nullptr);
810
811 /// Construct a compare instruction, given the opcode, the predicate,
812 /// the two operands and the instruction to copy the flags from. Optionally
813 /// (if InstBefore is specified) insert the instruction into a BasicBlock
814 /// right before the specified instruction. The specified Instruction is
815 /// allowed to be a dereferenced end iterator.
816 /// Create a CmpInst
817 LLVM_ABI static CmpInst *
819 const Instruction *FlagsSource, const Twine &Name = "",
820 InsertPosition InsertBefore = nullptr);
821
822 /// Get the opcode casted to the right type
824 return static_cast<OtherOps>(Instruction::getOpcode());
825 }
826
827 /// Return the predicate for this instruction.
829
830 /// Set the predicate for this instruction to the specified value.
832
833 static bool isFPPredicate(Predicate P) {
834 static_assert(FIRST_FCMP_PREDICATE == 0,
835 "FIRST_FCMP_PREDICATE is required to be 0");
836 return P <= LAST_FCMP_PREDICATE;
837 }
838
841 }
842
844
845 bool isFPPredicate() const { return isFPPredicate(getPredicate()); }
846 bool isIntPredicate() const { return isIntPredicate(getPredicate()); }
847
848 /// For example, EQ -> NE, UGT -> ULE, SLT -> SGE,
849 /// OEQ -> UNE, UGT -> OLE, OLT -> UGE, etc.
850 /// @returns the inverse predicate for the instruction's current predicate.
851 /// Return the inverse of the instruction's predicate.
855
856 /// Returns the ordered variant of a floating point compare.
857 ///
858 /// For example, UEQ -> OEQ, ULT -> OLT, OEQ -> OEQ
860 return static_cast<Predicate>(Pred & FCMP_ORD);
861 }
862
866
867 /// Returns the unordered variant of a floating point compare.
868 ///
869 /// For example, OEQ -> UEQ, OLT -> ULT, OEQ -> UEQ
871 return static_cast<Predicate>(Pred | FCMP_UNO);
872 }
873
877
878 /// For example, EQ -> NE, UGT -> ULE, SLT -> SGE,
879 /// OEQ -> UNE, UGT -> OLE, OLT -> UGE, etc.
880 /// @returns the inverse predicate for predicate provided in \p pred.
881 /// Return the inverse of a given predicate
883
884 /// For example, EQ->EQ, SLE->SGE, ULT->UGT,
885 /// OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
886 /// @returns the predicate that would be the result of exchanging the two
887 /// operands of the CmpInst instruction without changing the result
888 /// produced.
889 /// Return the predicate as if the operands were swapped
893
894 /// This is a static version that you can use without an instruction
895 /// available.
896 /// Return the predicate as if the operands were swapped.
898
899 /// This is a static version that you can use without an instruction
900 /// available.
901 /// @returns true if the comparison predicate is strict, false otherwise.
902 LLVM_ABI static bool isStrictPredicate(Predicate predicate);
903
904 /// @returns true if the comparison predicate is strict, false otherwise.
905 /// Determine if this instruction is using an strict comparison predicate.
907
908 /// This is a static version that you can use without an instruction
909 /// available.
910 /// @returns true if the comparison predicate is non-strict, false otherwise.
911 LLVM_ABI static bool isNonStrictPredicate(Predicate predicate);
912
913 /// @returns true if the comparison predicate is non-strict, false otherwise.
914 /// Determine if this instruction is using an non-strict comparison predicate.
915 bool isNonStrictPredicate() const {
917 }
918
919 /// For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
920 /// Returns the strict version of non-strict comparisons.
924
925 /// This is a static version that you can use without an instruction
926 /// available.
927 /// @returns the strict version of comparison provided in \p pred.
928 /// If \p pred is not a strict comparison predicate, returns \p pred.
929 /// Returns the strict version of non-strict comparisons.
931
932 /// For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
933 /// Returns the non-strict version of strict comparisons.
937
938 /// This is a static version that you can use without an instruction
939 /// available.
940 /// @returns the non-strict version of comparison provided in \p pred.
941 /// If \p pred is not a strict comparison predicate, returns \p pred.
942 /// Returns the non-strict version of strict comparisons.
944
945 /// This is a static version that you can use without an instruction
946 /// available.
947 /// Return the flipped strictness of predicate
949
950 /// For predicate of kind "is X or equal to 0" returns the predicate "is X".
951 /// For predicate of kind "is X" returns the predicate "is X or equal to 0".
952 /// does not support other kind of predicates.
953 /// @returns the predicate that does not contains is equal to zero if
954 /// it had and vice versa.
955 /// Return the flipped strictness of predicate
959
960 /// Provide more efficient getOperand methods.
962
963 /// This is just a convenience that dispatches to the subclasses.
964 /// Swap the operands and adjust predicate accordingly to retain
965 /// the same comparison.
966 LLVM_ABI void swapOperands();
967
968 /// This is just a convenience that dispatches to the subclasses.
969 /// Determine if this CmpInst is commutative.
970 LLVM_ABI bool isCommutative() const;
971
972 /// Determine if this is an equals/not equals predicate.
973 /// This is a static version that you can use without an instruction
974 /// available.
975 LLVM_ABI static bool isEquality(Predicate pred);
976
977 /// Determine if this is an equals/not equals predicate.
978 bool isEquality() const { return isEquality(getPredicate()); }
979
980 /// Determine if one operand of this compare can always be replaced by the
981 /// other operand, ignoring provenance considerations. If \p Invert, check for
982 /// equivalence with the inverse predicate.
983 LLVM_ABI bool isEquivalence(bool Invert = false) const;
984
985 /// Return true if the predicate is relational (not EQ or NE).
986 static bool isRelational(Predicate P) { return !isEquality(P); }
987
988 /// Return true if the predicate is relational (not EQ or NE).
989 bool isRelational() const { return !isEquality(); }
990
991 /// @returns true if the comparison is signed, false otherwise.
992 /// Determine if this instruction is using a signed comparison.
993 bool isSigned() const {
994 return isSigned(getPredicate());
995 }
996
997 /// @returns true if the comparison is unsigned, false otherwise.
998 /// Determine if this instruction is using an unsigned comparison.
999 bool isUnsigned() const {
1000 return isUnsigned(getPredicate());
1001 }
1002
1003 /// This is just a convenience.
1004 /// Determine if this is true when both operands are the same.
1005 bool isTrueWhenEqual() const {
1006 return isTrueWhenEqual(getPredicate());
1007 }
1008
1009 /// This is just a convenience.
1010 /// Determine if this is false when both operands are the same.
1011 bool isFalseWhenEqual() const {
1013 }
1014
1015 /// @returns true if the predicate is unsigned, false otherwise.
1016 /// Determine if the predicate is an unsigned operation.
1017 static bool isUnsigned(Predicate Pred) {
1018 return Pred >= ICMP_UGT && Pred <= ICMP_ULE;
1019 }
1020
1021 /// @returns true if the predicate is signed, false otherwise.
1022 /// Determine if the predicate is an signed operation.
1023 static bool isSigned(Predicate Pred) {
1024 return Pred >= ICMP_SGT && Pred <= ICMP_SLE;
1025 }
1026
1027 /// Determine if the predicate is an ordered operation.
1028 LLVM_ABI static bool isOrdered(Predicate predicate);
1029
1030 /// Determine if the predicate is an unordered operation.
1031 LLVM_ABI static bool isUnordered(Predicate predicate);
1032
1033 /// Determine if the predicate is true when comparing a value with itself.
1034 LLVM_ABI static bool isTrueWhenEqual(Predicate predicate);
1035
1036 /// Determine if the predicate is false when comparing a value with itself.
1037 LLVM_ABI static bool isFalseWhenEqual(Predicate predicate);
1038
1039 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1040 static bool classof(const Instruction *I) {
1041 return I->getOpcode() == Instruction::ICmp ||
1042 I->getOpcode() == Instruction::FCmp;
1043 }
1044 static bool classof(const Value *V) {
1046 }
1047
1048 /// Create a result type for fcmp/icmp
1049 static Type* makeCmpResultType(Type* opnd_type) {
1050 if (VectorType* vt = dyn_cast<VectorType>(opnd_type)) {
1051 return VectorType::get(Type::getInt1Ty(opnd_type->getContext()),
1052 vt->getElementCount());
1053 }
1054 return Type::getInt1Ty(opnd_type->getContext());
1055 }
1056
1057private:
1058 // Shadow Value::setValueSubclassData with a private forwarding method so that
1059 // subclasses cannot accidentally use it.
1060 void setValueSubclassData(unsigned short D) {
1062 }
1063};
1064
1065// FIXME: these are redundant if CmpInst < BinaryOperator
1066template <>
1067struct OperandTraits<CmpInst> : public FixedNumOperandTraits<CmpInst, 2> {
1068};
1069
1071
1073
1074/// A lightweight accessor for an operand bundle meant to be passed
1075/// around by value.
1078
1079 OperandBundleUse() = default;
1082
1083 /// Return true if the operand at index \p Idx in this operand bundle
1084 /// has the attribute A.
1085 bool operandHasAttr(unsigned Idx, Attribute::AttrKind A) const {
1087 if (A == Attribute::ReadOnly)
1088 return Inputs[Idx]->getType()->isPointerTy();
1089
1090 // Conservative answer: no operands have any attributes.
1091 return false;
1092 }
1093
1094 /// Return the tag of this operand bundle as a string.
1096 return Tag->getKey();
1097 }
1098
1099 /// Return the tag of this operand bundle as an integer.
1100 ///
1101 /// Operand bundle tags are interned by LLVMContextImpl::getOrInsertBundleTag,
1102 /// and this function returns the unique integer getOrInsertBundleTag
1103 /// associated the tag of this operand bundle to.
1105 return Tag->getValue();
1106 }
1107
1108 /// Return true if this is a "deopt" operand bundle.
1110 return getTagID() == LLVMContext::OB_deopt;
1111 }
1112
1113 /// Return true if this is a "funclet" operand bundle.
1116 }
1117
1118 /// Return true if this is a "cfguardtarget" operand bundle.
1122
1123private:
1124 /// Pointer to an entry in LLVMContextImpl::getOrInsertBundleTag.
1126};
1127
1128/// A container for an operand bundle being viewed as a set of values
1129/// rather than a set of uses.
1130///
1131/// Unlike OperandBundleUse, OperandBundleDefT owns the memory it carries, and
1132/// so it is possible to create and pass around "self-contained" instances of
1133/// OperandBundleDef and ConstOperandBundleDef.
1134template <typename InputTy> class OperandBundleDefT {
1135 std::string Tag;
1136 std::vector<InputTy> Inputs;
1137
1138public:
1139 explicit OperandBundleDefT(std::string Tag, std::vector<InputTy> Inputs)
1140 : Tag(std::move(Tag)), Inputs(std::move(Inputs)) {}
1141 explicit OperandBundleDefT(std::string Tag, ArrayRef<InputTy> Inputs)
1142 : Tag(std::move(Tag)), Inputs(Inputs) {}
1143
1145 Tag = std::string(OBU.getTagName());
1146 llvm::append_range(Inputs, OBU.Inputs);
1147 }
1148
1149 ArrayRef<InputTy> inputs() const { return Inputs; }
1150
1151 using input_iterator = typename std::vector<InputTy>::const_iterator;
1152
1153 size_t input_size() const { return Inputs.size(); }
1154 input_iterator input_begin() const { return Inputs.begin(); }
1155 input_iterator input_end() const { return Inputs.end(); }
1156
1157 StringRef getTag() const { return Tag; }
1158};
1159
1160using OperandBundleDef = OperandBundleDefT<Value *>;
1162
1163//===----------------------------------------------------------------------===//
1164// CallBase Class
1165//===----------------------------------------------------------------------===//
1166
1167/// Base class for all callable instructions (InvokeInst and CallInst)
1168/// Holds everything related to calling a function.
1169///
1170/// All call-like instructions are required to use a common operand layout:
1171/// - Zero or more arguments to the call,
1172/// - Zero or more operand bundles with zero or more operand inputs each
1173/// bundle,
1174/// - Zero or more subclass controlled operands
1175/// - The called function.
1176///
1177/// This allows this base class to easily access the called function and the
1178/// start of the arguments without knowing how many other operands a particular
1179/// subclass requires. Note that accessing the end of the argument list isn't
1180/// as cheap as most other operations on the base class.
1181class CallBase : public Instruction {
1182protected:
1183 // The first two bits are reserved by CallInst for fast retrieval,
1188 static_assert(
1190 "Bitfields must be contiguous");
1191
1192 /// The last operand is the called operand.
1193 static constexpr int CalledOperandOpEndIdx = -1;
1194
1195 AttributeList Attrs; ///< parameter attributes for callable
1197
1198 template <class... ArgsTy>
1199 CallBase(AttributeList const &A, FunctionType *FT, ArgsTy &&... Args)
1200 : Instruction(std::forward<ArgsTy>(Args)...), Attrs(A), FTy(FT) {}
1201
1203
1204 bool hasDescriptor() const { return Value::HasDescriptor; }
1205
1207 switch (getOpcode()) {
1208 case Instruction::Call:
1209 return 0;
1210 case Instruction::Invoke:
1211 return 2;
1212 case Instruction::CallBr:
1214 }
1215 llvm_unreachable("Invalid opcode!");
1216 }
1217
1218 /// Get the number of extra operands for instructions that don't have a fixed
1219 /// number of extra operands.
1221
1222public:
1224
1225 /// Create a clone of \p CB with a different set of operand bundles and
1226 /// insert it before \p InsertPt.
1227 ///
1228 /// The returned call instruction is identical \p CB in every way except that
1229 /// the operand bundles for the new instruction are set to the operand bundles
1230 /// in \p Bundles.
1231 LLVM_ABI static CallBase *Create(CallBase *CB,
1233 InsertPosition InsertPt = nullptr);
1234
1235 /// Create a clone of \p CB with the operand bundle with the tag matching
1236 /// \p Bundle's tag replaced with Bundle, and insert it before \p InsertPt.
1237 ///
1238 /// The returned call instruction is identical \p CI in every way except that
1239 /// the specified operand bundle has been replaced.
1240 LLVM_ABI static CallBase *Create(CallBase *CB, OperandBundleDef Bundle,
1241 InsertPosition InsertPt = nullptr);
1242
1243 /// Create a clone of \p CB with operand bundle \p OB added.
1246 InsertPosition InsertPt = nullptr);
1247
1248 /// Create a clone of \p CB with operand bundle \p ID removed.
1249 LLVM_ABI static CallBase *
1251 InsertPosition InsertPt = nullptr);
1252
1253 LLVM_ABI static CallBase *
1255 InsertPosition InsertPtr = nullptr);
1256
1257 /// Return the convergence control token for this call, if it exists.
1260 return Bundle->Inputs[0].get();
1261 }
1262 return nullptr;
1263 }
1264
1265 static bool classof(const Instruction *I) {
1266 return I->getOpcode() == Instruction::Call ||
1267 I->getOpcode() == Instruction::Invoke ||
1268 I->getOpcode() == Instruction::CallBr;
1269 }
1270 static bool classof(const Value *V) {
1272 }
1273
1274 FunctionType *getFunctionType() const { return FTy; }
1275
1277 Value::mutateType(FTy->getReturnType());
1278 this->FTy = FTy;
1279 }
1280
1282
1283 /// data_operands_begin/data_operands_end - Return iterators iterating over
1284 /// the call / invoke argument list and bundle operands. For invokes, this is
1285 /// the set of instruction operands except the invoke target and the two
1286 /// successor blocks; and for calls this is the set of instruction operands
1287 /// except the call target.
1290 return const_cast<CallBase *>(this)->data_operands_begin();
1291 }
1293 // Walk from the end of the operands over the called operand and any
1294 // subclass operands.
1295 return op_end() - getNumSubclassExtraOperands() - 1;
1296 }
1298 return const_cast<CallBase *>(this)->data_operands_end();
1299 }
1306 bool data_operands_empty() const {
1308 }
1309 unsigned data_operands_size() const {
1310 return std::distance(data_operands_begin(), data_operands_end());
1311 }
1312
1313 bool isDataOperand(const Use *U) const {
1314 assert(this == U->getUser() &&
1315 "Only valid to query with a use of this instruction!");
1316 return data_operands_begin() <= U && U < data_operands_end();
1317 }
1319 return isDataOperand(&UI.getUse());
1320 }
1321
1322 /// Given a value use iterator, return the data operand corresponding to it.
1323 /// Iterator must actually correspond to a data operand.
1325 return getDataOperandNo(&UI.getUse());
1326 }
1327
1328 /// Given a use for a data operand, get the data operand number that
1329 /// corresponds to it.
1330 unsigned getDataOperandNo(const Use *U) const {
1331 assert(isDataOperand(U) && "Data operand # out of range!");
1332 return U - data_operands_begin();
1333 }
1334
1335 /// Return the iterator pointing to the beginning of the argument list.
1338 return const_cast<CallBase *>(this)->arg_begin();
1339 }
1340
1341 /// Return the iterator pointing to the end of the argument list.
1343 // From the end of the data operands, walk backwards past the bundle
1344 // operands.
1346 }
1348 return const_cast<CallBase *>(this)->arg_end();
1349 }
1350
1351 /// Iteration adapter for range-for loops.
1358 bool arg_empty() const { return arg_end() == arg_begin(); }
1359 unsigned arg_size() const { return arg_end() - arg_begin(); }
1360
1361 Value *getArgOperand(unsigned i) const {
1362 assert(i < arg_size() && "Out of bounds!");
1363 return getOperand(i);
1364 }
1365
1366 void setArgOperand(unsigned i, Value *v) {
1367 assert(i < arg_size() && "Out of bounds!");
1368 setOperand(i, v);
1369 }
1370
1371 /// Wrappers for getting the \c Use of a call argument.
1372 const Use &getArgOperandUse(unsigned i) const {
1373 assert(i < arg_size() && "Out of bounds!");
1374 return User::getOperandUse(i);
1375 }
1376 Use &getArgOperandUse(unsigned i) {
1377 assert(i < arg_size() && "Out of bounds!");
1378 return User::getOperandUse(i);
1379 }
1380
1381 bool isArgOperand(const Use *U) const {
1382 assert(this == U->getUser() &&
1383 "Only valid to query with a use of this instruction!");
1384 return arg_begin() <= U && U < arg_end();
1385 }
1387 return isArgOperand(&UI.getUse());
1388 }
1389
1390 /// Given a use for a arg operand, get the arg operand number that
1391 /// corresponds to it.
1392 unsigned getArgOperandNo(const Use *U) const {
1393 assert(isArgOperand(U) && "Arg operand # out of range!");
1394 return U - arg_begin();
1395 }
1396
1397 /// Given a value use iterator, return the arg operand number corresponding to
1398 /// it. Iterator must actually correspond to a data operand.
1400 return getArgOperandNo(&UI.getUse());
1401 }
1402
1403 /// Returns true if this CallSite passes the given Value* as an argument to
1404 /// the called function.
1405 bool hasArgument(const Value *V) const {
1406 return llvm::is_contained(args(), V);
1407 }
1408
1410
1413
1414 /// Returns the function called, or null if this is an indirect function
1415 /// invocation or the function signature does not match the call signature, or
1416 /// the call target is an alias.
1419 if (F->getFunctionType() == getFunctionType())
1420 return F;
1421 return nullptr;
1422 }
1423
1424 /// Return true if the callsite is an indirect call.
1425 LLVM_ABI bool isIndirectCall() const;
1426
1427 /// Determine whether the passed iterator points to the callee operand's Use.
1429 return isCallee(&UI.getUse());
1430 }
1431
1432 /// Determine whether this Use is the callee operand's Use.
1433 bool isCallee(const Use *U) const { return &getCalledOperandUse() == U; }
1434
1435 /// Helper to get the caller (the parent function).
1437 const Function *getCaller() const {
1438 return const_cast<CallBase *>(this)->getCaller();
1439 }
1440
1441 /// Tests if this call site must be tail call optimized. Only a CallInst can
1442 /// be tail call optimized.
1443 LLVM_ABI bool isMustTailCall() const;
1444
1445 /// Tests if this call site is marked as a tail call.
1446 LLVM_ABI bool isTailCall() const;
1447
1448 /// Returns the intrinsic ID of the intrinsic called or
1449 /// Intrinsic::not_intrinsic if the called function is not an intrinsic, or if
1450 /// this is an indirect call.
1452
1454
1455 /// Sets the function called, including updating the function type.
1459
1460 /// Sets the function called, including updating the function type.
1464
1465 /// Sets the function called, including updating to the specified function
1466 /// type.
1468 this->FTy = FTy;
1469 // This function doesn't mutate the return type, only the function
1470 // type. Seems broken, but I'm just gonna stick an assert in for now.
1471 assert(getType() == FTy->getReturnType());
1472 setCalledOperand(Fn);
1473 }
1474
1478
1482
1483 /// Check if this call is an inline asm statement.
1484 bool isInlineAsm() const { return isa<InlineAsm>(getCalledOperand()); }
1485
1486 /// \name Attribute API
1487 ///
1488 /// These methods access and modify attributes on this call (including
1489 /// looking through to the attributes on the called function when necessary).
1490 ///@{
1491
1492 /// Return the attributes for this call.
1494
1495 /// Set the attributes for this call.
1497
1498 /// Return the return attributes for this call.
1500 return getAttributes().getRetAttrs();
1501 }
1502
1503 /// Return the param attributes for this call.
1504 AttributeSet getParamAttributes(unsigned ArgNo) const {
1505 return getAttributes().getParamAttrs(ArgNo);
1506 }
1507
1508 /// Try to intersect the attributes from 'this' CallBase and the
1509 /// 'Other' CallBase. Sets the intersected attributes to 'this' and
1510 /// return true if successful. Doesn't modify 'this' and returns
1511 /// false if unsuccessful.
1513 if (this == Other)
1514 return true;
1516 AttributeList ALOther = Other->getAttributes();
1517 auto Intersected = AL.intersectWith(getContext(), ALOther);
1518 if (!Intersected)
1519 return false;
1520 setAttributes(*Intersected);
1521 return true;
1522 }
1523
1524 /// Determine whether this call has the given attribute. If it does not
1525 /// then determine if the called function has the attribute, but only if
1526 /// the attribute is allowed for the call.
1528 assert(Kind != Attribute::NoBuiltin &&
1529 "Use CallBase::isNoBuiltin() to check for Attribute::NoBuiltin");
1530 return hasFnAttrImpl(Kind);
1531 }
1532
1533 /// Determine whether this call has the given attribute. If it does not
1534 /// then determine if the called function has the attribute, but only if
1535 /// the attribute is allowed for the call.
1536 bool hasFnAttr(StringRef Kind) const { return hasFnAttrImpl(Kind); }
1537
1538 // TODO: remove non-AtIndex versions of these methods.
1539 /// adds the attribute to the list of attributes.
1541 Attrs = Attrs.addAttributeAtIndex(getContext(), i, Kind);
1542 }
1543
1544 /// adds the attribute to the list of attributes.
1545 void addAttributeAtIndex(unsigned i, Attribute Attr) {
1546 Attrs = Attrs.addAttributeAtIndex(getContext(), i, Attr);
1547 }
1548
1549 /// Adds the attribute to the function.
1551 Attrs = Attrs.addFnAttribute(getContext(), Kind);
1552 }
1553
1554 /// Adds the attribute to the function.
1556 Attrs = Attrs.addFnAttribute(getContext(), Attr);
1557 }
1558
1559 /// Adds the attribute to the return value.
1561 Attrs = Attrs.addRetAttribute(getContext(), Kind);
1562 }
1563
1564 /// Adds the attribute to the return value.
1566 Attrs = Attrs.addRetAttribute(getContext(), Attr);
1567 }
1568
1569 /// Adds attributes to the return value.
1570 void addRetAttrs(const AttrBuilder &B) {
1571 Attrs = Attrs.addRetAttributes(getContext(), B);
1572 }
1573
1574 /// Adds the attribute to the indicated argument
1575 void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) {
1576 assert(ArgNo < arg_size() && "Out of bounds");
1577 Attrs = Attrs.addParamAttribute(getContext(), ArgNo, Kind);
1578 }
1579
1580 /// Adds the attribute to the indicated argument
1581 void addParamAttr(unsigned ArgNo, Attribute Attr) {
1582 assert(ArgNo < arg_size() && "Out of bounds");
1583 Attrs = Attrs.addParamAttribute(getContext(), ArgNo, Attr);
1584 }
1585
1586 /// Adds attributes to the indicated argument
1587 void addParamAttrs(unsigned ArgNo, const AttrBuilder &B) {
1588 assert(ArgNo < arg_size() && "Out of bounds");
1589 Attrs = Attrs.addParamAttributes(getContext(), ArgNo, B);
1590 }
1591
1592 /// Adds the attribute to the indicated argument
1593 void maybeAddParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) {
1594 assert(ArgNo < arg_size() && "Out of bounds");
1595 Attrs = Attrs.maybeAddParamAttribute(getContext(), ArgNo, Kind);
1596 }
1597
1598 /// removes the attribute from the list of attributes.
1600 Attrs = Attrs.removeAttributeAtIndex(getContext(), i, Kind);
1601 }
1602
1603 /// removes the attribute from the list of attributes.
1604 void removeAttributeAtIndex(unsigned i, StringRef Kind) {
1605 Attrs = Attrs.removeAttributeAtIndex(getContext(), i, Kind);
1606 }
1607
1608 /// Removes the attributes from the function
1609 void removeFnAttrs(const AttributeMask &AttrsToRemove) {
1610 Attrs = Attrs.removeFnAttributes(getContext(), AttrsToRemove);
1611 }
1612
1613 /// Removes the attribute from the function
1615 Attrs = Attrs.removeFnAttribute(getContext(), Kind);
1616 }
1617
1618 /// Removes the attribute from the function
1620 Attrs = Attrs.removeFnAttribute(getContext(), Kind);
1621 }
1622
1623 /// Removes the attribute from the return value
1625 Attrs = Attrs.removeRetAttribute(getContext(), Kind);
1626 }
1627
1628 /// Removes the attributes from the return value
1629 void removeRetAttrs(const AttributeMask &AttrsToRemove) {
1630 Attrs = Attrs.removeRetAttributes(getContext(), AttrsToRemove);
1631 }
1632
1633 /// Removes the attribute from the given argument
1634 void removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) {
1635 assert(ArgNo < arg_size() && "Out of bounds");
1636 Attrs = Attrs.removeParamAttribute(getContext(), ArgNo, Kind);
1637 }
1638
1639 /// Removes the attribute from the given argument
1640 void removeParamAttr(unsigned ArgNo, StringRef Kind) {
1641 assert(ArgNo < arg_size() && "Out of bounds");
1642 Attrs = Attrs.removeParamAttribute(getContext(), ArgNo, Kind);
1643 }
1644
1645 /// Removes the attributes from the given argument
1646 void removeParamAttrs(unsigned ArgNo, const AttributeMask &AttrsToRemove) {
1647 Attrs = Attrs.removeParamAttributes(getContext(), ArgNo, AttrsToRemove);
1648 }
1649
1650 /// adds the dereferenceable attribute to the list of attributes.
1651 void addDereferenceableParamAttr(unsigned i, uint64_t Bytes) {
1652 Attrs = Attrs.addDereferenceableParamAttr(getContext(), i, Bytes);
1653 }
1654
1655 /// adds the dereferenceable attribute to the list of attributes.
1657 Attrs = Attrs.addDereferenceableRetAttr(getContext(), Bytes);
1658 }
1659
1660 /// adds the range attribute to the list of attributes.
1662 Attrs = Attrs.addRangeRetAttr(getContext(), CR);
1663 }
1664
1665 /// Determine whether the return value has the given attribute.
1667 return hasRetAttrImpl(Kind);
1668 }
1669 /// Determine whether the return value has the given attribute.
1670 bool hasRetAttr(StringRef Kind) const { return hasRetAttrImpl(Kind); }
1671
1672 /// Return the attribute for the given attribute kind for the return value.
1674 Attribute RetAttr = Attrs.getRetAttr(Kind);
1675 if (RetAttr.isValid())
1676 return RetAttr;
1677
1678 // Look at the callee, if available.
1679 if (const Function *F = getCalledFunction())
1680 return F->getRetAttribute(Kind);
1681 return Attribute();
1682 }
1683
1684 /// Determine whether the argument or parameter has the given attribute.
1685 LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const;
1686
1687 /// Return true if this argument has the nonnull attribute on either the
1688 /// CallBase instruction or the called function. Also returns true if at least
1689 /// one byte is known to be dereferenceable and the pointer is in
1690 /// addrspace(0). If \p AllowUndefOrPoison is true, respect the semantics of
1691 /// nonnull attribute and return true even if the argument can be undef or
1692 /// poison.
1693 LLVM_ABI bool paramHasNonNullAttr(unsigned ArgNo,
1694 bool AllowUndefOrPoison) const;
1695
1696 /// Get the attribute of a given kind at a position.
1698 return getAttributes().getAttributeAtIndex(i, Kind);
1699 }
1700
1701 /// Get the attribute of a given kind at a position.
1702 Attribute getAttributeAtIndex(unsigned i, StringRef Kind) const {
1703 return getAttributes().getAttributeAtIndex(i, Kind);
1704 }
1705
1706 /// Get the attribute of a given kind for the function.
1708 Attribute Attr = getAttributes().getFnAttr(Kind);
1709 if (Attr.isValid())
1710 return Attr;
1711 return getFnAttrOnCalledFunction(Kind);
1712 }
1713
1714 /// Get the attribute of a given kind for the function.
1716 Attribute A = getAttributes().getFnAttr(Kind);
1717 if (A.isValid())
1718 return A;
1719 return getFnAttrOnCalledFunction(Kind);
1720 }
1721
1722 /// Get the attribute of a given kind from a given arg
1723 Attribute getParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
1724 assert(ArgNo < arg_size() && "Out of bounds");
1725 Attribute A = getAttributes().getParamAttr(ArgNo, Kind);
1726 if (A.isValid())
1727 return A;
1728 return getParamAttrOnCalledFunction(ArgNo, Kind);
1729 }
1730
1731 /// Get the attribute of a given kind from a given arg
1732 Attribute getParamAttr(unsigned ArgNo, StringRef Kind) const {
1733 assert(ArgNo < arg_size() && "Out of bounds");
1734 Attribute A = getAttributes().getParamAttr(ArgNo, Kind);
1735 if (A.isValid())
1736 return A;
1737 return getParamAttrOnCalledFunction(ArgNo, Kind);
1738 }
1739
1740 /// Return true if the data operand at index \p i has the attribute \p
1741 /// A.
1742 ///
1743 /// Data operands include call arguments and values used in operand bundles,
1744 /// but does not include the callee operand.
1745 ///
1746 /// The index \p i is interpreted as
1747 ///
1748 /// \p i in [0, arg_size) -> argument number (\p i)
1749 /// \p i in [arg_size, data_operand_size) -> bundle operand at index
1750 /// (\p i) in the operand list.
1751 bool dataOperandHasImpliedAttr(unsigned i, Attribute::AttrKind Kind) const {
1752 // Note that we have to add one because `i` isn't zero-indexed.
1754 "Data operand index out of bounds!");
1755
1756 // The attribute A can either be directly specified, if the operand in
1757 // question is a call argument; or be indirectly implied by the kind of its
1758 // containing operand bundle, if the operand is a bundle operand.
1759
1760 if (i < arg_size())
1761 return paramHasAttr(i, Kind);
1762
1764 "Must be either a call argument or an operand bundle!");
1765 return bundleOperandHasAttr(i, Kind);
1766 }
1767
1768 /// Return which pointer components this operand may capture.
1769 LLVM_ABI CaptureInfo getCaptureInfo(unsigned OpNo) const;
1770
1771 /// Determine whether this data operand is not captured.
1772 // FIXME: Once this API is no longer duplicated in `CallSite`, rename this to
1773 // better indicate that this may return a conservative answer.
1774 bool doesNotCapture(unsigned OpNo) const {
1775 return capturesNothing(getCaptureInfo(OpNo));
1776 }
1777
1778 /// Returns whether the call has an argument that has an attribute like
1779 /// captures(ret: address, provenance), where the return capture components
1780 /// are not a subset of the other capture components.
1782
1783 /// Determine whether this argument is passed by value.
1784 bool isByValArgument(unsigned ArgNo) const {
1785 return paramHasAttr(ArgNo, Attribute::ByVal);
1786 }
1787
1788 /// Determine whether this argument is passed in an alloca.
1789 bool isInAllocaArgument(unsigned ArgNo) const {
1790 return paramHasAttr(ArgNo, Attribute::InAlloca);
1791 }
1792
1793 /// Determine whether this argument is passed by value, in an alloca, or is
1794 /// preallocated.
1795 bool isPassPointeeByValueArgument(unsigned ArgNo) const {
1796 return paramHasAttr(ArgNo, Attribute::ByVal) ||
1797 paramHasAttr(ArgNo, Attribute::InAlloca) ||
1798 paramHasAttr(ArgNo, Attribute::Preallocated);
1799 }
1800
1801 /// Determine whether passing undef to this argument is undefined behavior.
1802 /// If passing undef to this argument is UB, passing poison is UB as well
1803 /// because poison is more undefined than undef.
1804 bool isPassingUndefUB(unsigned ArgNo) const {
1805 return paramHasAttr(ArgNo, Attribute::NoUndef) ||
1806 // dereferenceable implies noundef.
1807 paramHasAttr(ArgNo, Attribute::Dereferenceable) ||
1808 // dereferenceable implies noundef, and null is a well-defined value.
1809 paramHasAttr(ArgNo, Attribute::DereferenceableOrNull);
1810 }
1811
1812 /// Determine if there are is an inalloca argument. Only the last argument can
1813 /// have the inalloca attribute.
1814 bool hasInAllocaArgument() const {
1815 return !arg_empty() && paramHasAttr(arg_size() - 1, Attribute::InAlloca);
1816 }
1817
1818 // FIXME: Once this API is no longer duplicated in `CallSite`, rename this to
1819 // better indicate that this may return a conservative answer.
1820 bool doesNotAccessMemory(unsigned OpNo) const {
1821 return dataOperandHasImpliedAttr(OpNo, Attribute::ReadNone);
1822 }
1823
1824 // FIXME: Once this API is no longer duplicated in `CallSite`, rename this to
1825 // better indicate that this may return a conservative answer.
1826 bool onlyReadsMemory(unsigned OpNo) const {
1827 // If the argument is passed byval, the callee does not have access to the
1828 // original pointer and thus cannot write to it.
1829 if (OpNo < arg_size() && isByValArgument(OpNo))
1830 return true;
1831
1832 return dataOperandHasImpliedAttr(OpNo, Attribute::ReadOnly) ||
1833 dataOperandHasImpliedAttr(OpNo, Attribute::ReadNone);
1834 }
1835
1836 // FIXME: Once this API is no longer duplicated in `CallSite`, rename this to
1837 // better indicate that this may return a conservative answer.
1838 bool onlyWritesMemory(unsigned OpNo) const {
1839 return dataOperandHasImpliedAttr(OpNo, Attribute::WriteOnly) ||
1840 dataOperandHasImpliedAttr(OpNo, Attribute::ReadNone);
1841 }
1842
1843 /// Extract the alignment of the return value.
1845 if (auto Align = Attrs.getRetAlignment())
1846 return Align;
1847 if (const Function *F = getCalledFunction())
1848 return F->getAttributes().getRetAlignment();
1849 return std::nullopt;
1850 }
1851
1852 /// Extract the alignment for a call or parameter (0=unknown).
1853 MaybeAlign getParamAlign(unsigned ArgNo) const {
1854 return Attrs.getParamAlignment(ArgNo);
1855 }
1856
1857 MaybeAlign getParamStackAlign(unsigned ArgNo) const {
1858 return Attrs.getParamStackAlignment(ArgNo);
1859 }
1860
1861 /// Extract the byref type for a call or parameter.
1862 Type *getParamByRefType(unsigned ArgNo) const {
1863 if (auto *Ty = Attrs.getParamByRefType(ArgNo))
1864 return Ty;
1865 if (const Function *F = getCalledFunction())
1866 return F->getAttributes().getParamByRefType(ArgNo);
1867 return nullptr;
1868 }
1869
1870 /// Extract the byval type for a call or parameter.
1871 Type *getParamByValType(unsigned ArgNo) const {
1872 if (auto *Ty = Attrs.getParamByValType(ArgNo))
1873 return Ty;
1874 if (const Function *F = getCalledFunction())
1875 return F->getAttributes().getParamByValType(ArgNo);
1876 return nullptr;
1877 }
1878
1879 /// Extract the preallocated type for a call or parameter.
1880 Type *getParamPreallocatedType(unsigned ArgNo) const {
1881 if (auto *Ty = Attrs.getParamPreallocatedType(ArgNo))
1882 return Ty;
1883 if (const Function *F = getCalledFunction())
1884 return F->getAttributes().getParamPreallocatedType(ArgNo);
1885 return nullptr;
1886 }
1887
1888 /// Extract the inalloca type for a call or parameter.
1889 Type *getParamInAllocaType(unsigned ArgNo) const {
1890 if (auto *Ty = Attrs.getParamInAllocaType(ArgNo))
1891 return Ty;
1892 if (const Function *F = getCalledFunction())
1893 return F->getAttributes().getParamInAllocaType(ArgNo);
1894 return nullptr;
1895 }
1896
1897 /// Extract the sret type for a call or parameter.
1898 Type *getParamStructRetType(unsigned ArgNo) const {
1899 if (auto *Ty = Attrs.getParamStructRetType(ArgNo))
1900 return Ty;
1901 if (const Function *F = getCalledFunction())
1902 return F->getAttributes().getParamStructRetType(ArgNo);
1903 return nullptr;
1904 }
1905
1906 /// Extract the elementtype type for a parameter.
1907 /// Note that elementtype() can only be applied to call arguments, not
1908 /// function declaration parameters.
1909 Type *getParamElementType(unsigned ArgNo) const {
1910 return Attrs.getParamElementType(ArgNo);
1911 }
1912
1913 /// Extract the number of dereferenceable bytes for a call or
1914 /// parameter (0=unknown).
1916 uint64_t Bytes = Attrs.getRetDereferenceableBytes();
1917 if (const Function *F = getCalledFunction())
1918 Bytes = std::max(Bytes, F->getAttributes().getRetDereferenceableBytes());
1919 return Bytes;
1920 }
1921
1922 /// Extract the number of dereferenceable bytes for a call or
1923 /// parameter (0=unknown).
1925 return Attrs.getParamDereferenceableBytes(i);
1926 }
1927
1928 /// Extract the number of dereferenceable_or_null bytes for a call
1929 /// (0=unknown).
1931 uint64_t Bytes = Attrs.getRetDereferenceableOrNullBytes();
1932 if (const Function *F = getCalledFunction()) {
1933 Bytes = std::max(Bytes,
1934 F->getAttributes().getRetDereferenceableOrNullBytes());
1935 }
1936
1937 return Bytes;
1938 }
1939
1940 /// Extract the number of dereferenceable_or_null bytes for a
1941 /// parameter (0=unknown).
1943 return Attrs.getParamDereferenceableOrNullBytes(i);
1944 }
1945
1946 /// Extract a test mask for disallowed floating-point value classes for the
1947 /// return value.
1949
1950 /// Extract a test mask for disallowed floating-point value classes for the
1951 /// parameter.
1952 LLVM_ABI FPClassTest getParamNoFPClass(unsigned i) const;
1953
1954 /// If this return value has a range attribute, return the value range of the
1955 /// argument. Otherwise, std::nullopt is returned.
1956 LLVM_ABI std::optional<ConstantRange> getRange() const;
1957
1958 /// Return true if the return value is known to be not null.
1959 /// This may be because it has the nonnull attribute, or because at least
1960 /// one byte is dereferenceable and the pointer is in addrspace(0).
1961 LLVM_ABI bool isReturnNonNull() const;
1962
1963 /// Determine if the return value is marked with NoAlias attribute.
1964 bool returnDoesNotAlias() const {
1965 return Attrs.hasRetAttr(Attribute::NoAlias);
1966 }
1967
1968 /// If one of the arguments has the 'returned' attribute, returns its
1969 /// operand value. Otherwise, return nullptr.
1971 return getArgOperandWithAttribute(Attribute::Returned);
1972 }
1973
1974 /// If one of the arguments has the specified attribute, returns its
1975 /// operand value. Otherwise, return nullptr.
1977
1978 /// Return true if the call should not be treated as a call to a
1979 /// builtin.
1980 bool isNoBuiltin() const {
1981 return hasFnAttrImpl(Attribute::NoBuiltin) &&
1982 !hasFnAttrImpl(Attribute::Builtin);
1983 }
1984
1985 /// Determine if the call requires strict floating point semantics.
1986 bool isStrictFP() const { return hasFnAttr(Attribute::StrictFP); }
1987
1988 /// Return true if the call should not be inlined.
1989 bool isNoInline() const { return hasFnAttr(Attribute::NoInline); }
1990 void setIsNoInline() { addFnAttr(Attribute::NoInline); }
1991
1994
1995 /// Determine if the call does not access memory.
1996 LLVM_ABI bool doesNotAccessMemory() const;
1998
1999 /// Determine if the call does not access or only reads memory.
2000 LLVM_ABI bool onlyReadsMemory() const;
2002
2003 /// Determine if the call does not access or only writes memory.
2004 LLVM_ABI bool onlyWritesMemory() const;
2006
2007 /// Determine if the call can access memmory only using pointers based
2008 /// on its arguments.
2009 LLVM_ABI bool onlyAccessesArgMemory() const;
2011
2012 /// Determine if the function may only access memory that is
2013 /// inaccessible from the IR.
2016
2017 /// Determine if the function may only access memory that is
2018 /// either inaccessible from the IR or pointed to by its arguments.
2021
2022 /// Determine if the call cannot return.
2023 bool doesNotReturn() const { return hasFnAttr(Attribute::NoReturn); }
2024 void setDoesNotReturn() { addFnAttr(Attribute::NoReturn); }
2025
2026 /// Determine if the call should not perform indirect branch tracking.
2027 bool doesNoCfCheck() const { return hasFnAttr(Attribute::NoCfCheck); }
2028
2029 /// Determine if the call cannot unwind.
2030 bool doesNotThrow() const { return hasFnAttr(Attribute::NoUnwind); }
2031 void setDoesNotThrow() { addFnAttr(Attribute::NoUnwind); }
2032
2033 /// Determine if the invoke cannot be duplicated.
2034 bool cannotDuplicate() const { return hasFnAttr(Attribute::NoDuplicate); }
2035 void setCannotDuplicate() { addFnAttr(Attribute::NoDuplicate); }
2036
2037 /// Determine if the call cannot be tail merged.
2038 bool cannotMerge() const { return hasFnAttr(Attribute::NoMerge); }
2039 void setCannotMerge() { addFnAttr(Attribute::NoMerge); }
2040
2041 /// Determine if the invoke is convergent
2042 bool isConvergent() const { return hasFnAttr(Attribute::Convergent); }
2043 void setConvergent() { addFnAttr(Attribute::Convergent); }
2044 void setNotConvergent() { removeFnAttr(Attribute::Convergent); }
2045
2046 /// Determine if the call returns a structure through first
2047 /// pointer argument.
2048 bool hasStructRetAttr() const {
2049 if (arg_empty())
2050 return false;
2051
2052 // Be friendly and also check the callee.
2053 return paramHasAttr(0, Attribute::StructRet);
2054 }
2055
2056 /// Determine if any call argument is an aggregate passed by value.
2057 bool hasByValArgument() const {
2058 return Attrs.hasAttrSomewhere(Attribute::ByVal);
2059 }
2060
2061 ///@}
2062 // End of attribute API.
2063
2064 /// \name Operand Bundle API
2065 ///
2066 /// This group of methods provides the API to access and manipulate operand
2067 /// bundles on this call.
2068 /// @{
2069
2070 /// Return the number of operand bundles associated with this User.
2071 unsigned getNumOperandBundles() const {
2072 return std::distance(bundle_op_info_begin(), bundle_op_info_end());
2073 }
2074
2075 /// Return true if this User has any operand bundles.
2076 bool hasOperandBundles() const { return getNumOperandBundles() != 0; }
2077
2078 /// Return the index of the first bundle operand in the Use array.
2080 assert(hasOperandBundles() && "Don't call otherwise!");
2081 return bundle_op_info_begin()->Begin;
2082 }
2083
2084 /// Return the index of the last bundle operand in the Use array.
2085 unsigned getBundleOperandsEndIndex() const {
2086 assert(hasOperandBundles() && "Don't call otherwise!");
2087 return bundle_op_info_end()[-1].End;
2088 }
2089
2090 /// Return true if the operand at index \p Idx is a bundle operand.
2091 bool isBundleOperand(unsigned Idx) const {
2092 return hasOperandBundles() && Idx >= getBundleOperandsStartIndex() &&
2094 }
2095
2096 /// Return true if the operand at index \p Idx is a bundle operand that has
2097 /// tag ID \p ID.
2098 bool isOperandBundleOfType(uint32_t ID, unsigned Idx) const {
2099 return isBundleOperand(Idx) &&
2101 }
2102
2103 /// Returns true if the use is a bundle operand.
2104 bool isBundleOperand(const Use *U) const {
2105 assert(this == U->getUser() &&
2106 "Only valid to query with a use of this instruction!");
2107 return hasOperandBundles() && isBundleOperand(U - op_begin());
2108 }
2110 return isBundleOperand(&UI.getUse());
2111 }
2112
2113 /// Return the total number operands (not operand bundles) used by
2114 /// every operand bundle in this OperandBundleUser.
2115 unsigned getNumTotalBundleOperands() const {
2116 if (!hasOperandBundles())
2117 return 0;
2118
2119 unsigned Begin = getBundleOperandsStartIndex();
2120 unsigned End = getBundleOperandsEndIndex();
2121
2122 assert(Begin <= End && "Should be!");
2123 return End - Begin;
2124 }
2125
2126 /// Return the operand bundle at a specific index.
2127 OperandBundleUse getOperandBundleAt(unsigned Index) const {
2128 assert(Index < getNumOperandBundles() && "Index out of bounds!");
2130 }
2131
2132 /// Return the number of operand bundles with the tag Name attached to
2133 /// this instruction.
2135 unsigned Count = 0;
2136 for (unsigned i = 0, e = getNumOperandBundles(); i != e; ++i)
2137 if (getOperandBundleAt(i).getTagName() == Name)
2138 Count++;
2139
2140 return Count;
2141 }
2142
2143 /// Return the number of operand bundles with the tag ID attached to
2144 /// this instruction.
2146 unsigned Count = 0;
2147 for (unsigned i = 0, e = getNumOperandBundles(); i != e; ++i)
2148 if (getOperandBundleAt(i).getTagID() == ID)
2149 Count++;
2150
2151 return Count;
2152 }
2153
2154 /// Return an operand bundle by name, if present.
2155 ///
2156 /// It is an error to call this for operand bundle types that may have
2157 /// multiple instances of them on the same instruction.
2158 std::optional<OperandBundleUse> getOperandBundle(StringRef Name) const {
2159 assert(countOperandBundlesOfType(Name) < 2 && "Precondition violated!");
2160
2161 for (unsigned i = 0, e = getNumOperandBundles(); i != e; ++i) {
2163 if (U.getTagName() == Name)
2164 return U;
2165 }
2166
2167 return std::nullopt;
2168 }
2169
2170 /// Return an operand bundle by tag ID, if present.
2171 ///
2172 /// It is an error to call this for operand bundle types that may have
2173 /// multiple instances of them on the same instruction.
2174 std::optional<OperandBundleUse> getOperandBundle(uint32_t ID) const {
2175 assert(countOperandBundlesOfType(ID) < 2 && "Precondition violated!");
2176
2177 for (unsigned i = 0, e = getNumOperandBundles(); i != e; ++i) {
2179 if (U.getTagID() == ID)
2180 return U;
2181 }
2182
2183 return std::nullopt;
2184 }
2185
2186 /// Return the list of operand bundles attached to this instruction as
2187 /// a vector of OperandBundleDefs.
2188 ///
2189 /// This function copies the OperandBundeUse instances associated with this
2190 /// OperandBundleUser to a vector of OperandBundleDefs. Note:
2191 /// OperandBundeUses and OperandBundleDefs are non-trivially *different*
2192 /// representations of operand bundles (see documentation above).
2193 LLVM_ABI void
2195
2196 /// Return the operand bundle for the operand at index OpIdx.
2197 ///
2198 /// It is an error to call this with an OpIdx that does not correspond to an
2199 /// bundle operand.
2203
2204 /// Return true if this operand bundle user has operand bundles that
2205 /// may read from the heap.
2207
2208 /// Return true if this operand bundle user has operand bundles that
2209 /// may write to the heap.
2211
2212 /// Return true if the bundle operand at index \p OpIdx has the
2213 /// attribute \p A.
2214 bool bundleOperandHasAttr(unsigned OpIdx, Attribute::AttrKind A) const {
2215 auto &BOI = getBundleOpInfoForOperand(OpIdx);
2216 auto OBU = operandBundleFromBundleOpInfo(BOI);
2217 return OBU.operandHasAttr(OpIdx - BOI.Begin, A);
2218 }
2219
2220 /// Return true if \p Other has the same sequence of operand bundle
2221 /// tags with the same number of operands on each one of them as this
2222 /// OperandBundleUser.
2224 if (getNumOperandBundles() != Other.getNumOperandBundles())
2225 return false;
2226
2227 return std::equal(bundle_op_info_begin(), bundle_op_info_end(),
2228 Other.bundle_op_info_begin());
2229 }
2230
2231 /// Return true if this operand bundle user contains operand bundles
2232 /// with tags other than those specified in \p IDs.
2234 for (unsigned i = 0, e = getNumOperandBundles(); i != e; ++i) {
2236 if (!is_contained(IDs, ID))
2237 return true;
2238 }
2239 return false;
2240 }
2241
2242 /// Used to keep track of an operand bundle. See the main comment on
2243 /// OperandBundleUser above.
2245 /// The operand bundle tag, interned by
2246 /// LLVMContextImpl::getOrInsertBundleTag.
2248
2249 /// The index in the Use& vector where operands for this operand
2250 /// bundle starts.
2252
2253 /// The index in the Use& vector where operands for this operand
2254 /// bundle ends.
2256
2257 bool operator==(const BundleOpInfo &Other) const {
2258 return Tag == Other.Tag && Begin == Other.Begin && End == Other.End;
2259 }
2260 };
2261
2262 /// Simple helper function to map a BundleOpInfo to an
2263 /// OperandBundleUse.
2266 const auto *begin = op_begin();
2267 ArrayRef<Use> Inputs(begin + BOI.Begin, begin + BOI.End);
2268 return OperandBundleUse(BOI.Tag, Inputs);
2269 }
2270
2273
2274 /// Return the start of the list of BundleOpInfo instances associated
2275 /// with this OperandBundleUser.
2276 ///
2277 /// OperandBundleUser uses the descriptor area co-allocated with the host User
2278 /// to store some meta information about which operands are "normal" operands,
2279 /// and which ones belong to some operand bundle.
2280 ///
2281 /// The layout of an operand bundle user is
2282 ///
2283 /// +-----------uint32_t End-------------------------------------+
2284 /// | |
2285 /// | +--------uint32_t Begin--------------------+ |
2286 /// | | | |
2287 /// ^ ^ v v
2288 /// |------|------|----|----|----|----|----|---------|----|---------|----|-----
2289 /// | BOI0 | BOI1 | .. | DU | U0 | U1 | .. | BOI0_U0 | .. | BOI1_U0 | .. | Un
2290 /// |------|------|----|----|----|----|----|---------|----|---------|----|-----
2291 /// v v ^ ^
2292 /// | | | |
2293 /// | +--------uint32_t Begin------------+ |
2294 /// | |
2295 /// +-----------uint32_t End-----------------------------+
2296 ///
2297 ///
2298 /// BOI0, BOI1 ... are descriptions of operand bundles in this User's use
2299 /// list. These descriptions are installed and managed by this class, and
2300 /// they're all instances of OperandBundleUser<T>::BundleOpInfo.
2301 ///
2302 /// DU is an additional descriptor installed by User's 'operator new' to keep
2303 /// track of the 'BOI0 ... BOIN' co-allocation. OperandBundleUser does not
2304 /// access or modify DU in any way, it's an implementation detail private to
2305 /// User.
2306 ///
2307 /// The regular Use& vector for the User starts at U0. The operand bundle
2308 /// uses are part of the Use& vector, just like normal uses. In the diagram
2309 /// above, the operand bundle uses start at BOI0_U0. Each instance of
2310 /// BundleOpInfo has information about a contiguous set of uses constituting
2311 /// an operand bundle, and the total set of operand bundle uses themselves
2312 /// form a contiguous set of uses (i.e. there are no gaps between uses
2313 /// corresponding to individual operand bundles).
2314 ///
2315 /// This class does not know the location of the set of operand bundle uses
2316 /// within the use list -- that is decided by the User using this class via
2317 /// the BeginIdx argument in populateBundleOperandInfos.
2318 ///
2319 /// Currently operand bundle users with hung-off operands are not supported.
2321 if (!hasDescriptor())
2322 return nullptr;
2323
2324 uint8_t *BytesBegin = getDescriptor().begin();
2325 return reinterpret_cast<bundle_op_iterator>(BytesBegin);
2326 }
2327
2328 /// Return the start of the list of BundleOpInfo instances associated
2329 /// with this OperandBundleUser.
2331 auto *NonConstThis = const_cast<CallBase *>(this);
2332 return NonConstThis->bundle_op_info_begin();
2333 }
2334
2335 /// Return the end of the list of BundleOpInfo instances associated
2336 /// with this OperandBundleUser.
2338 if (!hasDescriptor())
2339 return nullptr;
2340
2341 uint8_t *BytesEnd = getDescriptor().end();
2342 return reinterpret_cast<bundle_op_iterator>(BytesEnd);
2343 }
2344
2345 /// Return the end of the list of BundleOpInfo instances associated
2346 /// with this OperandBundleUser.
2348 auto *NonConstThis = const_cast<CallBase *>(this);
2349 return NonConstThis->bundle_op_info_end();
2350 }
2351
2352 /// Return the range [\p bundle_op_info_begin, \p bundle_op_info_end).
2356
2357 /// Return the range [\p bundle_op_info_begin, \p bundle_op_info_end).
2361
2362 auto operand_bundles() const {
2363 return map_range(bundle_op_infos(), [this](BundleOpInfo BOI) {
2365 });
2366 }
2367
2368 /// Populate the BundleOpInfo instances and the Use& vector from \p
2369 /// Bundles. Return the op_iterator pointing to the Use& one past the last
2370 /// last bundle operand use.
2371 ///
2372 /// Each \p OperandBundleDef instance is tracked by a OperandBundleInfo
2373 /// instance allocated in this User's descriptor.
2375 ArrayRef<OperandBundleDef> Bundles, const unsigned BeginIndex);
2376
2377 /// Return true if the call has deopt state bundle.
2378 bool hasDeoptState() const {
2379 return getOperandBundle(LLVMContext::OB_deopt).has_value();
2380 }
2381
2382public:
2383 /// Return the BundleOpInfo for the operand at index OpIdx.
2384 ///
2385 /// It is an error to call this with an OpIdx that does not correspond to an
2386 /// bundle operand.
2387 LLVM_ABI BundleOpInfo &getBundleOpInfoForOperand(unsigned OpIdx);
2388 const BundleOpInfo &getBundleOpInfoForOperand(unsigned OpIdx) const {
2389 return const_cast<CallBase *>(this)->getBundleOpInfoForOperand(OpIdx);
2390 }
2391
2392protected:
2393 /// Return the total number of values used in \p Bundles.
2395 unsigned Total = 0;
2396 for (const auto &B : Bundles)
2397 Total += B.input_size();
2398 return Total;
2399 }
2400
2401 /// @}
2402 // End of operand bundle API.
2403
2404private:
2405 LLVM_ABI bool hasFnAttrOnCalledFunction(Attribute::AttrKind Kind) const;
2406 LLVM_ABI bool hasFnAttrOnCalledFunction(StringRef Kind) const;
2407
2408 template <typename AttrKind> bool hasFnAttrImpl(AttrKind Kind) const {
2409 if (Attrs.hasFnAttr(Kind))
2410 return true;
2411
2412 return hasFnAttrOnCalledFunction(Kind);
2413 }
2414 template <typename AK> Attribute getFnAttrOnCalledFunction(AK Kind) const;
2415 template <typename AK>
2416 Attribute getParamAttrOnCalledFunction(unsigned ArgNo, AK Kind) const;
2417
2418 /// Determine whether the return value has the given attribute. Supports
2419 /// Attribute::AttrKind and StringRef as \p AttrKind types.
2420 template <typename AttrKind> bool hasRetAttrImpl(AttrKind Kind) const {
2421 if (Attrs.hasRetAttr(Kind))
2422 return true;
2423
2424 // Look at the callee, if available.
2425 if (const Function *F = getCalledFunction())
2426 return F->getAttributes().hasRetAttr(Kind);
2427 return false;
2428 }
2429};
2430
2431template <>
2432struct OperandTraits<CallBase> : public VariadicOperandTraits<CallBase> {};
2433
2435
2436//===----------------------------------------------------------------------===//
2437// FuncletPadInst Class
2438//===----------------------------------------------------------------------===//
2439class FuncletPadInst : public Instruction {
2440private:
2441 FuncletPadInst(const FuncletPadInst &CPI, AllocInfo AllocInfo);
2442
2443 LLVM_ABI explicit FuncletPadInst(Instruction::FuncletPadOps Op,
2444 Value *ParentPad, ArrayRef<Value *> Args,
2445 AllocInfo AllocInfo, const Twine &NameStr,
2446 InsertPosition InsertBefore);
2447
2448 void init(Value *ParentPad, ArrayRef<Value *> Args, const Twine &NameStr);
2449
2450protected:
2451 // Note: Instruction needs to be a friend here to call cloneImpl.
2452 friend class Instruction;
2453 friend class CatchPadInst;
2454 friend class CleanupPadInst;
2455
2456 LLVM_ABI FuncletPadInst *cloneImpl() const;
2457
2458public:
2459 /// Provide fast operand accessors
2461
2462 /// arg_size - Return the number of funcletpad arguments.
2463 ///
2464 unsigned arg_size() const { return getNumOperands() - 1; }
2465
2466 /// Convenience accessors
2467
2468 /// Return the outer EH-pad this funclet is nested within.
2469 ///
2470 /// Note: This returns the associated CatchSwitchInst if this FuncletPadInst
2471 /// is a CatchPadInst.
2472 Value *getParentPad() const { return Op<-1>(); }
2473 void setParentPad(Value *ParentPad) {
2474 assert(ParentPad);
2475 Op<-1>() = ParentPad;
2476 }
2477
2478 /// getArgOperand/setArgOperand - Return/set the i-th funcletpad argument.
2479 ///
2480 Value *getArgOperand(unsigned i) const { return getOperand(i); }
2481 void setArgOperand(unsigned i, Value *v) { setOperand(i, v); }
2482
2483 /// arg_operands - iteration adapter for range-for loops.
2485
2486 /// arg_operands - iteration adapter for range-for loops.
2488 return const_op_range(op_begin(), op_end() - 1);
2489 }
2490
2491 // Methods for support type inquiry through isa, cast, and dyn_cast:
2492 static bool classof(const Instruction *I) { return I->isFuncletPad(); }
2493 static bool classof(const Value *V) {
2495 }
2496};
2497
2498template <>
2500 : public VariadicOperandTraits<FuncletPadInst> {};
2501
2503
2504} // end namespace llvm
2505
2506#endif // LLVM_IR_INSTRTYPES_H
OperandBundleDefT< Value * > OperandBundleDef
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
unsigned uint64_t
constexpr LLT S1
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
@ RetAttr
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:215
static bool isSigned(unsigned Opcode)
#define op(i)
#define DEFINE_HELPERS(OPC, NUWNSWEXACT)
Definition InstrTypes.h:365
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CLASS, VALUECLASS)
Macro for generating out-of-class operand accessor definitions.
#define P(N)
This file contains some templates that are useful if you are working with the STL at all.
Provides some synthesis utilities to produce sequences of values.
Value * RHS
Value * LHS
BinaryOperator * Mul
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
This class stores enough information to efficiently remove some attributes from an existing AttrBuild...
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:410
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:106
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition Attributes.h:125
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:266
static BinaryOperator * CreateFAddFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
Definition InstrTypes.h:271
static LLVM_ABI BinaryOperator * CreateNeg(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Helper functions to construct and inspect unary operations (NEG and NOT) via binary operators SUB and...
static BinaryOperator * CreateFDivFMF(Value *V1, Value *V2, Instruction *FMFSource, const Twine &Name="")
Definition InstrTypes.h:303
BinaryOps getOpcode() const
Definition InstrTypes.h:409
static BinaryOperator * CreateNSW(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name="")
Definition InstrTypes.h:314
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
static bool classof(const Value *V)
Definition InstrTypes.h:424
static BinaryOperator * CreateFRemFMF(Value *V1, Value *V2, Instruction *FMFSource, const Twine &Name="")
Definition InstrTypes.h:308
static BinaryOperator * CreateWithFMF(BinaryOps Opc, Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Definition InstrTypes.h:262
static BinaryOperator * CreateExact(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name="")
Definition InstrTypes.h:344
static BinaryOperator * CreateFMulFMF(Value *V1, Value *V2, Instruction *FMFSource, const Twine &Name="")
Definition InstrTypes.h:298
LLVM_ABI bool swapOperands()
Exchange the two operands to this instruction.
static BinaryOperator * CreateExact(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name, InsertPosition InsertBefore)
Definition InstrTypes.h:351
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition InstrTypes.h:216
static BinaryOperator * CreateFSubFMF(Value *V1, Value *V2, Instruction *FMFSource, const Twine &Name="")
Definition InstrTypes.h:293
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static BinaryOperator * CreateNUW(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name="")
Definition InstrTypes.h:329
static BinaryOperator * CreateFAddFMF(Value *V1, Value *V2, Instruction *FMFSource, const Twine &Name="")
Definition InstrTypes.h:288
static BinaryOperator * CreateFMulFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
Definition InstrTypes.h:279
static BinaryOperator * CreateFDivFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
Definition InstrTypes.h:283
static BinaryOperator * CreateNUW(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name, InsertPosition InsertBefore)
Definition InstrTypes.h:336
static BinaryOperator * CreateFSubFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
Definition InstrTypes.h:275
static BinaryOperator * CreateDisjoint(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name="")
Definition InstrTypes.h:459
static BinaryOperator * CreateWithCopiedFlags(BinaryOps Opc, Value *V1, Value *V2, Value *CopyO, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Definition InstrTypes.h:254
LLVM_ABI BinaryOperator(BinaryOps iType, Value *S1, Value *S2, Type *Ty, const Twine &Name, InsertPosition InsertBefore)
static LLVM_ABI BinaryOperator * CreateNSWNeg(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
LLVM_ABI BinaryOperator * cloneImpl() const
static BinaryOperator * CreateNSW(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name, InsertPosition InsertBefore)
Definition InstrTypes.h:321
static bool classof(const Instruction *I)
Definition InstrTypes.h:421
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
MaybeAlign getParamStackAlign(unsigned ArgNo) const
void setCalledFunction(FunctionType *FTy, Value *Fn)
Sets the function called, including updating to the specified function type.
LLVM_ABI FPClassTest getParamNoFPClass(unsigned i) const
Extract a test mask for disallowed floating-point value classes for the parameter.
bool isInlineAsm() const
Check if this call is an inline asm statement.
void addFnAttr(Attribute Attr)
Adds the attribute to the function.
auto operand_bundles() const
bool hasDescriptor() const
LLVM_ABI BundleOpInfo & getBundleOpInfoForOperand(unsigned OpIdx)
Return the BundleOpInfo for the operand at index OpIdx.
Attribute getRetAttr(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind for the return value.
void setCallingConv(CallingConv::ID CC)
void setDoesNotReturn()
LLVM_ABI FPClassTest getRetNoFPClass() const
Extract a test mask for disallowed floating-point value classes for the return value.
bool cannotMerge() const
Determine if the call cannot be tail merged.
unsigned getBundleOperandsEndIndex() const
Return the index of the last bundle operand in the Use array.
bundle_op_iterator bundle_op_info_begin()
Return the start of the list of BundleOpInfo instances associated with this OperandBundleUser.
LLVM_ABI bool paramHasNonNullAttr(unsigned ArgNo, bool AllowUndefOrPoison) const
Return true if this argument has the nonnull attribute on either the CallBase instruction or the call...
LLVM_ABI MemoryEffects getMemoryEffects() const
void setDoesNotThrow()
void addRangeRetAttr(const ConstantRange &CR)
adds the range attribute to the list of attributes.
bool arg_empty() const
void addFnAttr(Attribute::AttrKind Kind)
Adds the attribute to the function.
bool hasInAllocaArgument() const
Determine if there are is an inalloca argument.
void removeParamAttrs(unsigned ArgNo, const AttributeMask &AttrsToRemove)
Removes the attributes from the given argument.
bool hasByValArgument() const
Determine if any call argument is an aggregate passed by value.
LLVM_ABI bool doesNotAccessMemory() const
Determine if the call does not access memory.
MaybeAlign getRetAlign() const
Extract the alignment of the return value.
LLVM_ABI void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
Type * getParamByRefType(unsigned ArgNo) const
Extract the byref type for a call or parameter.
LLVM_ABI void setOnlyAccessesArgMemory()
iterator_range< const_bundle_op_iterator > bundle_op_infos() const
Return the range [bundle_op_info_begin, bundle_op_info_end).
OperandBundleUse getOperandBundleAt(unsigned Index) const
Return the operand bundle at a specific index.
OperandBundleUse operandBundleFromBundleOpInfo(const BundleOpInfo &BOI) const
Simple helper function to map a BundleOpInfo to an OperandBundleUse.
bool isPassingUndefUB(unsigned ArgNo) const
Determine whether passing undef to this argument is undefined behavior.
bool hasArgument(const Value *V) const
Returns true if this CallSite passes the given Value* as an argument to the called function.
Type * getParamPreallocatedType(unsigned ArgNo) const
Extract the preallocated type for a call or parameter.
LLVM_ABI void setOnlyAccessesInaccessibleMemOrArgMem()
bool data_operands_empty() const
bool isNoBuiltin() const
Return true if the call should not be treated as a call to a builtin.
bool isOperandBundleOfType(uint32_t ID, unsigned Idx) const
Return true if the operand at index Idx is a bundle operand that has tag ID ID.
void addAttributeAtIndex(unsigned i, Attribute Attr)
adds the attribute to the list of attributes.
Bitfield::Element< CallingConv::ID, CallInstReservedField::NextBit, 10, CallingConv::MaxID > CallingConvField
unsigned getDataOperandNo(const Use *U) const
Given a use for a data operand, get the data operand number that corresponds to it.
Bitfield::Element< unsigned, 0, 2 > CallInstReservedField
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
bool doesNotCapture(unsigned OpNo) const
Determine whether this data operand is not captured.
Type * getParamStructRetType(unsigned ArgNo) const
Extract the sret type for a call or parameter.
Attribute getParamAttr(unsigned ArgNo, StringRef Kind) const
Get the attribute of a given kind from a given arg.
void removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Removes the attribute from the given argument.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
Type * getParamInAllocaType(unsigned ArgNo) const
Extract the inalloca type for a call or parameter.
bool doesNotAccessMemory(unsigned OpNo) const
void removeRetAttrs(const AttributeMask &AttrsToRemove)
Removes the attributes from the return value.
LLVM_ABI void setDoesNotAccessMemory()
bool isInAllocaArgument(unsigned ArgNo) const
Determine whether this argument is passed in an alloca.
Use & getArgOperandUse(unsigned i)
bool hasFnAttr(Attribute::AttrKind Kind) const
Determine whether this call has the given attribute.
bool isStrictFP() const
Determine if the call requires strict floating point semantics.
User::op_iterator data_operands_begin()
data_operands_begin/data_operands_end - Return iterators iterating over the call / invoke argument li...
bool cannotDuplicate() const
Determine if the invoke cannot be duplicated.
AttributeSet getParamAttributes(unsigned ArgNo) const
Return the param attributes for this call.
bool hasRetAttr(Attribute::AttrKind Kind) const
Determine whether the return value has the given attribute.
User::const_op_iterator data_operands_end() const
LLVM_ABI bool onlyAccessesInaccessibleMemory() const
Determine if the function may only access memory that is inaccessible from the IR.
unsigned getNumOperandBundles() const
Return the number of operand bundles associated with this User.
uint64_t getParamDereferenceableBytes(unsigned i) const
Extract the number of dereferenceable bytes for a call or parameter (0=unknown).
void removeAttributeAtIndex(unsigned i, StringRef Kind)
removes the attribute from the list of attributes.
unsigned getDataOperandNo(Value::const_user_iterator UI) const
Given a value use iterator, return the data operand corresponding to it.
CallingConv::ID getCallingConv() const
bundle_op_iterator bundle_op_info_end()
Return the end of the list of BundleOpInfo instances associated with this OperandBundleUser.
LLVM_ABI unsigned getNumSubclassExtraOperandsDynamic() const
Get the number of extra operands for instructions that don't have a fixed number of extra operands.
void addParamAttr(unsigned ArgNo, Attribute Attr)
Adds the attribute to the indicated argument.
BundleOpInfo * bundle_op_iterator
unsigned getNumSubclassExtraOperands() const
bool doesNoCfCheck() const
Determine if the call should not perform indirect branch tracking.
bool hasFnAttr(StringRef Kind) const
Determine whether this call has the given attribute.
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
bool hasIdenticalOperandBundleSchema(const CallBase &Other) const
Return true if Other has the same sequence of operand bundle tags with the same number of operands on...
User::const_op_iterator arg_begin() const
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
Attribute getParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Get the attribute of a given kind from a given arg.
bool hasRetAttr(StringRef Kind) const
Determine whether the return value has the given attribute.
static bool classof(const Instruction *I)
bool isDataOperand(Value::const_user_iterator UI) const
Use & getCalledOperandUse()
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
bool isNoInline() const
Return true if the call should not be inlined.
bool dataOperandHasImpliedAttr(unsigned i, Attribute::AttrKind Kind) const
Return true if the data operand at index i has the attribute A.
static constexpr int CalledOperandOpEndIdx
The last operand is the called operand.
LLVM_ABI bool onlyReadsMemory() const
Determine if the call does not access or only reads memory.
bool isBundleOperand(const Use *U) const
Returns true if the use is a bundle operand.
bool isByValArgument(unsigned ArgNo) const
Determine whether this argument is passed by value.
iterator_range< bundle_op_iterator > bundle_op_infos()
Return the range [bundle_op_info_begin, bundle_op_info_end).
bool onlyWritesMemory(unsigned OpNo) const
unsigned countOperandBundlesOfType(StringRef Name) const
Return the number of operand bundles with the tag Name attached to this instruction.
LLVM_ABI void setOnlyReadsMemory()
void removeFnAttrs(const AttributeMask &AttrsToRemove)
Removes the attributes from the function.
iterator_range< User::op_iterator > data_ops()
const_bundle_op_iterator bundle_op_info_begin() const
Return the start of the list of BundleOpInfo instances associated with this OperandBundleUser.
void setCannotMerge()
static LLVM_ABI CallBase * addOperandBundle(CallBase *CB, uint32_t ID, OperandBundleDef OB, InsertPosition InsertPt=nullptr)
Create a clone of CB with operand bundle OB added.
void maybeAddParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
bool isCallee(Value::const_user_iterator UI) const
Determine whether the passed iterator points to the callee operand's Use.
iterator_range< User::const_op_iterator > args() const
MaybeAlign getParamAlign(unsigned ArgNo) const
Extract the alignment for a call or parameter (0=unknown).
unsigned getBundleOperandsStartIndex() const
Return the index of the first bundle operand in the Use array.
LLVM_ABI bool onlyAccessesInaccessibleMemOrArgMem() const
Determine if the function may only access memory that is either inaccessible from the IR or pointed t...
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
static LLVM_ABI CallBase * removeOperandBundleAt(CallBase *CB, size_t Offset, InsertPosition InsertPtr=nullptr)
LLVM_ABI CaptureInfo getCaptureInfo(unsigned OpNo) const
Return which pointer components this operand may capture.
AttributeSet getRetAttributes() const
Return the return attributes for this call.
Attribute getFnAttr(Attribute::AttrKind Kind) const
Get the attribute of a given kind for the function.
User::op_iterator data_operands_end()
bool onlyReadsMemory(unsigned OpNo) const
void setNotConvergent()
LLVM_ABI bool hasArgumentWithAdditionalReturnCaptureComponents() const
Returns whether the call has an argument that has an attribute like captures(ret: address,...
Type * getParamByValType(unsigned ArgNo) const
Extract the byval type for a call or parameter.
bool isCallee(const Use *U) const
Determine whether this Use is the callee operand's Use.
CallBase(AttributeList const &A, FunctionType *FT, ArgsTy &&... Args)
const BundleOpInfo & getBundleOpInfoForOperand(unsigned OpIdx) const
Value * getCalledOperand() const
void setCalledFunction(FunctionCallee Fn)
Sets the function called, including updating the function type.
const Use & getCalledOperandUse() const
bool isArgOperand(Value::const_user_iterator UI) const
LLVM_ABI void setOnlyWritesMemory()
LLVM_ABI op_iterator populateBundleOperandInfos(ArrayRef< OperandBundleDef > Bundles, const unsigned BeginIndex)
Populate the BundleOpInfo instances and the Use& vector from Bundles.
void removeRetAttr(Attribute::AttrKind Kind)
Removes the attribute from the return value.
AttributeList Attrs
parameter attributes for callable
void addDereferenceableRetAttr(uint64_t Bytes)
adds the dereferenceable attribute to the list of attributes.
unsigned getArgOperandNo(Value::const_user_iterator UI) const
Given a value use iterator, return the arg operand number corresponding to it.
void setAttributes(AttributeList A)
Set the attributes for this call.
Attribute getFnAttr(StringRef Kind) const
Get the attribute of a given kind for the function.
void addAttributeAtIndex(unsigned i, Attribute::AttrKind Kind)
adds the attribute to the list of attributes.
unsigned countOperandBundlesOfType(uint32_t ID) const
Return the number of operand bundles with the tag ID attached to this instruction.
const Use & getArgOperandUse(unsigned i) const
Wrappers for getting the Use of a call argument.
bool hasOperandBundlesOtherThan(ArrayRef< uint32_t > IDs) const
Return true if this operand bundle user contains operand bundles with tags other than those specified...
bool returnDoesNotAlias() const
Determine if the return value is marked with NoAlias attribute.
OperandBundleUse getOperandBundleForOperand(unsigned OpIdx) const
Return the operand bundle for the operand at index OpIdx.
LLVM_ABI std::optional< ConstantRange > getRange() const
If this return value has a range attribute, return the value range of the argument.
bool doesNotThrow() const
Determine if the call cannot unwind.
void addRetAttr(Attribute::AttrKind Kind)
Adds the attribute to the return value.
Type * getParamElementType(unsigned ArgNo) const
Extract the elementtype type for a parameter.
LLVM_ABI bool isReturnNonNull() const
Return true if the return value is known to be not null.
Value * getArgOperand(unsigned i) const
FunctionType * FTy
bool hasStructRetAttr() const
Determine if the call returns a structure through first pointer argument.
uint64_t getRetDereferenceableBytes() const
Extract the number of dereferenceable bytes for a call or parameter (0=unknown).
void removeAttributeAtIndex(unsigned i, Attribute::AttrKind Kind)
removes the attribute from the list of attributes.
void setCannotDuplicate()
User::const_op_iterator data_operands_begin() const
void mutateFunctionType(FunctionType *FTy)
void addRetAttrs(const AttrBuilder &B)
Adds attributes to the return value.
uint64_t getParamDereferenceableOrNullBytes(unsigned i) const
Extract the number of dereferenceable_or_null bytes for a parameter (0=unknown).
void setArgOperand(unsigned i, Value *v)
Attribute getAttributeAtIndex(unsigned i, Attribute::AttrKind Kind) const
Get the attribute of a given kind at a position.
bool bundleOperandHasAttr(unsigned OpIdx, Attribute::AttrKind A) const
Return true if the bundle operand at index OpIdx has the attribute A.
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
bool isBundleOperand(unsigned Idx) const
Return true if the operand at index Idx is a bundle operand.
bool isConvergent() const
Determine if the invoke is convergent.
FunctionType * getFunctionType() const
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
void setIsNoInline()
static unsigned CountBundleInputs(ArrayRef< OperandBundleDef > Bundles)
Return the total number of values used in Bundles.
LLVM_ABI Value * getArgOperandWithAttribute(Attribute::AttrKind Kind) const
If one of the arguments has the specified attribute, returns its operand value.
Value * getReturnedArgOperand() const
If one of the arguments has the 'returned' attribute, returns its operand value.
LLVM_ABI void setOnlyAccessesInaccessibleMemory()
static LLVM_ABI CallBase * Create(CallBase *CB, ArrayRef< OperandBundleDef > Bundles, InsertPosition InsertPt=nullptr)
Create a clone of CB with a different set of operand bundles and insert it before InsertPt.
LLVM_ABI bool onlyWritesMemory() const
Determine if the call does not access or only writes memory.
unsigned data_operands_size() const
void removeFnAttr(Attribute::AttrKind Kind)
Removes the attribute from the function.
uint64_t getRetDereferenceableOrNullBytes() const
Extract the number of dereferenceable_or_null bytes for a call (0=unknown).
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned getArgOperandNo(const Use *U) const
Given a use for a arg operand, get the arg operand number that corresponds to it.
bool isBundleOperand(Value::const_user_iterator UI) const
LLVM_ABI bool hasClobberingOperandBundles() const
Return true if this operand bundle user has operand bundles that may write to the heap.
static bool classof(const Value *V)
Value * getConvergenceControlToken() const
Return the convergence control token for this call, if it exists.
void setCalledOperand(Value *V)
void addParamAttrs(unsigned ArgNo, const AttrBuilder &B)
Adds attributes to the indicated argument.
static LLVM_ABI CallBase * removeOperandBundle(CallBase *CB, uint32_t ID, InsertPosition InsertPt=nullptr)
Create a clone of CB with operand bundle ID removed.
bool doesNotReturn() const
Determine if the call cannot return.
LLVM_ABI bool hasReadingOperandBundles() const
Return true if this operand bundle user has operand bundles that may read from the heap.
void removeFnAttr(StringRef Kind)
Removes the attribute from the function.
void setConvergent()
LLVM_ABI bool onlyAccessesArgMemory() const
Determine if the call can access memmory only using pointers based on its arguments.
unsigned arg_size() const
void addDereferenceableParamAttr(unsigned i, uint64_t Bytes)
adds the dereferenceable attribute to the list of attributes.
AttributeList getAttributes() const
Return the attributes for this call.
std::optional< OperandBundleUse > getOperandBundle(uint32_t ID) const
Return an operand bundle by tag ID, if present.
void addRetAttr(Attribute Attr)
Adds the attribute to the return value.
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
iterator_range< User::const_op_iterator > data_ops() const
Instruction(const Instruction &)=delete
bool isArgOperand(const Use *U) const
bool isDataOperand(const Use *U) const
bool hasDeoptState() const
Return true if the call has deopt state bundle.
LLVM_ABI void setMemoryEffects(MemoryEffects ME)
bool hasOperandBundles() const
Return true if this User has any operand bundles.
void setCalledFunction(Function *Fn)
Sets the function called, including updating the function type.
const_bundle_op_iterator bundle_op_info_end() const
Return the end of the list of BundleOpInfo instances associated with this OperandBundleUser.
bool isPassPointeeByValueArgument(unsigned ArgNo) const
Determine whether this argument is passed by value, in an alloca, or is preallocated.
LLVM_ABI bool isTailCall() const
Tests if this call site is marked as a tail call.
const Function * getCaller() const
void removeParamAttr(unsigned ArgNo, StringRef Kind)
Removes the attribute from the given argument.
User::const_op_iterator arg_end() const
LLVM_ABI Function * getCaller()
Helper to get the caller (the parent function).
bool tryIntersectAttributes(const CallBase *Other)
Try to intersect the attributes from 'this' CallBase and the 'Other' CallBase.
const BundleOpInfo * const_bundle_op_iterator
unsigned getNumTotalBundleOperands() const
Return the total number operands (not operand bundles) used by every operand bundle in this OperandBu...
Attribute getAttributeAtIndex(unsigned i, StringRef Kind) const
Get the attribute of a given kind at a position.
Represents which components of the pointer may be captured in which location.
Definition ModRef.h:414
This is the base class for all instructions that perform data casts.
Definition InstrTypes.h:512
Type * getSrcTy() const
Return the source type, as a convenience.
Definition InstrTypes.h:679
static LLVM_ABI Instruction::CastOps getCastOpcode(const Value *Val, bool SrcIsSigned, Type *Ty, bool DstIsSigned)
Returns the opcode necessary to cast Val into Ty using usual casting rules.
static LLVM_ABI CastInst * CreatePointerBitCastOrAddrSpaceCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast or an AddrSpaceCast cast instruction.
Instruction::CastOps getOpcode() const
Return the opcode of this CastInst.
Definition InstrTypes.h:674
static LLVM_ABI unsigned isEliminableCastPair(Instruction::CastOps firstOpcode, Instruction::CastOps secondOpcode, Type *SrcTy, Type *MidTy, Type *DstTy, const DataLayout *DL)
Determine how a pair of casts can be eliminated, if they can be at all.
static bool classof(const Value *V)
Definition InstrTypes.h:697
static LLVM_ABI CastInst * CreateIntegerCast(Value *S, Type *Ty, bool isSigned, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a ZExt, BitCast, or Trunc for int -> int casts.
static LLVM_ABI CastInst * CreateFPCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create an FPExt, BitCast, or FPTrunc for fp -> fp casts.
CastInst(Type *Ty, unsigned iType, Value *S, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics for subclasses.
Definition InstrTypes.h:515
static LLVM_ABI bool isBitOrNoopPointerCastable(Type *SrcTy, Type *DestTy, const DataLayout &DL)
Check whether a bitcast, inttoptr, or ptrtoint cast between these types is valid and a no-op.
static bool castIsValid(Instruction::CastOps op, Value *S, Type *DstTy)
Definition InstrTypes.h:689
static LLVM_ABI bool isBitCastable(Type *SrcTy, Type *DestTy)
Check whether a bitcast between these types is valid.
static LLVM_ABI CastInst * CreateTruncOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a Trunc or BitCast cast instruction.
static LLVM_ABI CastInst * CreatePointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, AddrSpaceCast or a PtrToInt cast instruction.
static LLVM_ABI CastInst * CreateBitOrPointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, a PtrToInt, or an IntToPTr cast instruction.
static LLVM_ABI bool isNoopCast(Instruction::CastOps Opcode, Type *SrcTy, Type *DstTy, const DataLayout &DL)
A no-op cast is one that can be effected without changing any bits.
static LLVM_ABI CastInst * CreateZExtOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a ZExt or BitCast cast instruction.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
LLVM_ABI bool isIntegerCast() const
There are several places where we need to know if a cast instruction only deals with integer source a...
Type * getDestTy() const
Return the destination type, as a convenience.
Definition InstrTypes.h:681
static LLVM_ABI CastInst * CreateSExtOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a SExt or BitCast cast instruction.
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition InstrTypes.h:694
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition InstrTypes.h:921
bool isEquality() const
Determine if this is an equals/not equals predicate.
Definition InstrTypes.h:978
void setPredicate(Predicate P)
Set the predicate for this instruction to the specified value.
Definition InstrTypes.h:831
bool isFalseWhenEqual() const
This is just a convenience.
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:743
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:757
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:746
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:755
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:744
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:745
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:754
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:752
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:747
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:749
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:756
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:753
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:742
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:750
static auto ICmpPredicates()
Returns the sequence of all ICmp predicates.
Definition InstrTypes.h:786
LLVM_ABI bool isEquivalence(bool Invert=false) const
Determine if one operand of this compare can always be replaced by the other operand,...
bool isSigned() const
Definition InstrTypes.h:993
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
static auto FCmpPredicates()
Returns the sequence of all FCmp predicates.
Definition InstrTypes.h:779
Bitfield::Element< Predicate, 0, 6, LAST_ICMP_PREDICATE > PredicateField
Definition InstrTypes.h:775
bool isTrueWhenEqual() const
This is just a convenience.
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
Predicate getOrderedPredicate() const
Definition InstrTypes.h:863
static bool isFPPredicate(Predicate P)
Definition InstrTypes.h:833
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition InstrTypes.h:934
static LLVM_ABI CmpInst * CreateWithCopiedFlags(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Instruction *FlagsSource, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate, the two operands and the instructio...
LLVM_ABI CmpInst(Type *ty, Instruction::OtherOps op, Predicate pred, Value *LHS, Value *RHS, const Twine &Name="", InsertPosition InsertBefore=nullptr)
bool isNonStrictPredicate() const
Definition InstrTypes.h:915
bool isFPPredicate() const
Definition InstrTypes.h:845
LLVM_ABI void swapOperands()
This is just a convenience that dispatches to the subclasses.
static bool isRelational(Predicate P)
Return true if the predicate is relational (not EQ or NE).
Definition InstrTypes.h:986
static bool isUnsigned(Predicate Pred)
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
static LLVM_ABI StringRef getPredicateName(Predicate P)
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
bool isStrictPredicate() const
Definition InstrTypes.h:906
static LLVM_ABI bool isUnordered(Predicate predicate)
Determine if the predicate is an unordered operation.
Predicate getFlippedStrictnessPredicate() const
For predicate of kind "is X or equal to 0" returns the predicate "is X".
Definition InstrTypes.h:956
static Predicate getOrderedPredicate(Predicate Pred)
Returns the ordered variant of a floating point compare.
Definition InstrTypes.h:859
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Provide more efficient getOperand methods.
static bool isSigned(Predicate Pred)
bool isIntPredicate() const
Definition InstrTypes.h:846
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:839
Predicate getUnorderedPredicate() const
Definition InstrTypes.h:874
static LLVM_ABI bool isOrdered(Predicate predicate)
Determine if the predicate is an ordered operation.
static bool classof(const Value *V)
bool isUnsigned() const
Definition InstrTypes.h:999
static Predicate getUnorderedPredicate(Predicate Pred)
Returns the unordered variant of a floating point compare.
Definition InstrTypes.h:870
OtherOps getOpcode() const
Get the opcode casted to the right type.
Definition InstrTypes.h:823
LLVM_ABI bool isCommutative() const
This is just a convenience that dispatches to the subclasses.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Definition InstrTypes.h:989
This class represents a range of values.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
This provides a helper for copying FMF from an instruction or setting specified flags.
Definition IRBuilder.h:93
Binary operators support fast-math flags, users should not use this class directly,...
Definition InstrTypes.h:476
static bool classof(const Value *V)
Definition InstrTypes.h:497
friend class BinaryOperator
Definition InstrTypes.h:479
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition InstrTypes.h:478
static bool classof(const Instruction *I)
Definition InstrTypes.h:484
Unary operators support fast-math flags, users should not use this class directly,...
Definition InstrTypes.h:179
friend class UnaryOperator
Definition InstrTypes.h:182
static bool classof(const Instruction *I)
Definition InstrTypes.h:189
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition InstrTypes.h:181
static bool classof(const Value *V)
Definition InstrTypes.h:197
Provide fast-math flags storage, instructions that support fast-math flags should inherit from this c...
Definition InstrTypes.h:56
friend class FPMathOperator
Definition InstrTypes.h:57
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
static bool classof(const Instruction *I)
op_range arg_operands()
arg_operands - iteration adapter for range-for loops.
void setArgOperand(unsigned i, Value *v)
unsigned arg_size() const
arg_size - Return the number of funcletpad arguments.
static bool classof(const Value *V)
void setParentPad(Value *ParentPad)
friend class CatchPadInst
friend class Instruction
Iterator for Instructions in a `BasicBlock.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Provide fast operand accessors.
Value * getParentPad() const
Convenience accessors.
LLVM_ABI FuncletPadInst * cloneImpl() const
friend class CleanupPadInst
const_op_range arg_operands() const
arg_operands - iteration adapter for range-for loops.
Value * getArgOperand(unsigned i) const
getArgOperand/setArgOperand - Return/set the i-th funcletpad argument.
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
FunctionType * getFunctionType()
Class to represent function types.
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:212
BitfieldElement::Type getSubclassData() const
LLVM_ABI void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI void copyIRFlags(const Value *V, bool IncludeWrapFlags=true)
Convenience method to copy supported exact, fast-math, and (optionally) wrapping flags from V to this...
LLVM_ABI void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
Instruction(const Instruction &)=delete
friend class Value
void setSubclassData(typename BitfieldElement::Type Value)
A container for an operand bundle being viewed as a set of values rather than a set of uses.
size_t input_size() const
input_iterator input_end() const
OperandBundleDefT(const OperandBundleUse &OBU)
ArrayRef< InputTy > inputs() const
typename std::vector< Value * >::const_iterator input_iterator
OperandBundleDefT(std::string Tag, std::vector< InputTy > Inputs)
input_iterator input_begin() const
StringRef getTag() const
OperandBundleDefT(std::string Tag, ArrayRef< InputTy > Inputs)
An or instruction, which can be marked as "disjoint", indicating that the inputs don't have a 1 in th...
Definition InstrTypes.h:439
static bool classof(const Value *V)
Definition InstrTypes.h:454
static bool classof(const Instruction *I)
Definition InstrTypes.h:450
Instruction that can have a nneg flag (zext/uitofp).
Definition InstrTypes.h:703
static bool classof(const Instruction *I)
Definition InstrTypes.h:707
static bool classof(const Value *V)
Definition InstrTypes.h:717
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StringMapEntry - This is used to represent one value that is inserted into a StringMap.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:296
static bool classof(const Instruction *I)
Definition InstrTypes.h:86
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
static bool classof(const Value *V)
Definition InstrTypes.h:94
UnaryInstruction(Type *Ty, unsigned iType, Value *V, InsertPosition InsertBefore=nullptr)
Definition InstrTypes.h:71
static LLVM_ABI UnaryOperator * Create(UnaryOps Op, Value *S, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a unary instruction, given the opcode and an operand.
LLVM_ABI UnaryOperator(UnaryOps iType, Value *S, Type *Ty, const Twine &Name, InsertPosition InsertBefore)
LLVM_ABI UnaryOperator * cloneImpl() const
static UnaryOperator * CreateWithCopiedFlags(UnaryOps Opc, Value *V, Instruction *CopyO, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Definition InstrTypes.h:148
UnaryOps getOpcode() const
Definition InstrTypes.h:163
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition InstrTypes.h:118
static UnaryOperator * CreateFNegFMF(Value *Op, Instruction *FMFSource, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Definition InstrTypes.h:156
static bool classof(const Value *V)
Definition InstrTypes.h:171
static bool classof(const Instruction *I)
Definition InstrTypes.h:168
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
iterator_range< const_op_iterator > const_op_range
Definition User.h:257
Use * op_iterator
Definition User.h:254
op_iterator op_begin()
Definition User.h:259
const Use & getOperandUse(unsigned i) const
Definition User.h:220
LLVM_ABI ArrayRef< const uint8_t > getDescriptor() const
Returns the descriptor co-allocated with this User instance.
Definition User.cpp:103
void setOperand(unsigned i, Value *Val)
Definition User.h:212
const Use * const_op_iterator
Definition User.h:255
iterator_range< op_iterator > op_range
Definition User.h:256
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
op_iterator op_end()
Definition User.h:261
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
user_iterator_impl< const User > const_user_iterator
Definition Value.h:394
unsigned char SubclassOptionalData
Hold arbitary subclass data.
Definition Value.h:85
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Definition Value.cpp:394
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
void setValueSubclassData(unsigned short D)
Definition Value.h:861
void mutateType(Type *Ty)
Mutate the type of this Value to be of the specified type.
Definition Value.h:809
unsigned HasDescriptor
Definition Value.h:115
Base class of all SIMD vector types.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ MaxID
The highest possible ID. Must be some 2^k - 1.
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2224
constexpr force_iteration_on_noniterable_enum_t force_iteration_on_noniterable_enum
Definition Sequence.h:110
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
Definition ModRef.h:356
auto map_range(ContainerTy &&C, FuncTy F)
Return a range that applies F to the elements of C.
Definition STLExtras.h:366
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
constexpr auto enum_seq_inclusive(EnumT Begin, EnumT End)
Iterate over an enum type from Begin to End inclusive.
Definition Sequence.h:401
@ Other
Any other memory.
Definition ModRef.h:68
OperandBundleDefT< Value * > OperandBundleDef
Definition AutoUpgrade.h:34
@ Or
Bitwise or logical OR of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
DWARFExpression::Operation Op
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1933
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
bool capturesNothing(CaptureComponents CC)
Definition ModRef.h:375
OperandBundleDefT< const Value * > ConstOperandBundleDef
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Describes an element of a Bitfield.
Definition Bitfields.h:176
static constexpr unsigned NextBit
Definition Bitfields.h:184
static constexpr bool areContiguous()
Definition Bitfields.h:233
Used to keep track of an operand bundle.
bool operator==(const BundleOpInfo &Other) const
StringMapEntry< uint32_t > * Tag
The operand bundle tag, interned by LLVMContextImpl::getOrInsertBundleTag.
uint32_t End
The index in the Use& vector where operands for this operand bundle ends.
uint32_t Begin
The index in the Use& vector where operands for this operand bundle starts.
FixedNumOperandTraits - determine the allocation regime of the Use array when it is a prefix to the U...
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
A lightweight accessor for an operand bundle meant to be passed around by value.
bool isFuncletOperandBundle() const
Return true if this is a "funclet" operand bundle.
StringRef getTagName() const
Return the tag of this operand bundle as a string.
bool isDeoptOperandBundle() const
Return true if this is a "deopt" operand bundle.
OperandBundleUse(StringMapEntry< uint32_t > *Tag, ArrayRef< Use > Inputs)
uint32_t getTagID() const
Return the tag of this operand bundle as an integer.
ArrayRef< Use > Inputs
bool operandHasAttr(unsigned Idx, Attribute::AttrKind A) const
Return true if the operand at index Idx in this operand bundle has the attribute A.
bool isCFGuardTargetOperandBundle() const
Return true if this is a "cfguardtarget" operand bundle.
Compile-time customization of User operands.
Definition User.h:42
Information about how a User object was allocated, to be passed into the User constructor.
Definition User.h:79
Indicates this User has operands co-allocated.
Definition User.h:60
VariadicOperandTraits - determine the allocation regime of the Use array when it is a prefix to the U...