blob: 80d428c014070a69bf0df6c7c5562fd4538595e5 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===-- llvm/IntrinsicInst.h - Intrinsic Instruction Wrappers ---*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines classes that make it really easy to deal with intrinsic
11// functions with the isa/dyncast family of functions. In particular, this
12// allows you to do things like:
13//
14// if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(Inst))
15// ... MCI->getDest() ... MCI->getSource() ...
16//
17// All intrinsic function calls are instances of the call instruction, so these
18// are all subclasses of the CallInst class. Note that none of these classes
19// has state or virtual methods, which is an important part of this gross/neat
20// hack working.
21//
22//===----------------------------------------------------------------------===//
23
24#ifndef LLVM_IR_INTRINSICINST_H
25#define LLVM_IR_INTRINSICINST_H
26
27#include "llvm/IR/Constants.h"
28#include "llvm/IR/DerivedTypes.h"
29#include "llvm/IR/Function.h"
30#include "llvm/IR/GlobalVariable.h"
31#include "llvm/IR/Instructions.h"
32#include "llvm/IR/Intrinsics.h"
33#include "llvm/IR/Metadata.h"
34#include "llvm/IR/Value.h"
35#include "llvm/Support/Casting.h"
36#include <cassert>
37#include <cstdint>
38
39namespace llvm {
40
41 /// A wrapper class for inspecting calls to intrinsic functions.
42 /// This allows the standard isa/dyncast/cast functionality to work with calls
43 /// to intrinsic functions.
44 class IntrinsicInst : public CallInst {
45 public:
46 IntrinsicInst() = delete;
47 IntrinsicInst(const IntrinsicInst &) = delete;
48 IntrinsicInst &operator=(const IntrinsicInst &) = delete;
49
50 /// Return the intrinsic ID of this intrinsic.
51 Intrinsic::ID getIntrinsicID() const {
52 return getCalledFunction()->getIntrinsicID();
53 }
54
55 // Methods for support type inquiry through isa, cast, and dyn_cast:
56 static bool classof(const CallInst *I) {
57 if (const Function *CF = I->getCalledFunction())
58 return CF->isIntrinsic();
59 return false;
60 }
61 static bool classof(const Value *V) {
62 return isa<CallInst>(V) && classof(cast<CallInst>(V));
63 }
64 };
65
66 /// This is the common base class for debug info intrinsics.
67 class DbgInfoIntrinsic : public IntrinsicInst {
68 public:
69 /// Get the location corresponding to the variable referenced by the debug
70 /// info intrinsic. Depending on the intrinsic, this could be the
71 /// variable's value or its address.
72 Value *getVariableLocation(bool AllowNullOp = true) const;
73
74 /// Does this describe the address of a local variable. True for dbg.addr
75 /// and dbg.declare, but not dbg.value, which describes its value.
76 bool isAddressOfVariable() const {
77 return getIntrinsicID() != Intrinsic::dbg_value;
78 }
79
80 DILocalVariable *getVariable() const {
81 return cast<DILocalVariable>(getRawVariable());
82 }
83
84 DIExpression *getExpression() const {
85 return cast<DIExpression>(getRawExpression());
86 }
87
88 Metadata *getRawVariable() const {
89 return cast<MetadataAsValue>(getArgOperand(1))->getMetadata();
90 }
91
92 Metadata *getRawExpression() const {
93 return cast<MetadataAsValue>(getArgOperand(2))->getMetadata();
94 }
95
96 /// \name Casting methods
97 /// @{
98 static bool classof(const IntrinsicInst *I) {
99 switch (I->getIntrinsicID()) {
100 case Intrinsic::dbg_declare:
101 case Intrinsic::dbg_value:
102 case Intrinsic::dbg_addr:
103 return true;
104 default: return false;
105 }
106 }
107 static bool classof(const Value *V) {
108 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
109 }
110 /// @}
111 };
112
113 /// This represents the llvm.dbg.declare instruction.
114 class DbgDeclareInst : public DbgInfoIntrinsic {
115 public:
116 Value *getAddress() const { return getVariableLocation(); }
117
118 /// \name Casting methods
119 /// @{
120 static bool classof(const IntrinsicInst *I) {
121 return I->getIntrinsicID() == Intrinsic::dbg_declare;
122 }
123 static bool classof(const Value *V) {
124 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
125 }
126 /// @}
127 };
128
129 /// This represents the llvm.dbg.addr instruction.
130 class DbgAddrIntrinsic : public DbgInfoIntrinsic {
131 public:
132 Value *getAddress() const { return getVariableLocation(); }
133
134 /// \name Casting methods
135 /// @{
136 static bool classof(const IntrinsicInst *I) {
137 return I->getIntrinsicID() == Intrinsic::dbg_addr;
138 }
139 static bool classof(const Value *V) {
140 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
141 }
142 };
143
144 /// This represents the llvm.dbg.value instruction.
145 class DbgValueInst : public DbgInfoIntrinsic {
146 public:
147 Value *getValue() const {
148 return getVariableLocation(/* AllowNullOp = */ false);
149 }
150
151 /// \name Casting methods
152 /// @{
153 static bool classof(const IntrinsicInst *I) {
154 return I->getIntrinsicID() == Intrinsic::dbg_value;
155 }
156 static bool classof(const Value *V) {
157 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
158 }
159 /// @}
160 };
161
162 /// This is the common base class for constrained floating point intrinsics.
163 class ConstrainedFPIntrinsic : public IntrinsicInst {
164 public:
165 enum RoundingMode {
166 rmInvalid,
167 rmDynamic,
168 rmToNearest,
169 rmDownward,
170 rmUpward,
171 rmTowardZero
172 };
173
174 enum ExceptionBehavior {
175 ebInvalid,
176 ebIgnore,
177 ebMayTrap,
178 ebStrict
179 };
180
181 bool isUnaryOp() const;
182 bool isTernaryOp() const;
183 RoundingMode getRoundingMode() const;
184 ExceptionBehavior getExceptionBehavior() const;
185
186 // Methods for support type inquiry through isa, cast, and dyn_cast:
187 static bool classof(const IntrinsicInst *I) {
188 switch (I->getIntrinsicID()) {
189 case Intrinsic::experimental_constrained_fadd:
190 case Intrinsic::experimental_constrained_fsub:
191 case Intrinsic::experimental_constrained_fmul:
192 case Intrinsic::experimental_constrained_fdiv:
193 case Intrinsic::experimental_constrained_frem:
194 case Intrinsic::experimental_constrained_fma:
195 case Intrinsic::experimental_constrained_sqrt:
196 case Intrinsic::experimental_constrained_pow:
197 case Intrinsic::experimental_constrained_powi:
198 case Intrinsic::experimental_constrained_sin:
199 case Intrinsic::experimental_constrained_cos:
200 case Intrinsic::experimental_constrained_exp:
201 case Intrinsic::experimental_constrained_exp2:
202 case Intrinsic::experimental_constrained_log:
203 case Intrinsic::experimental_constrained_log10:
204 case Intrinsic::experimental_constrained_log2:
205 case Intrinsic::experimental_constrained_rint:
206 case Intrinsic::experimental_constrained_nearbyint:
207 return true;
208 default: return false;
209 }
210 }
211 static bool classof(const Value *V) {
212 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
213 }
214 };
215
216 /// Common base class for all memory intrinsics. Simply provides
217 /// common methods.
218 /// Written as CRTP to avoid a common base class amongst the
219 /// three atomicity hierarchies.
220 template <typename Derived> class MemIntrinsicBase : public IntrinsicInst {
221 private:
222 enum { ARG_DEST = 0, ARG_LENGTH = 2 };
223
224 public:
225 Value *getRawDest() const {
226 return const_cast<Value *>(getArgOperand(ARG_DEST));
227 }
228 const Use &getRawDestUse() const { return getArgOperandUse(ARG_DEST); }
229 Use &getRawDestUse() { return getArgOperandUse(ARG_DEST); }
230
231 Value *getLength() const {
232 return const_cast<Value *>(getArgOperand(ARG_LENGTH));
233 }
234 const Use &getLengthUse() const { return getArgOperandUse(ARG_LENGTH); }
235 Use &getLengthUse() { return getArgOperandUse(ARG_LENGTH); }
236
237 /// This is just like getRawDest, but it strips off any cast
238 /// instructions (including addrspacecast) that feed it, giving the
239 /// original input. The returned value is guaranteed to be a pointer.
240 Value *getDest() const { return getRawDest()->stripPointerCasts(); }
241
242 unsigned getDestAddressSpace() const {
243 return cast<PointerType>(getRawDest()->getType())->getAddressSpace();
244 }
245
246 unsigned getDestAlignment() const { return getParamAlignment(ARG_DEST); }
247
248 /// Set the specified arguments of the instruction.
249 void setDest(Value *Ptr) {
250 assert(getRawDest()->getType() == Ptr->getType() &&
251 "setDest called with pointer of wrong type!");
252 setArgOperand(ARG_DEST, Ptr);
253 }
254
255 void setDestAlignment(unsigned Align) {
256 removeParamAttr(ARG_DEST, Attribute::Alignment);
257 if (Align > 0)
258 addParamAttr(ARG_DEST,
259 Attribute::getWithAlignment(getContext(), Align));
260 }
261
262 void setLength(Value *L) {
263 assert(getLength()->getType() == L->getType() &&
264 "setLength called with value of wrong type!");
265 setArgOperand(ARG_LENGTH, L);
266 }
267 };
268
269 // The common base class for the atomic memset/memmove/memcpy intrinsics
270 // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
271 class AtomicMemIntrinsic : public MemIntrinsicBase<AtomicMemIntrinsic> {
272 private:
273 enum { ARG_ELEMENTSIZE = 3 };
274
275 public:
276 Value *getRawElementSizeInBytes() const {
277 return const_cast<Value *>(getArgOperand(ARG_ELEMENTSIZE));
278 }
279
280 ConstantInt *getElementSizeInBytesCst() const {
281 return cast<ConstantInt>(getRawElementSizeInBytes());
282 }
283
284 uint32_t getElementSizeInBytes() const {
285 return getElementSizeInBytesCst()->getZExtValue();
286 }
287
288 void setElementSizeInBytes(Constant *V) {
289 assert(V->getType() == Type::getInt8Ty(getContext()) &&
290 "setElementSizeInBytes called with value of wrong type!");
291 setArgOperand(ARG_ELEMENTSIZE, V);
292 }
293
294 static bool classof(const IntrinsicInst *I) {
295 switch (I->getIntrinsicID()) {
296 case Intrinsic::memcpy_element_unordered_atomic:
297 case Intrinsic::memmove_element_unordered_atomic:
298 case Intrinsic::memset_element_unordered_atomic:
299 return true;
300 default:
301 return false;
302 }
303 }
304 static bool classof(const Value *V) {
305 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
306 }
307 };
308
309 /// This class represents atomic memset intrinsic
310 // i.e. llvm.element.unordered.atomic.memset
311 class AtomicMemSetInst : public AtomicMemIntrinsic {
312 private:
313 enum { ARG_VALUE = 1 };
314
315 public:
316 Value *getValue() const {
317 return const_cast<Value *>(getArgOperand(ARG_VALUE));
318 }
319 const Use &getValueUse() const { return getArgOperandUse(ARG_VALUE); }
320 Use &getValueUse() { return getArgOperandUse(ARG_VALUE); }
321
322 void setValue(Value *Val) {
323 assert(getValue()->getType() == Val->getType() &&
324 "setValue called with value of wrong type!");
325 setArgOperand(ARG_VALUE, Val);
326 }
327
328 static bool classof(const IntrinsicInst *I) {
329 return I->getIntrinsicID() == Intrinsic::memset_element_unordered_atomic;
330 }
331 static bool classof(const Value *V) {
332 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
333 }
334 };
335
336 // This class wraps the atomic memcpy/memmove intrinsics
337 // i.e. llvm.element.unordered.atomic.memcpy/memmove
338 class AtomicMemTransferInst : public AtomicMemIntrinsic {
339 private:
340 enum { ARG_SOURCE = 1 };
341
342 public:
343 /// Return the arguments to the instruction.
344 Value *getRawSource() const {
345 return const_cast<Value *>(getArgOperand(ARG_SOURCE));
346 }
347 const Use &getRawSourceUse() const { return getArgOperandUse(ARG_SOURCE); }
348 Use &getRawSourceUse() { return getArgOperandUse(ARG_SOURCE); }
349
350 /// This is just like getRawSource, but it strips off any cast
351 /// instructions that feed it, giving the original input. The returned
352 /// value is guaranteed to be a pointer.
353 Value *getSource() const { return getRawSource()->stripPointerCasts(); }
354
355 unsigned getSourceAddressSpace() const {
356 return cast<PointerType>(getRawSource()->getType())->getAddressSpace();
357 }
358
359 unsigned getSourceAlignment() const {
360 return getParamAlignment(ARG_SOURCE);
361 }
362
363 void setSource(Value *Ptr) {
364 assert(getRawSource()->getType() == Ptr->getType() &&
365 "setSource called with pointer of wrong type!");
366 setArgOperand(ARG_SOURCE, Ptr);
367 }
368
369 void setSourceAlignment(unsigned Align) {
370 removeParamAttr(ARG_SOURCE, Attribute::Alignment);
371 if (Align > 0)
372 addParamAttr(ARG_SOURCE,
373 Attribute::getWithAlignment(getContext(), Align));
374 }
375
376 static bool classof(const IntrinsicInst *I) {
377 switch (I->getIntrinsicID()) {
378 case Intrinsic::memcpy_element_unordered_atomic:
379 case Intrinsic::memmove_element_unordered_atomic:
380 return true;
381 default:
382 return false;
383 }
384 }
385 static bool classof(const Value *V) {
386 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
387 }
388 };
389
390 /// This class represents the atomic memcpy intrinsic
391 /// i.e. llvm.element.unordered.atomic.memcpy
392 class AtomicMemCpyInst : public AtomicMemTransferInst {
393 public:
394 static bool classof(const IntrinsicInst *I) {
395 return I->getIntrinsicID() == Intrinsic::memcpy_element_unordered_atomic;
396 }
397 static bool classof(const Value *V) {
398 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
399 }
400 };
401
402 /// This class represents the atomic memmove intrinsic
403 /// i.e. llvm.element.unordered.atomic.memmove
404 class AtomicMemMoveInst : public AtomicMemTransferInst {
405 public:
406 static bool classof(const IntrinsicInst *I) {
407 return I->getIntrinsicID() == Intrinsic::memmove_element_unordered_atomic;
408 }
409 static bool classof(const Value *V) {
410 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
411 }
412 };
413
414 /// This is the common base class for memset/memcpy/memmove.
415 class MemIntrinsic : public MemIntrinsicBase<MemIntrinsic> {
416 private:
417 enum { ARG_VOLATILE = 3 };
418
419 public:
420 ConstantInt *getVolatileCst() const {
421 return cast<ConstantInt>(
422 const_cast<Value *>(getArgOperand(ARG_VOLATILE)));
423 }
424
425 bool isVolatile() const {
426 return !getVolatileCst()->isZero();
427 }
428
429 void setVolatile(Constant *V) { setArgOperand(ARG_VOLATILE, V); }
430
431 // Methods for support type inquiry through isa, cast, and dyn_cast:
432 static bool classof(const IntrinsicInst *I) {
433 switch (I->getIntrinsicID()) {
434 case Intrinsic::memcpy:
435 case Intrinsic::memmove:
436 case Intrinsic::memset:
437 return true;
438 default: return false;
439 }
440 }
441 static bool classof(const Value *V) {
442 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
443 }
444 };
445
446 /// This class wraps the llvm.memset intrinsic.
447 class MemSetInst : public MemIntrinsic {
448 public:
449 /// Return the arguments to the instruction.
450 Value *getValue() const { return const_cast<Value*>(getArgOperand(1)); }
451 const Use &getValueUse() const { return getArgOperandUse(1); }
452 Use &getValueUse() { return getArgOperandUse(1); }
453
454 void setValue(Value *Val) {
455 assert(getValue()->getType() == Val->getType() &&
456 "setValue called with value of wrong type!");
457 setArgOperand(1, Val);
458 }
459
460 // Methods for support type inquiry through isa, cast, and dyn_cast:
461 static bool classof(const IntrinsicInst *I) {
462 return I->getIntrinsicID() == Intrinsic::memset;
463 }
464 static bool classof(const Value *V) {
465 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
466 }
467 };
468
469 /// This class wraps the llvm.memcpy/memmove intrinsics.
470 class MemTransferInst : public MemIntrinsic {
471 private:
472 enum { ARG_SOURCE = 1 };
473
474 public:
475 /// Return the arguments to the instruction.
476 Value *getRawSource() const { return const_cast<Value*>(getArgOperand(ARG_SOURCE)); }
477 const Use &getRawSourceUse() const { return getArgOperandUse(ARG_SOURCE); }
478 Use &getRawSourceUse() { return getArgOperandUse(ARG_SOURCE); }
479
480 /// This is just like getRawSource, but it strips off any cast
481 /// instructions that feed it, giving the original input. The returned
482 /// value is guaranteed to be a pointer.
483 Value *getSource() const { return getRawSource()->stripPointerCasts(); }
484
485 unsigned getSourceAddressSpace() const {
486 return cast<PointerType>(getRawSource()->getType())->getAddressSpace();
487 }
488
489 unsigned getSourceAlignment() const {
490 return getParamAlignment(ARG_SOURCE);
491 }
492
493 void setSource(Value *Ptr) {
494 assert(getRawSource()->getType() == Ptr->getType() &&
495 "setSource called with pointer of wrong type!");
496 setArgOperand(ARG_SOURCE, Ptr);
497 }
498
499 void setSourceAlignment(unsigned Align) {
500 removeParamAttr(ARG_SOURCE, Attribute::Alignment);
501 if (Align > 0)
502 addParamAttr(ARG_SOURCE,
503 Attribute::getWithAlignment(getContext(), Align));
504 }
505
506 // Methods for support type inquiry through isa, cast, and dyn_cast:
507 static bool classof(const IntrinsicInst *I) {
508 return I->getIntrinsicID() == Intrinsic::memcpy ||
509 I->getIntrinsicID() == Intrinsic::memmove;
510 }
511 static bool classof(const Value *V) {
512 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
513 }
514 };
515
516 /// This class wraps the llvm.memcpy intrinsic.
517 class MemCpyInst : public MemTransferInst {
518 public:
519 // Methods for support type inquiry through isa, cast, and dyn_cast:
520 static bool classof(const IntrinsicInst *I) {
521 return I->getIntrinsicID() == Intrinsic::memcpy;
522 }
523 static bool classof(const Value *V) {
524 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
525 }
526 };
527
528 /// This class wraps the llvm.memmove intrinsic.
529 class MemMoveInst : public MemTransferInst {
530 public:
531 // Methods for support type inquiry through isa, cast, and dyn_cast:
532 static bool classof(const IntrinsicInst *I) {
533 return I->getIntrinsicID() == Intrinsic::memmove;
534 }
535 static bool classof(const Value *V) {
536 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
537 }
538 };
539
540 // The common base class for any memset/memmove/memcpy intrinsics;
541 // whether they be atomic or non-atomic.
542 // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
543 // and llvm.memset/memcpy/memmove
544 class AnyMemIntrinsic : public MemIntrinsicBase<AnyMemIntrinsic> {
545 public:
546 bool isVolatile() const {
547 // Only the non-atomic intrinsics can be volatile
548 if (auto *MI = dyn_cast<MemIntrinsic>(this))
549 return MI->isVolatile();
550 return false;
551 }
552
553 static bool classof(const IntrinsicInst *I) {
554 switch (I->getIntrinsicID()) {
555 case Intrinsic::memcpy:
556 case Intrinsic::memmove:
557 case Intrinsic::memset:
558 case Intrinsic::memcpy_element_unordered_atomic:
559 case Intrinsic::memmove_element_unordered_atomic:
560 case Intrinsic::memset_element_unordered_atomic:
561 return true;
562 default:
563 return false;
564 }
565 }
566 static bool classof(const Value *V) {
567 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
568 }
569 };
570
571 /// This class represents any memset intrinsic
572 // i.e. llvm.element.unordered.atomic.memset
573 // and llvm.memset
574 class AnyMemSetInst : public AnyMemIntrinsic {
575 private:
576 enum { ARG_VALUE = 1 };
577
578 public:
579 Value *getValue() const {
580 return const_cast<Value *>(getArgOperand(ARG_VALUE));
581 }
582 const Use &getValueUse() const { return getArgOperandUse(ARG_VALUE); }
583 Use &getValueUse() { return getArgOperandUse(ARG_VALUE); }
584
585 void setValue(Value *Val) {
586 assert(getValue()->getType() == Val->getType() &&
587 "setValue called with value of wrong type!");
588 setArgOperand(ARG_VALUE, Val);
589 }
590
591 static bool classof(const IntrinsicInst *I) {
592 switch (I->getIntrinsicID()) {
593 case Intrinsic::memset:
594 case Intrinsic::memset_element_unordered_atomic:
595 return true;
596 default:
597 return false;
598 }
599 }
600 static bool classof(const Value *V) {
601 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
602 }
603 };
604
605 // This class wraps any memcpy/memmove intrinsics
606 // i.e. llvm.element.unordered.atomic.memcpy/memmove
607 // and llvm.memcpy/memmove
608 class AnyMemTransferInst : public AnyMemIntrinsic {
609 private:
610 enum { ARG_SOURCE = 1 };
611
612 public:
613 /// Return the arguments to the instruction.
614 Value *getRawSource() const {
615 return const_cast<Value *>(getArgOperand(ARG_SOURCE));
616 }
617 const Use &getRawSourceUse() const { return getArgOperandUse(ARG_SOURCE); }
618 Use &getRawSourceUse() { return getArgOperandUse(ARG_SOURCE); }
619
620 /// This is just like getRawSource, but it strips off any cast
621 /// instructions that feed it, giving the original input. The returned
622 /// value is guaranteed to be a pointer.
623 Value *getSource() const { return getRawSource()->stripPointerCasts(); }
624
625 unsigned getSourceAddressSpace() const {
626 return cast<PointerType>(getRawSource()->getType())->getAddressSpace();
627 }
628
629 unsigned getSourceAlignment() const {
630 return getParamAlignment(ARG_SOURCE);
631 }
632
633 void setSource(Value *Ptr) {
634 assert(getRawSource()->getType() == Ptr->getType() &&
635 "setSource called with pointer of wrong type!");
636 setArgOperand(ARG_SOURCE, Ptr);
637 }
638
639 void setSourceAlignment(unsigned Align) {
640 removeParamAttr(ARG_SOURCE, Attribute::Alignment);
641 if (Align > 0)
642 addParamAttr(ARG_SOURCE,
643 Attribute::getWithAlignment(getContext(), Align));
644 }
645
646 static bool classof(const IntrinsicInst *I) {
647 switch (I->getIntrinsicID()) {
648 case Intrinsic::memcpy:
649 case Intrinsic::memmove:
650 case Intrinsic::memcpy_element_unordered_atomic:
651 case Intrinsic::memmove_element_unordered_atomic:
652 return true;
653 default:
654 return false;
655 }
656 }
657 static bool classof(const Value *V) {
658 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
659 }
660 };
661
662 /// This class represents any memcpy intrinsic
663 /// i.e. llvm.element.unordered.atomic.memcpy
664 /// and llvm.memcpy
665 class AnyMemCpyInst : public AnyMemTransferInst {
666 public:
667 static bool classof(const IntrinsicInst *I) {
668 switch (I->getIntrinsicID()) {
669 case Intrinsic::memcpy:
670 case Intrinsic::memcpy_element_unordered_atomic:
671 return true;
672 default:
673 return false;
674 }
675 }
676 static bool classof(const Value *V) {
677 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
678 }
679 };
680
681 /// This class represents any memmove intrinsic
682 /// i.e. llvm.element.unordered.atomic.memmove
683 /// and llvm.memmove
684 class AnyMemMoveInst : public AnyMemTransferInst {
685 public:
686 static bool classof(const IntrinsicInst *I) {
687 switch (I->getIntrinsicID()) {
688 case Intrinsic::memmove:
689 case Intrinsic::memmove_element_unordered_atomic:
690 return true;
691 default:
692 return false;
693 }
694 }
695 static bool classof(const Value *V) {
696 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
697 }
698 };
699
700 /// This represents the llvm.va_start intrinsic.
701 class VAStartInst : public IntrinsicInst {
702 public:
703 static bool classof(const IntrinsicInst *I) {
704 return I->getIntrinsicID() == Intrinsic::vastart;
705 }
706 static bool classof(const Value *V) {
707 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
708 }
709
710 Value *getArgList() const { return const_cast<Value*>(getArgOperand(0)); }
711 };
712
713 /// This represents the llvm.va_end intrinsic.
714 class VAEndInst : public IntrinsicInst {
715 public:
716 static bool classof(const IntrinsicInst *I) {
717 return I->getIntrinsicID() == Intrinsic::vaend;
718 }
719 static bool classof(const Value *V) {
720 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
721 }
722
723 Value *getArgList() const { return const_cast<Value*>(getArgOperand(0)); }
724 };
725
726 /// This represents the llvm.va_copy intrinsic.
727 class VACopyInst : public IntrinsicInst {
728 public:
729 static bool classof(const IntrinsicInst *I) {
730 return I->getIntrinsicID() == Intrinsic::vacopy;
731 }
732 static bool classof(const Value *V) {
733 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
734 }
735
736 Value *getDest() const { return const_cast<Value*>(getArgOperand(0)); }
737 Value *getSrc() const { return const_cast<Value*>(getArgOperand(1)); }
738 };
739
740 /// This represents the llvm.instrprof_increment intrinsic.
741 class InstrProfIncrementInst : public IntrinsicInst {
742 public:
743 static bool classof(const IntrinsicInst *I) {
744 return I->getIntrinsicID() == Intrinsic::instrprof_increment;
745 }
746 static bool classof(const Value *V) {
747 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
748 }
749
750 GlobalVariable *getName() const {
751 return cast<GlobalVariable>(
752 const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
753 }
754
755 ConstantInt *getHash() const {
756 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
757 }
758
759 ConstantInt *getNumCounters() const {
760 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
761 }
762
763 ConstantInt *getIndex() const {
764 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
765 }
766
767 Value *getStep() const;
768 };
769
770 class InstrProfIncrementInstStep : public InstrProfIncrementInst {
771 public:
772 static bool classof(const IntrinsicInst *I) {
773 return I->getIntrinsicID() == Intrinsic::instrprof_increment_step;
774 }
775 static bool classof(const Value *V) {
776 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
777 }
778 };
779
780 /// This represents the llvm.instrprof_value_profile intrinsic.
781 class InstrProfValueProfileInst : public IntrinsicInst {
782 public:
783 static bool classof(const IntrinsicInst *I) {
784 return I->getIntrinsicID() == Intrinsic::instrprof_value_profile;
785 }
786 static bool classof(const Value *V) {
787 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
788 }
789
790 GlobalVariable *getName() const {
791 return cast<GlobalVariable>(
792 const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
793 }
794
795 ConstantInt *getHash() const {
796 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
797 }
798
799 Value *getTargetValue() const {
800 return cast<Value>(const_cast<Value *>(getArgOperand(2)));
801 }
802
803 ConstantInt *getValueKind() const {
804 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
805 }
806
807 // Returns the value site index.
808 ConstantInt *getIndex() const {
809 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(4)));
810 }
811 };
812
813} // end namespace llvm
814
815#endif // LLVM_IR_INTRINSICINST_H