Line data Source code
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"
23 : #include "llvm/ADT/iterator_range.h"
24 : #include "llvm/IR/Attributes.h"
25 : #include "llvm/IR/CallingConv.h"
26 : #include "llvm/IR/DerivedTypes.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"
31 : #include "llvm/IR/OperandTraits.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 :
42 : namespace llvm {
43 :
44 : class StringRef;
45 : class Type;
46 : class Value;
47 : class ConstantRange;
48 :
49 : namespace Intrinsic {
50 : typedef unsigned ID;
51 : }
52 :
53 : //===----------------------------------------------------------------------===//
54 : // UnaryInstruction Class
55 : //===----------------------------------------------------------------------===//
56 :
57 : class UnaryInstruction : public Instruction {
58 : protected:
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 :
73 : public:
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.
79 : DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
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 :
95 : template <>
96 : struct OperandTraits<UnaryInstruction> :
97 : public FixedNumOperandTraits<UnaryInstruction, 1> {
98 : };
99 :
100 : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(UnaryInstruction, Value)
101 :
102 : //===----------------------------------------------------------------------===//
103 : // UnaryOperator Class
104 : //===----------------------------------------------------------------------===//
105 :
106 : class UnaryOperator : public UnaryInstruction {
107 : void AssertOK();
108 :
109 : protected:
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 :
118 : public:
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 *
156 : CreateWithCopiedFlags(UnaryOps Opc, Value *V, Instruction *CopyO,
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 :
164 : static UnaryOperator *CreateFNegFMF(Value *Op, Instruction *FMFSource,
165 : const Twine &Name = "",
166 : InsertPosition InsertBefore = nullptr) {
167 : return CreateWithCopiedFlags(Instruction::FNeg, Op, FMFSource, Name,
168 : InsertBefore);
169 : }
170 :
171 : UnaryOps getOpcode() const {
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 :
188 : class BinaryOperator : public Instruction {
189 : void AssertOK();
190 :
191 : protected:
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 :
200 : public:
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.
206 : DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
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 : ///
213 : static BinaryOperator *Create(BinaryOps Op, Value *S1, Value *S2,
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 *
246 : CreateWithCopiedFlags(BinaryOps Opc, Value *V1, Value *V2, Value *CopyO,
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 :
254 : static BinaryOperator *CreateWithFMF(BinaryOps Opc, Value *V1, Value *V2,
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 :
263 : static BinaryOperator *CreateFAddFMF(Value *V1, Value *V2, FastMathFlags FMF,
264 : const Twine &Name = "") {
265 : return CreateWithFMF(Instruction::FAdd, V1, V2, FMF, Name);
266 : }
267 : static BinaryOperator *CreateFSubFMF(Value *V1, Value *V2, FastMathFlags FMF,
268 : const Twine &Name = "") {
269 : return CreateWithFMF(Instruction::FSub, V1, V2, FMF, Name);
270 : }
271 : static BinaryOperator *CreateFMulFMF(Value *V1, Value *V2, FastMathFlags FMF,
272 : const Twine &Name = "") {
273 : return CreateWithFMF(Instruction::FMul, V1, V2, FMF, Name);
274 : }
275 : static BinaryOperator *CreateFDivFMF(Value *V1, Value *V2, FastMathFlags FMF,
276 : const Twine &Name = "") {
277 : return CreateWithFMF(Instruction::FDiv, V1, V2, FMF, Name);
278 : }
279 :
280 : static BinaryOperator *CreateFAddFMF(Value *V1, Value *V2,
281 : Instruction *FMFSource,
282 : const Twine &Name = "") {
283 : return CreateWithCopiedFlags(Instruction::FAdd, V1, V2, FMFSource, Name);
284 : }
285 : static BinaryOperator *CreateFSubFMF(Value *V1, Value *V2,
286 : Instruction *FMFSource,
287 : const Twine &Name = "") {
288 : return CreateWithCopiedFlags(Instruction::FSub, V1, V2, FMFSource, Name);
289 : }
290 : static BinaryOperator *CreateFMulFMF(Value *V1, Value *V2,
291 : Instruction *FMFSource,
292 : const Twine &Name = "") {
293 : return CreateWithCopiedFlags(Instruction::FMul, V1, V2, FMFSource, Name);
294 : }
295 : static BinaryOperator *CreateFDivFMF(Value *V1, Value *V2,
296 : Instruction *FMFSource,
297 : const Twine &Name = "") {
298 : return CreateWithCopiedFlags(Instruction::FDiv, V1, V2, FMFSource, Name);
299 : }
300 : static BinaryOperator *CreateFRemFMF(Value *V1, Value *V2,
301 : Instruction *FMFSource,
302 : const Twine &Name = "") {
303 : return CreateWithCopiedFlags(Instruction::FRem, V1, V2, FMFSource, Name);
304 : }
305 :
306 : static BinaryOperator *CreateNSW(BinaryOps Opc, Value *V1, Value *V2,
307 : const Twine &Name = "") {
308 : BinaryOperator *BO = Create(Opc, V1, V2, Name);
309 : BO->setHasNoSignedWrap(true);
310 : return BO;
311 : }
312 : static BinaryOperator *CreateNSW(BinaryOps Opc, Value *V1, Value *V2,
313 : const Twine &Name, BasicBlock *BB) {
314 : BinaryOperator *BO = Create(Opc, V1, V2, Name, BB);
315 : BO->setHasNoSignedWrap(true);
316 : return BO;
317 : }
318 : static BinaryOperator *CreateNSW(BinaryOps Opc, Value *V1, Value *V2,
319 : const Twine &Name, Instruction *I) {
320 : BinaryOperator *BO = Create(Opc, V1, V2, Name, I);
321 : BO->setHasNoSignedWrap(true);
322 : return BO;
323 : }
324 : static BinaryOperator *CreateNSW(BinaryOps Opc, Value *V1, Value *V2,
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 :
331 : static BinaryOperator *CreateNUW(BinaryOps Opc, Value *V1, Value *V2,
332 : const Twine &Name = "") {
333 : BinaryOperator *BO = Create(Opc, V1, V2, Name);
334 : BO->setHasNoUnsignedWrap(true);
335 : return BO;
336 : }
337 : static BinaryOperator *CreateNUW(BinaryOps Opc, Value *V1, Value *V2,
338 : const Twine &Name, BasicBlock *BB) {
339 : BinaryOperator *BO = Create(Opc, V1, V2, Name, BB);
340 : BO->setHasNoUnsignedWrap(true);
341 : return BO;
342 : }
343 : static BinaryOperator *CreateNUW(BinaryOps Opc, Value *V1, Value *V2,
344 : const Twine &Name, Instruction *I) {
345 : BinaryOperator *BO = Create(Opc, V1, V2, Name, I);
346 : BO->setHasNoUnsignedWrap(true);
347 : return BO;
348 : }
349 : static BinaryOperator *CreateNUW(BinaryOps Opc, Value *V1, Value *V2,
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 :
356 : static BinaryOperator *CreateExact(BinaryOps Opc, Value *V1, Value *V2,
357 : const Twine &Name = "") {
358 : BinaryOperator *BO = Create(Opc, V1, V2, Name);
359 : BO->setIsExact(true);
360 : return BO;
361 : }
362 : static BinaryOperator *CreateExact(BinaryOps Opc, Value *V1, Value *V2,
363 : const Twine &Name, BasicBlock *BB) {
364 : BinaryOperator *BO = Create(Opc, V1, V2, Name, BB);
365 : BO->setIsExact(true);
366 : return BO;
367 : }
368 : static BinaryOperator *CreateExact(BinaryOps Opc, Value *V1, Value *V2,
369 : const Twine &Name, Instruction *I) {
370 : BinaryOperator *BO = Create(Opc, V1, V2, Name, I);
371 : BO->setIsExact(true);
372 : return BO;
373 : }
374 : static BinaryOperator *CreateExact(BinaryOps Opc, Value *V1, Value *V2,
375 : const Twine &Name,
376 : BasicBlock::iterator It) {
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,
392 : BasicBlock::iterator It);
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 :
442 : BinaryOps getOpcode() const {
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 :
462 : template <>
463 : struct OperandTraits<BinaryOperator> :
464 : public FixedNumOperandTraits<BinaryOperator, 2> {
465 : };
466 :
467 : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(BinaryOperator, Value)
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.
472 : class PossiblyDisjointInst : public BinaryOperator {
473 : public:
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 :
492 : BinaryOperator *BinaryOperator::CreateDisjoint(BinaryOps Opc, Value *V1,
493 : Value *V2, const Twine &Name) {
494 : BinaryOperator *BO = Create(Opc, V1, V2, Name);
495 : cast<PossiblyDisjointInst>(BO)->setIsDisjoint(true);
496 : return BO;
497 : }
498 : BinaryOperator *BinaryOperator::CreateDisjoint(BinaryOps Opc, Value *V1,
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 : }
505 : BinaryOperator *BinaryOperator::CreateDisjoint(BinaryOps Opc, Value *V1,
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 : }
512 : BinaryOperator *BinaryOperator::CreateDisjoint(BinaryOps Opc, Value *V1,
513 : Value *V2, const Twine &Name,
514 : BasicBlock::iterator It) {
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.
530 : class CastInst : public UnaryInstruction {
531 : protected:
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 :
539 : public:
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
555 : static CastInst *CreateZExtOrBitCast(
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
563 : static CastInst *CreateSExtOrBitCast(
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.
571 : static CastInst *CreatePointerCast(
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.
579 : static CastInst *CreatePointerBitCastOrAddrSpaceCast(
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.
592 : static CastInst *CreateBitOrPointerCast(
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.
600 : static CastInst *CreateIntegerCast(
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
617 : static CastInst *CreateTruncOrBitCast(
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
643 : static Instruction::CastOps getCastOpcode(
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
694 : Instruction::CastOps getOpcode() const {
695 : return Instruction::CastOps(Instruction::getOpcode());
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).
722 : class PossiblyNonNegInst : public CastInst {
723 : public:
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.
747 : class CmpInst : public Instruction {
748 : public:
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)
775 : FIRST_FCMP_PREDICATE = FCMP_FALSE,
776 : LAST_FCMP_PREDICATE = FCMP_TRUE,
777 : BAD_FCMP_PREDICATE = FCMP_TRUE + 1,
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
788 : FIRST_ICMP_PREDICATE = ICMP_EQ,
789 : LAST_ICMP_PREDICATE = ICMP_SLE,
790 : BAD_ICMP_PREDICATE = ICMP_SLE + 1
791 : };
792 : using PredicateField =
793 : Bitfield::Element<Predicate, 0, 6, LAST_ICMP_PREDICATE>;
794 :
795 : /// Returns the sequence of all FCmp predicates.
796 : static auto FCmpPredicates() {
797 : return enum_seq_inclusive(Predicate::FIRST_FCMP_PREDICATE,
798 : Predicate::LAST_FCMP_PREDICATE,
799 : force_iteration_on_noniterable_enum);
800 : }
801 :
802 : /// Returns the sequence of all ICmp predicates.
803 : static auto ICmpPredicates() {
804 : return enum_seq_inclusive(Predicate::FIRST_ICMP_PREDICATE,
805 : Predicate::LAST_ICMP_PREDICATE,
806 : force_iteration_on_noniterable_enum);
807 : }
808 :
809 : protected:
810 : CmpInst(Type *ty, Instruction::OtherOps op, Predicate pred, Value *LHS,
811 : Value *RHS, const Twine &Name = "",
812 : InsertPosition InsertBefore = nullptr,
813 : Instruction *FlagsSource = nullptr);
814 :
815 : public:
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
835 : static CmpInst *CreateWithCopiedFlags(OtherOps Op, Predicate Pred, Value *S1,
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
842 : OtherOps getOpcode() const {
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 :
858 : static bool isIntPredicate(Predicate P) {
859 : return P >= FIRST_ICMP_PREDICATE && P <= LAST_ICMP_PREDICATE;
860 : }
861 :
862 : static StringRef getPredicateName(Predicate P);
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.
871 : Predicate getInversePredicate() const {
872 : return getInversePredicate(getPredicate());
873 : }
874 :
875 : /// Returns the ordered variant of a floating point compare.
876 : ///
877 : /// For example, UEQ -> OEQ, ULT -> OLT, OEQ -> OEQ
878 : static Predicate getOrderedPredicate(Predicate Pred) {
879 : return static_cast<Predicate>(Pred & FCMP_ORD);
880 : }
881 :
882 : Predicate getOrderedPredicate() const {
883 : return getOrderedPredicate(getPredicate());
884 : }
885 :
886 : /// Returns the unordered variant of a floating point compare.
887 : ///
888 : /// For example, OEQ -> UEQ, OLT -> ULT, OEQ -> UEQ
889 : static Predicate getUnorderedPredicate(Predicate Pred) {
890 : return static_cast<Predicate>(Pred | FCMP_UNO);
891 : }
892 :
893 : Predicate getUnorderedPredicate() const {
894 : return getUnorderedPredicate(getPredicate());
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
901 : static Predicate getInversePredicate(Predicate pred);
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
909 : Predicate getSwappedPredicate() const {
910 : return getSwappedPredicate(getPredicate());
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.
916 : static Predicate getSwappedPredicate(Predicate pred);
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.
925 : bool isStrictPredicate() const { return isStrictPredicate(getPredicate()); }
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 {
935 : return isNonStrictPredicate(getPredicate());
936 : }
937 :
938 : /// For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
939 : /// Returns the strict version of non-strict comparisons.
940 : Predicate getStrictPredicate() const {
941 : return getStrictPredicate(getPredicate());
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.
949 : static Predicate getStrictPredicate(Predicate pred);
950 :
951 : /// For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
952 : /// Returns the non-strict version of strict comparisons.
953 : Predicate getNonStrictPredicate() const {
954 : return getNonStrictPredicate(getPredicate());
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.
962 : static Predicate getNonStrictPredicate(Predicate pred);
963 :
964 : /// This is a static version that you can use without an instruction
965 : /// available.
966 : /// Return the flipped strictness of predicate
967 : static Predicate getFlippedStrictnessPredicate(Predicate pred);
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
975 : Predicate getFlippedStrictnessPredicate() const {
976 : return getFlippedStrictnessPredicate(getPredicate());
977 : }
978 :
979 : /// Provide more efficient getOperand methods.
980 : DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
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
1020 : static Predicate getSignedPredicate(Predicate pred);
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
1026 : Predicate getSignedPredicate() {
1027 : return getSignedPredicate(getPredicate());
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.
1032 : static Predicate getUnsignedPredicate(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
1038 : Predicate getUnsignedPredicate() {
1039 : return getUnsignedPredicate(getPredicate());
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.
1045 : static Predicate getFlippedSignednessPredicate(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.
1050 : Predicate getFlippedSignednessPredicate() {
1051 : return getFlippedSignednessPredicate(getPredicate());
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 {
1063 : return isFalseWhenEqual(getPredicate());
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 :
1112 : private:
1113 : // Shadow Value::setValueSubclassData with a private forwarding method so that
1114 : // subclasses cannot accidentally use it.
1115 : void setValueSubclassData(unsigned short D) {
1116 : Value::setValueSubclassData(D);
1117 : }
1118 : };
1119 :
1120 : // FIXME: these are redundant if CmpInst < BinaryOperator
1121 : template <>
1122 : struct OperandTraits<CmpInst> : public FixedNumOperandTraits<CmpInst, 2> {
1123 : };
1124 :
1125 : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CmpInst, Value)
1126 :
1127 : raw_ostream &operator<<(raw_ostream &OS, CmpInst::Predicate Pred);
1128 :
1129 : /// A lightweight accessor for an operand bundle meant to be passed
1130 : /// around by value.
1131 : struct OperandBundleUse {
1132 : ArrayRef<Use> Inputs;
1133 :
1134 : OperandBundleUse() = default;
1135 : explicit OperandBundleUse(StringMapEntry<uint32_t> *Tag, ArrayRef<Use> Inputs)
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 {
1141 : if (isDeoptOperandBundle())
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.
1150 : StringRef getTagName() const {
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.
1159 : uint32_t getTagID() const {
1160 : return Tag->getValue();
1161 : }
1162 :
1163 : /// Return true if this is a "deopt" operand bundle.
1164 : bool isDeoptOperandBundle() const {
1165 : return getTagID() == LLVMContext::OB_deopt;
1166 : }
1167 :
1168 : /// Return true if this is a "funclet" operand bundle.
1169 : bool isFuncletOperandBundle() const {
1170 : return getTagID() == LLVMContext::OB_funclet;
1171 : }
1172 :
1173 : /// Return true if this is a "cfguardtarget" operand bundle.
1174 : bool isCFGuardTargetOperandBundle() const {
1175 : return getTagID() == LLVMContext::OB_cfguardtarget;
1176 : }
1177 :
1178 : private:
1179 : /// Pointer to an entry in LLVMContextImpl::getOrInsertBundleTag.
1180 : StringMapEntry<uint32_t> *Tag;
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.
1189 : template <typename InputTy> class OperandBundleDefT {
1190 : std::string Tag;
1191 : std::vector<InputTy> Inputs;
1192 :
1193 : public:
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 :
1199 : explicit OperandBundleDefT(const OperandBundleUse &OBU) {
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 0 : 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 :
1215 : using OperandBundleDef = OperandBundleDefT<Value *>;
1216 : using ConstOperandBundleDef = OperandBundleDefT<const 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.
1236 : class CallBase : public Instruction {
1237 : protected:
1238 : // The first two bits are reserved by CallInst for fast retrieval,
1239 : using CallInstReservedField = Bitfield::Element<unsigned, 0, 2>;
1240 : using CallingConvField =
1241 : Bitfield::Element<CallingConv::ID, CallInstReservedField::NextBit, 10,
1242 : CallingConv::MaxID>;
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
1251 : FunctionType *FTy;
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 :
1257 : using Instruction::Instruction;
1258 :
1259 : bool hasDescriptor() const { return Value::HasDescriptor; }
1260 :
1261 : unsigned getNumSubclassExtraOperands() const {
1262 : switch (getOpcode()) {
1263 : case Instruction::Call:
1264 : return 0;
1265 : case Instruction::Invoke:
1266 : return 2;
1267 : case Instruction::CallBr:
1268 : return getNumSubclassExtraOperandsDynamic();
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 :
1277 : public:
1278 : using Instruction::getContext;
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.
1286 : static CallBase *Create(CallBase *CB, ArrayRef<OperandBundleDef> 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.
1298 : static CallBase *addOperandBundle(CallBase *CB, uint32_t ID,
1299 : OperandBundleDef OB,
1300 : InsertPosition InsertPt = nullptr);
1301 :
1302 : /// Create a clone of \p CB with operand bundle \p ID removed.
1303 : static CallBase *removeOperandBundle(CallBase *CB, uint32_t ID,
1304 : InsertPosition InsertPt = nullptr);
1305 :
1306 : /// Return the convergence control token for this call, if it exists.
1307 : Value *getConvergenceControlToken() const {
1308 : if (auto Bundle = getOperandBundle(llvm::LLVMContext::OB_convergencectrl)) {
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 61070 : FunctionType *getFunctionType() const { return FTy; }
1324 :
1325 : void mutateFunctionType(FunctionType *FTy) {
1326 : Value::mutateType(FTy->getReturnType());
1327 : this->FTy = FTy;
1328 : }
1329 :
1330 : DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
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.
1337 : User::op_iterator data_operands_begin() { return op_begin(); }
1338 : User::const_op_iterator data_operands_begin() const {
1339 : return const_cast<CallBase *>(this)->data_operands_begin();
1340 : }
1341 : User::op_iterator data_operands_end() {
1342 : // Walk from the end of the operands over the called operand and any
1343 : // subclass operands.
1344 : return op_end() - getNumSubclassExtraOperands() - 1;
1345 : }
1346 : User::const_op_iterator data_operands_end() const {
1347 : return const_cast<CallBase *>(this)->data_operands_end();
1348 : }
1349 : iterator_range<User::op_iterator> data_ops() {
1350 : return make_range(data_operands_begin(), data_operands_end());
1351 : }
1352 : iterator_range<User::const_op_iterator> data_ops() const {
1353 : return make_range(data_operands_begin(), data_operands_end());
1354 : }
1355 : bool data_operands_empty() const {
1356 : return data_operands_end() == data_operands_begin();
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 : }
1367 : bool isDataOperand(Value::const_user_iterator UI) const {
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.
1373 : unsigned getDataOperandNo(Value::const_user_iterator UI) const {
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.
1385 : User::op_iterator arg_begin() { return op_begin(); }
1386 : User::const_op_iterator arg_begin() const {
1387 : return const_cast<CallBase *>(this)->arg_begin();
1388 : }
1389 :
1390 : /// Return the iterator pointing to the end of the argument list.
1391 : User::op_iterator arg_end() {
1392 : // From the end of the data operands, walk backwards past the bundle
1393 : // operands.
1394 : return data_operands_end() - getNumTotalBundleOperands();
1395 : }
1396 : User::const_op_iterator arg_end() const {
1397 : return const_cast<CallBase *>(this)->arg_end();
1398 : }
1399 :
1400 : /// Iteration adapter for range-for loops.
1401 : iterator_range<User::op_iterator> args() {
1402 : return make_range(arg_begin(), arg_end());
1403 : }
1404 : iterator_range<User::const_op_iterator> args() const {
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 : }
1435 : bool isArgOperand(Value::const_user_iterator UI) const {
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.
1448 : unsigned getArgOperandNo(Value::const_user_iterator UI) const {
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 :
1458 61363 : Value *getCalledOperand() const { return Op<CalledOperandOpEndIdx>(); }
1459 :
1460 : const Use &getCalledOperandUse() const { return Op<CalledOperandOpEndIdx>(); }
1461 : Use &getCalledOperandUse() { return Op<CalledOperandOpEndIdx>(); }
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.
1465 61363 : Function *getCalledFunction() const {
1466 61363 : if (auto *F = dyn_cast_or_null<Function>(getCalledOperand()))
1467 61070 : if (F->getValueType() == getFunctionType())
1468 61070 : return F;
1469 293 : 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.
1476 : bool isCallee(Value::const_user_iterator UI) const {
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).
1484 : Function *getCaller();
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.
1499 : Intrinsic::ID getIntrinsicID() const;
1500 :
1501 : void setCalledOperand(Value *V) { Op<CalledOperandOpEndIdx>() = V; }
1502 :
1503 : /// Sets the function called, including updating the function type.
1504 : void setCalledFunction(Function *Fn) {
1505 : setCalledFunction(Fn->getFunctionType(), Fn);
1506 : }
1507 :
1508 : /// Sets the function called, including updating the function type.
1509 : void setCalledFunction(FunctionCallee Fn) {
1510 : setCalledFunction(Fn.getFunctionType(), Fn.getCallee());
1511 : }
1512 :
1513 : /// Sets the function called, including updating to the specified function
1514 : /// type.
1515 : void setCalledFunction(FunctionType *FTy, Value *Fn) {
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.
1519 : assert(getType() == FTy->getReturnType());
1520 : setCalledOperand(Fn);
1521 : }
1522 :
1523 : CallingConv::ID getCallingConv() const {
1524 : return getSubclassData<CallingConvField>();
1525 : }
1526 :
1527 : void setCallingConv(CallingConv::ID CC) {
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 : ///
1542 : AttributeList getAttributes() const { return Attrs; }
1543 :
1544 : /// Set the parameter attributes for this call.
1545 : ///
1546 : void setAttributes(AttributeList A) { Attrs = A; }
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.
1551 : bool hasFnAttr(Attribute::AttrKind Kind) const {
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.
1564 : void addAttributeAtIndex(unsigned i, Attribute::AttrKind Kind) {
1565 : Attrs = Attrs.addAttributeAtIndex(getContext(), i, Kind);
1566 : }
1567 :
1568 : /// adds the attribute to the list of attributes.
1569 : void addAttributeAtIndex(unsigned i, Attribute Attr) {
1570 : Attrs = Attrs.addAttributeAtIndex(getContext(), i, Attr);
1571 : }
1572 :
1573 : /// Adds the attribute to the function.
1574 0 : void addFnAttr(Attribute::AttrKind Kind) {
1575 0 : Attrs = Attrs.addFnAttribute(getContext(), Kind);
1576 0 : }
1577 :
1578 : /// Adds the attribute to the function.
1579 : void addFnAttr(Attribute Attr) {
1580 : Attrs = Attrs.addFnAttribute(getContext(), Attr);
1581 : }
1582 :
1583 : /// Adds the attribute to the return value.
1584 : void addRetAttr(Attribute::AttrKind Kind) {
1585 : Attrs = Attrs.addRetAttribute(getContext(), Kind);
1586 : }
1587 :
1588 : /// Adds the attribute to the return value.
1589 : void addRetAttr(Attribute Attr) {
1590 : Attrs = Attrs.addRetAttribute(getContext(), Attr);
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.
1606 : void removeAttributeAtIndex(unsigned i, Attribute::AttrKind Kind) {
1607 : Attrs = Attrs.removeAttributeAtIndex(getContext(), i, Kind);
1608 : }
1609 :
1610 : /// removes the attribute from the list of attributes.
1611 : void removeAttributeAtIndex(unsigned i, StringRef Kind) {
1612 : Attrs = Attrs.removeAttributeAtIndex(getContext(), i, 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
1621 : void removeFnAttr(Attribute::AttrKind Kind) {
1622 : Attrs = Attrs.removeFnAttribute(getContext(), Kind);
1623 : }
1624 :
1625 : /// Removes the attribute from the function
1626 : void removeFnAttr(StringRef Kind) {
1627 : Attrs = Attrs.removeFnAttribute(getContext(), Kind);
1628 : }
1629 :
1630 : /// Removes the attribute from the return value
1631 : void removeRetAttr(Attribute::AttrKind Kind) {
1632 : Attrs = Attrs.removeRetAttribute(getContext(), Kind);
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) {
1659 : Attrs = Attrs.addDereferenceableParamAttr(getContext(), i, Bytes);
1660 : }
1661 :
1662 : /// adds the dereferenceable attribute to the list of attributes.
1663 : void addDereferenceableRetAttr(uint64_t Bytes) {
1664 : Attrs = Attrs.addDereferenceableRetAttr(getContext(), Bytes);
1665 : }
1666 :
1667 : /// adds the range attribute to the list of attributes.
1668 : void addRangeRetAttr(const ConstantRange &CR) {
1669 : Attrs = Attrs.addRangeRetAttr(getContext(), CR);
1670 : }
1671 :
1672 : /// Determine whether the return value has the given attribute.
1673 : bool hasRetAttr(Attribute::AttrKind Kind) const {
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.
1680 : Attribute getRetAttr(Attribute::AttrKind Kind) const {
1681 : Attribute RetAttr = Attrs.getRetAttr(Kind);
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.
1695 : Attribute getAttributeAtIndex(unsigned i, Attribute::AttrKind Kind) const {
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.
1705 : Attribute getFnAttr(StringRef Kind) const {
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.
1713 : Attribute getFnAttr(Attribute::AttrKind Kind) const {
1714 : Attribute A = getAttributes().getFnAttr(Kind);
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.
1751 : assert(i < arg_size() + getNumTotalBundleOperands() &&
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 :
1761 : assert(hasOperandBundles() && i >= getBundleOperandsStartIndex() &&
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.
1829 : MaybeAlign getRetAlign() const {
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).
1900 : uint64_t getRetDereferenceableBytes() const {
1901 : uint64_t Bytes = Attrs.getRetDereferenceableBytes();
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).
1909 : uint64_t getParamDereferenceableBytes(unsigned i) const {
1910 : return Attrs.getParamDereferenceableBytes(i);
1911 : }
1912 :
1913 : /// Extract the number of dereferenceable_or_null bytes for a call
1914 : /// (0=unknown).
1915 : uint64_t getRetDereferenceableOrNullBytes() const {
1916 : uint64_t Bytes = Attrs.getRetDereferenceableOrNullBytes();
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).
1927 : uint64_t getParamDereferenceableOrNullBytes(unsigned i) const {
1928 : return Attrs.getParamDereferenceableOrNullBytes(i);
1929 : }
1930 :
1931 : /// Extract a test mask for disallowed floating-point value classes for the
1932 : /// return value.
1933 : FPClassTest getRetNoFPClass() const;
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.
1955 : Value *getReturnedArgOperand() const {
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.
1961 : Value *getArgOperandWithAttribute(Attribute::AttrKind Kind) const;
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 :
1977 : MemoryEffects getMemoryEffects() const;
1978 : void setMemoryEffects(MemoryEffects ME);
1979 :
1980 : /// Determine if the call does not access memory.
1981 : bool doesNotAccessMemory() const;
1982 : void setDoesNotAccessMemory();
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;
1995 : void setOnlyAccessesArgMemory();
1996 :
1997 : /// Determine if the function may only access memory that is
1998 : /// inaccessible from the IR.
1999 : bool onlyAccessesInaccessibleMemory() const;
2000 : void setOnlyAccessesInaccessibleMemory();
2001 :
2002 : /// Determine if the function may only access memory that is
2003 : /// either inaccessible from the IR or pointed to by its arguments.
2004 : bool onlyAccessesInaccessibleMemOrArgMem() const;
2005 : void setOnlyAccessesInaccessibleMemOrArgMem();
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.
2064 : unsigned getBundleOperandsStartIndex() const {
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 {
2077 : return hasOperandBundles() && Idx >= getBundleOperandsStartIndex() &&
2078 : Idx < getBundleOperandsEndIndex();
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) &&
2085 : getOperandBundleForOperand(Idx).getTagID() == ID;
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 : }
2094 : bool isBundleOperand(Value::const_user_iterator UI) const {
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.
2112 : OperandBundleUse getOperandBundleAt(unsigned Index) const {
2113 : assert(Index < getNumOperandBundles() && "Index out of bounds!");
2114 : return operandBundleFromBundleOpInfo(*(bundle_op_info_begin() + Index));
2115 : }
2116 :
2117 : /// Return the number of operand bundles with the tag Name attached to
2118 : /// this instruction.
2119 : unsigned countOperandBundlesOfType(StringRef Name) const {
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.
2130 : unsigned countOperandBundlesOfType(uint32_t ID) const {
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) {
2147 : OperandBundleUse U = getOperandBundleAt(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) {
2163 : OperandBundleUse U = getOperandBundleAt(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).
2178 : void getOperandBundlesAsDefs(SmallVectorImpl<OperandBundleDef> &Defs) const;
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.
2184 : OperandBundleUse getOperandBundleForOperand(unsigned OpIdx) const {
2185 : return operandBundleFromBundleOpInfo(getBundleOpInfoForOperand(OpIdx));
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.
2207 : bool hasIdenticalOperandBundleSchema(const CallBase &Other) const {
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.
2217 : bool hasOperandBundlesOtherThan(ArrayRef<uint32_t> IDs) const {
2218 : for (unsigned i = 0, e = getNumOperandBundles(); i != e; ++i) {
2219 : uint32_t ID = getOperandBundleAt(i).getTagID();
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.
2228 : struct BundleOpInfo {
2229 : /// The operand bundle tag, interned by
2230 : /// LLVMContextImpl::getOrInsertBundleTag.
2231 : StringMapEntry<uint32_t> *Tag;
2232 :
2233 : /// The index in the Use& vector where operands for this operand
2234 : /// bundle starts.
2235 : uint32_t Begin;
2236 :
2237 : /// The index in the Use& vector where operands for this operand
2238 : /// bundle ends.
2239 : uint32_t End;
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.
2248 : OperandBundleUse
2249 : operandBundleFromBundleOpInfo(const BundleOpInfo &BOI) const {
2250 : const auto *begin = op_begin();
2251 : ArrayRef<Use> Inputs(begin + BOI.Begin, begin + BOI.End);
2252 : return OperandBundleUse(BOI.Tag, Inputs);
2253 : }
2254 :
2255 : using bundle_op_iterator = BundleOpInfo *;
2256 : using const_bundle_op_iterator = const BundleOpInfo *;
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.
2304 : bundle_op_iterator bundle_op_info_begin() {
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.
2314 : const_bundle_op_iterator bundle_op_info_begin() const {
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.
2321 : bundle_op_iterator bundle_op_info_end() {
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.
2331 : const_bundle_op_iterator bundle_op_info_end() const {
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).
2337 : iterator_range<bundle_op_iterator> bundle_op_infos() {
2338 : return make_range(bundle_op_info_begin(), bundle_op_info_end());
2339 : }
2340 :
2341 : /// Return the range [\p bundle_op_info_begin, \p bundle_op_info_end).
2342 : iterator_range<const_bundle_op_iterator> bundle_op_infos() const {
2343 : return make_range(bundle_op_info_begin(), 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.
2352 : op_iterator populateBundleOperandInfos(ArrayRef<OperandBundleDef> Bundles,
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 :
2360 : public:
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 :
2370 : protected:
2371 : /// Return the total number of values used in \p Bundles.
2372 0 : static unsigned CountBundleInputs(ArrayRef<OperandBundleDef> Bundles) {
2373 0 : unsigned Total = 0;
2374 0 : for (const auto &B : Bundles)
2375 0 : Total += B.input_size();
2376 0 : return Total;
2377 : }
2378 :
2379 : /// @}
2380 : // End of operand bundle API.
2381 :
2382 : private:
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 :
2409 : template <>
2410 : struct OperandTraits<CallBase> : public VariadicOperandTraits<CallBase, 1> {};
2411 :
2412 61363 : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CallBase, Value)
2413 :
2414 : //===----------------------------------------------------------------------===//
2415 : // FuncletPadInst Class
2416 : //===----------------------------------------------------------------------===//
2417 : class FuncletPadInst : public Instruction {
2418 : private:
2419 : FuncletPadInst(const FuncletPadInst &CPI);
2420 :
2421 : explicit FuncletPadInst(Instruction::FuncletPadOps Op, Value *ParentPad,
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 :
2427 : protected:
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 :
2435 : public:
2436 : /// Provide fast operand accessors
2437 : DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
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.
2464 : const_op_range arg_operands() const {
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 :
2475 : template <>
2476 : struct OperandTraits<FuncletPadInst>
2477 : : public VariadicOperandTraits<FuncletPadInst, /*MINARITY=*/1> {};
2478 :
2479 : DEFINE_TRANSPARENT_OPERAND_ACCESSORS(FuncletPadInst, Value)
2480 :
2481 : } // end namespace llvm
2482 :
2483 : #endif // LLVM_IR_INSTRTYPES_H
|