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