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