xref: /freebsd/contrib/llvm-project/llvm/include/llvm/IR/IntrinsicInst.h (revision 3a9a9c0ca44ec535dcf73fe8462bee458e54814b)
1 //===-- llvm/IntrinsicInst.h - Intrinsic Instruction Wrappers ---*- 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 classes that make it really easy to deal with intrinsic
10 // functions with the isa/dyncast family of functions.  In particular, this
11 // allows you to do things like:
12 //
13 //     if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(Inst))
14 //        ... MCI->getDest() ... MCI->getSource() ...
15 //
16 // All intrinsic function calls are instances of the call instruction, so these
17 // are all subclasses of the CallInst class.  Note that none of these classes
18 // has state or virtual methods, which is an important part of this gross/neat
19 // hack working.
20 //
21 //===----------------------------------------------------------------------===//
22 
23 #ifndef LLVM_IR_INTRINSICINST_H
24 #define LLVM_IR_INTRINSICINST_H
25 
26 #include "llvm/IR/Constants.h"
27 #include "llvm/IR/DebugInfoMetadata.h"
28 #include "llvm/IR/DerivedTypes.h"
29 #include "llvm/IR/FPEnv.h"
30 #include "llvm/IR/Function.h"
31 #include "llvm/IR/GlobalVariable.h"
32 #include "llvm/IR/Instructions.h"
33 #include "llvm/IR/Intrinsics.h"
34 #include "llvm/IR/Metadata.h"
35 #include "llvm/IR/Value.h"
36 #include "llvm/Support/Casting.h"
37 #include <cassert>
38 #include <cstdint>
39 
40 namespace llvm {
41 
42 /// A wrapper class for inspecting calls to intrinsic functions.
43 /// This allows the standard isa/dyncast/cast functionality to work with calls
44 /// to intrinsic functions.
45 class IntrinsicInst : public CallInst {
46 public:
47   IntrinsicInst() = delete;
48   IntrinsicInst(const IntrinsicInst &) = delete;
49   IntrinsicInst &operator=(const IntrinsicInst &) = delete;
50 
51   /// Return the intrinsic ID of this intrinsic.
52   Intrinsic::ID getIntrinsicID() const {
53     return getCalledFunction()->getIntrinsicID();
54   }
55 
56   /// Return true if swapping the first two arguments to the intrinsic produces
57   /// the same result.
58   bool isCommutative() const {
59     switch (getIntrinsicID()) {
60     case Intrinsic::maxnum:
61     case Intrinsic::minnum:
62     case Intrinsic::maximum:
63     case Intrinsic::minimum:
64     case Intrinsic::smax:
65     case Intrinsic::smin:
66     case Intrinsic::umax:
67     case Intrinsic::umin:
68     case Intrinsic::sadd_sat:
69     case Intrinsic::uadd_sat:
70     case Intrinsic::sadd_with_overflow:
71     case Intrinsic::uadd_with_overflow:
72     case Intrinsic::smul_with_overflow:
73     case Intrinsic::umul_with_overflow:
74     case Intrinsic::smul_fix:
75     case Intrinsic::umul_fix:
76     case Intrinsic::smul_fix_sat:
77     case Intrinsic::umul_fix_sat:
78     case Intrinsic::fma:
79     case Intrinsic::fmuladd:
80       return true;
81     default:
82       return false;
83     }
84   }
85 
86   // Checks if the intrinsic is an annotation.
87   bool isAssumeLikeIntrinsic() const {
88     switch (getIntrinsicID()) {
89     default: break;
90     case Intrinsic::assume:
91     case Intrinsic::sideeffect:
92     case Intrinsic::pseudoprobe:
93     case Intrinsic::dbg_declare:
94     case Intrinsic::dbg_value:
95     case Intrinsic::dbg_label:
96     case Intrinsic::invariant_start:
97     case Intrinsic::invariant_end:
98     case Intrinsic::lifetime_start:
99     case Intrinsic::lifetime_end:
100     case Intrinsic::experimental_noalias_scope_decl:
101     case Intrinsic::objectsize:
102     case Intrinsic::ptr_annotation:
103     case Intrinsic::var_annotation:
104       return true;
105     }
106     return false;
107   }
108 
109   // Methods for support type inquiry through isa, cast, and dyn_cast:
110   static bool classof(const CallInst *I) {
111     if (const Function *CF = I->getCalledFunction())
112       return CF->isIntrinsic();
113     return false;
114   }
115   static bool classof(const Value *V) {
116     return isa<CallInst>(V) && classof(cast<CallInst>(V));
117   }
118 };
119 
120 /// Check if \p ID corresponds to a debug info intrinsic.
121 static inline bool isDbgInfoIntrinsic(Intrinsic::ID ID) {
122   switch (ID) {
123   case Intrinsic::dbg_declare:
124   case Intrinsic::dbg_value:
125   case Intrinsic::dbg_addr:
126   case Intrinsic::dbg_label:
127     return true;
128   default:
129     return false;
130   }
131 }
132 
133 /// This is the common base class for debug info intrinsics.
134 class DbgInfoIntrinsic : public IntrinsicInst {
135 public:
136   /// \name Casting methods
137   /// @{
138   static bool classof(const IntrinsicInst *I) {
139     return isDbgInfoIntrinsic(I->getIntrinsicID());
140   }
141   static bool classof(const Value *V) {
142     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
143   }
144   /// @}
145 };
146 
147 /// This is the common base class for debug info intrinsics for variables.
148 class DbgVariableIntrinsic : public DbgInfoIntrinsic {
149 public:
150   // Iterator for ValueAsMetadata that internally uses direct pointer iteration
151   // over either a ValueAsMetadata* or a ValueAsMetadata**, dereferencing to the
152   // ValueAsMetadata .
153   class location_op_iterator
154       : public iterator_facade_base<location_op_iterator,
155                                     std::bidirectional_iterator_tag, Value *> {
156     PointerUnion<ValueAsMetadata *, ValueAsMetadata **> I;
157 
158   public:
159     location_op_iterator(ValueAsMetadata *SingleIter) : I(SingleIter) {}
160     location_op_iterator(ValueAsMetadata **MultiIter) : I(MultiIter) {}
161 
162     location_op_iterator(const location_op_iterator &R) : I(R.I) {}
163     location_op_iterator &operator=(const location_op_iterator &R) {
164       I = R.I;
165       return *this;
166     }
167     bool operator==(const location_op_iterator &RHS) const {
168       return I == RHS.I;
169     }
170     const Value *operator*() const {
171       ValueAsMetadata *VAM = I.is<ValueAsMetadata *>()
172                                  ? I.get<ValueAsMetadata *>()
173                                  : *I.get<ValueAsMetadata **>();
174       return VAM->getValue();
175     };
176     Value *operator*() {
177       ValueAsMetadata *VAM = I.is<ValueAsMetadata *>()
178                                  ? I.get<ValueAsMetadata *>()
179                                  : *I.get<ValueAsMetadata **>();
180       return VAM->getValue();
181     }
182     location_op_iterator &operator++() {
183       if (I.is<ValueAsMetadata *>())
184         I = I.get<ValueAsMetadata *>() + 1;
185       else
186         I = I.get<ValueAsMetadata **>() + 1;
187       return *this;
188     }
189     location_op_iterator &operator--() {
190       if (I.is<ValueAsMetadata *>())
191         I = I.get<ValueAsMetadata *>() - 1;
192       else
193         I = I.get<ValueAsMetadata **>() - 1;
194       return *this;
195     }
196   };
197 
198   /// Get the locations corresponding to the variable referenced by the debug
199   /// info intrinsic.  Depending on the intrinsic, this could be the
200   /// variable's value or its address.
201   iterator_range<location_op_iterator> location_ops() const;
202 
203   Value *getVariableLocationOp(unsigned OpIdx) const;
204 
205   void replaceVariableLocationOp(Value *OldValue, Value *NewValue);
206   void replaceVariableLocationOp(unsigned OpIdx, Value *NewValue);
207   /// Adding a new location operand will always result in this intrinsic using
208   /// an ArgList, and must always be accompanied by a new expression that uses
209   /// the new operand.
210   void addVariableLocationOps(ArrayRef<Value *> NewValues,
211                               DIExpression *NewExpr);
212 
213   void setVariable(DILocalVariable *NewVar) {
214     setArgOperand(1, MetadataAsValue::get(NewVar->getContext(), NewVar));
215   }
216 
217   void setExpression(DIExpression *NewExpr) {
218     setArgOperand(2, MetadataAsValue::get(NewExpr->getContext(), NewExpr));
219   }
220 
221   unsigned getNumVariableLocationOps() const {
222     if (hasArgList())
223       return cast<DIArgList>(getRawLocation())->getArgs().size();
224     return 1;
225   }
226 
227   bool hasArgList() const { return isa<DIArgList>(getRawLocation()); }
228 
229   /// Does this describe the address of a local variable. True for dbg.addr
230   /// and dbg.declare, but not dbg.value, which describes its value.
231   bool isAddressOfVariable() const {
232     return getIntrinsicID() != Intrinsic::dbg_value;
233   }
234 
235   void setUndef() {
236     // TODO: When/if we remove duplicate values from DIArgLists, we don't need
237     // this set anymore.
238     SmallPtrSet<Value *, 4> RemovedValues;
239     for (Value *OldValue : location_ops()) {
240       if (!RemovedValues.insert(OldValue).second)
241         continue;
242       Value *Undef = UndefValue::get(OldValue->getType());
243       replaceVariableLocationOp(OldValue, Undef);
244     }
245   }
246 
247   bool isUndef() const {
248     return (getNumVariableLocationOps() == 0 &&
249             !getExpression()->isComplex()) ||
250            any_of(location_ops(), [](Value *V) { return isa<UndefValue>(V); });
251   }
252 
253   DILocalVariable *getVariable() const {
254     return cast<DILocalVariable>(getRawVariable());
255   }
256 
257   DIExpression *getExpression() const {
258     return cast<DIExpression>(getRawExpression());
259   }
260 
261   Metadata *getRawLocation() const {
262     return cast<MetadataAsValue>(getArgOperand(0))->getMetadata();
263   }
264 
265   Metadata *getRawVariable() const {
266     return cast<MetadataAsValue>(getArgOperand(1))->getMetadata();
267   }
268 
269   Metadata *getRawExpression() const {
270     return cast<MetadataAsValue>(getArgOperand(2))->getMetadata();
271   }
272 
273   /// Use of this should generally be avoided; instead,
274   /// replaceVariableLocationOp and addVariableLocationOps should be used where
275   /// possible to avoid creating invalid state.
276   void setRawLocation(Metadata *Location) {
277     return setArgOperand(0, MetadataAsValue::get(getContext(), Location));
278   }
279 
280   /// Get the size (in bits) of the variable, or fragment of the variable that
281   /// is described.
282   Optional<uint64_t> getFragmentSizeInBits() const;
283 
284   /// \name Casting methods
285   /// @{
286   static bool classof(const IntrinsicInst *I) {
287     switch (I->getIntrinsicID()) {
288     case Intrinsic::dbg_declare:
289     case Intrinsic::dbg_value:
290     case Intrinsic::dbg_addr:
291       return true;
292     default:
293       return false;
294     }
295   }
296   static bool classof(const Value *V) {
297     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
298   }
299   /// @}
300 private:
301   void setArgOperand(unsigned i, Value *v) {
302     DbgInfoIntrinsic::setArgOperand(i, v);
303   }
304   void setOperand(unsigned i, Value *v) { DbgInfoIntrinsic::setOperand(i, v); }
305 };
306 
307 /// This represents the llvm.dbg.declare instruction.
308 class DbgDeclareInst : public DbgVariableIntrinsic {
309 public:
310   Value *getAddress() const {
311     assert(getNumVariableLocationOps() == 1 &&
312            "dbg.declare must have exactly 1 location operand.");
313     return getVariableLocationOp(0);
314   }
315 
316   /// \name Casting methods
317   /// @{
318   static bool classof(const IntrinsicInst *I) {
319     return I->getIntrinsicID() == Intrinsic::dbg_declare;
320   }
321   static bool classof(const Value *V) {
322     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
323   }
324   /// @}
325 };
326 
327 /// This represents the llvm.dbg.addr instruction.
328 class DbgAddrIntrinsic : public DbgVariableIntrinsic {
329 public:
330   Value *getAddress() const {
331     assert(getNumVariableLocationOps() == 1 &&
332            "dbg.addr must have exactly 1 location operand.");
333     return getVariableLocationOp(0);
334   }
335 
336   /// \name Casting methods
337   /// @{
338   static bool classof(const IntrinsicInst *I) {
339     return I->getIntrinsicID() == Intrinsic::dbg_addr;
340   }
341   static bool classof(const Value *V) {
342     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
343   }
344 };
345 
346 /// This represents the llvm.dbg.value instruction.
347 class DbgValueInst : public DbgVariableIntrinsic {
348 public:
349   // The default argument should only be used in ISel, and the default option
350   // should be removed once ISel support for multiple location ops is complete.
351   Value *getValue(unsigned OpIdx = 0) const {
352     return getVariableLocationOp(OpIdx);
353   }
354   iterator_range<location_op_iterator> getValues() const {
355     return location_ops();
356   }
357 
358   /// \name Casting methods
359   /// @{
360   static bool classof(const IntrinsicInst *I) {
361     return I->getIntrinsicID() == Intrinsic::dbg_value;
362   }
363   static bool classof(const Value *V) {
364     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
365   }
366   /// @}
367 };
368 
369 /// This represents the llvm.dbg.label instruction.
370 class DbgLabelInst : public DbgInfoIntrinsic {
371 public:
372   DILabel *getLabel() const { return cast<DILabel>(getRawLabel()); }
373 
374   Metadata *getRawLabel() const {
375     return cast<MetadataAsValue>(getArgOperand(0))->getMetadata();
376   }
377 
378   /// Methods for support type inquiry through isa, cast, and dyn_cast:
379   /// @{
380   static bool classof(const IntrinsicInst *I) {
381     return I->getIntrinsicID() == Intrinsic::dbg_label;
382   }
383   static bool classof(const Value *V) {
384     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
385   }
386   /// @}
387 };
388 
389 /// This is the common base class for vector predication intrinsics.
390 class VPIntrinsic : public IntrinsicInst {
391 public:
392   /// \brief Declares a llvm.vp.* intrinsic in \p M that matches the parameters
393   /// \p Params. Additionally, the load and gather intrinsics require
394   /// \p ReturnType to be specified.
395   static Function *getDeclarationForParams(Module *M, Intrinsic::ID,
396                                            Type *ReturnType,
397                                            ArrayRef<Value *> Params);
398 
399   static Optional<unsigned> getMaskParamPos(Intrinsic::ID IntrinsicID);
400   static Optional<unsigned> getVectorLengthParamPos(Intrinsic::ID IntrinsicID);
401 
402   /// The llvm.vp.* intrinsics for this instruction Opcode
403   static Intrinsic::ID getForOpcode(unsigned OC);
404 
405   // Whether \p ID is a VP intrinsic ID.
406   static bool isVPIntrinsic(Intrinsic::ID);
407 
408   /// \return The mask parameter or nullptr.
409   Value *getMaskParam() const;
410   void setMaskParam(Value *);
411 
412   /// \return The vector length parameter or nullptr.
413   Value *getVectorLengthParam() const;
414   void setVectorLengthParam(Value *);
415 
416   /// \return Whether the vector length param can be ignored.
417   bool canIgnoreVectorLengthParam() const;
418 
419   /// \return The static element count (vector number of elements) the vector
420   /// length parameter applies to.
421   ElementCount getStaticVectorLength() const;
422 
423   /// \return The alignment of the pointer used by this load/store/gather or
424   /// scatter.
425   MaybeAlign getPointerAlignment() const;
426   // MaybeAlign setPointerAlignment(Align NewAlign); // TODO
427 
428   /// \return The pointer operand of this load,store, gather or scatter.
429   Value *getMemoryPointerParam() const;
430   static Optional<unsigned> getMemoryPointerParamPos(Intrinsic::ID);
431 
432   /// \return The data (payload) operand of this store or scatter.
433   Value *getMemoryDataParam() const;
434   static Optional<unsigned> getMemoryDataParamPos(Intrinsic::ID);
435 
436   // Methods for support type inquiry through isa, cast, and dyn_cast:
437   static bool classof(const IntrinsicInst *I) {
438     return isVPIntrinsic(I->getIntrinsicID());
439   }
440   static bool classof(const Value *V) {
441     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
442   }
443 
444   // Equivalent non-predicated opcode
445   Optional<unsigned> getFunctionalOpcode() const {
446     return getFunctionalOpcodeForVP(getIntrinsicID());
447   }
448 
449   // Equivalent non-predicated opcode
450   static Optional<unsigned> getFunctionalOpcodeForVP(Intrinsic::ID ID);
451 };
452 
453 /// This represents vector predication reduction intrinsics.
454 class VPReductionIntrinsic : public VPIntrinsic {
455 public:
456   static bool isVPReduction(Intrinsic::ID ID);
457 
458   unsigned getStartParamPos() const;
459   unsigned getVectorParamPos() const;
460 
461   static Optional<unsigned> getStartParamPos(Intrinsic::ID ID);
462   static Optional<unsigned> getVectorParamPos(Intrinsic::ID ID);
463 
464   /// Methods for support type inquiry through isa, cast, and dyn_cast:
465   /// @{
466   static bool classof(const IntrinsicInst *I) {
467     return VPReductionIntrinsic::isVPReduction(I->getIntrinsicID());
468   }
469   static bool classof(const Value *V) {
470     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
471   }
472   /// @}
473 };
474 
475 /// This is the common base class for constrained floating point intrinsics.
476 class ConstrainedFPIntrinsic : public IntrinsicInst {
477 public:
478   bool isUnaryOp() const;
479   bool isTernaryOp() const;
480   Optional<RoundingMode> getRoundingMode() const;
481   Optional<fp::ExceptionBehavior> getExceptionBehavior() const;
482   bool isDefaultFPEnvironment() const;
483 
484   // Methods for support type inquiry through isa, cast, and dyn_cast:
485   static bool classof(const IntrinsicInst *I);
486   static bool classof(const Value *V) {
487     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
488   }
489 };
490 
491 /// Constrained floating point compare intrinsics.
492 class ConstrainedFPCmpIntrinsic : public ConstrainedFPIntrinsic {
493 public:
494   FCmpInst::Predicate getPredicate() const;
495 
496   // Methods for support type inquiry through isa, cast, and dyn_cast:
497   static bool classof(const IntrinsicInst *I) {
498     switch (I->getIntrinsicID()) {
499     case Intrinsic::experimental_constrained_fcmp:
500     case Intrinsic::experimental_constrained_fcmps:
501       return true;
502     default:
503       return false;
504     }
505   }
506   static bool classof(const Value *V) {
507     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
508   }
509 };
510 
511 /// This class represents min/max intrinsics.
512 class MinMaxIntrinsic : public IntrinsicInst {
513 public:
514   static bool classof(const IntrinsicInst *I) {
515     switch (I->getIntrinsicID()) {
516     case Intrinsic::umin:
517     case Intrinsic::umax:
518     case Intrinsic::smin:
519     case Intrinsic::smax:
520       return true;
521     default:
522       return false;
523     }
524   }
525   static bool classof(const Value *V) {
526     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
527   }
528 
529   Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
530   Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
531 
532   /// Returns the comparison predicate underlying the intrinsic.
533   static ICmpInst::Predicate getPredicate(Intrinsic::ID ID) {
534     switch (ID) {
535     case Intrinsic::umin:
536       return ICmpInst::Predicate::ICMP_ULT;
537     case Intrinsic::umax:
538       return ICmpInst::Predicate::ICMP_UGT;
539     case Intrinsic::smin:
540       return ICmpInst::Predicate::ICMP_SLT;
541     case Intrinsic::smax:
542       return ICmpInst::Predicate::ICMP_SGT;
543     default:
544       llvm_unreachable("Invalid intrinsic");
545     }
546   }
547 
548   /// Returns the comparison predicate underlying the intrinsic.
549   ICmpInst::Predicate getPredicate() const {
550     return getPredicate(getIntrinsicID());
551   }
552 
553   /// Whether the intrinsic is signed or unsigned.
554   static bool isSigned(Intrinsic::ID ID) {
555     return ICmpInst::isSigned(getPredicate(ID));
556   };
557 
558   /// Whether the intrinsic is signed or unsigned.
559   bool isSigned() const { return isSigned(getIntrinsicID()); };
560 
561   /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
562   /// so there is a certain threshold value, upon reaching which,
563   /// their value can no longer change. Return said threshold.
564   static APInt getSaturationPoint(Intrinsic::ID ID, unsigned numBits) {
565     switch (ID) {
566     case Intrinsic::umin:
567       return APInt::getMinValue(numBits);
568     case Intrinsic::umax:
569       return APInt::getMaxValue(numBits);
570     case Intrinsic::smin:
571       return APInt::getSignedMinValue(numBits);
572     case Intrinsic::smax:
573       return APInt::getSignedMaxValue(numBits);
574     default:
575       llvm_unreachable("Invalid intrinsic");
576     }
577   }
578 
579   /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
580   /// so there is a certain threshold value, upon reaching which,
581   /// their value can no longer change. Return said threshold.
582   APInt getSaturationPoint(unsigned numBits) const {
583     return getSaturationPoint(getIntrinsicID(), numBits);
584   }
585 
586   /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
587   /// so there is a certain threshold value, upon reaching which,
588   /// their value can no longer change. Return said threshold.
589   static Constant *getSaturationPoint(Intrinsic::ID ID, Type *Ty) {
590     return Constant::getIntegerValue(
591         Ty, getSaturationPoint(ID, Ty->getScalarSizeInBits()));
592   }
593 
594   /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
595   /// so there is a certain threshold value, upon reaching which,
596   /// their value can no longer change. Return said threshold.
597   Constant *getSaturationPoint(Type *Ty) const {
598     return getSaturationPoint(getIntrinsicID(), Ty);
599   }
600 };
601 
602 /// This class represents an intrinsic that is based on a binary operation.
603 /// This includes op.with.overflow and saturating add/sub intrinsics.
604 class BinaryOpIntrinsic : public IntrinsicInst {
605 public:
606   static bool classof(const IntrinsicInst *I) {
607     switch (I->getIntrinsicID()) {
608     case Intrinsic::uadd_with_overflow:
609     case Intrinsic::sadd_with_overflow:
610     case Intrinsic::usub_with_overflow:
611     case Intrinsic::ssub_with_overflow:
612     case Intrinsic::umul_with_overflow:
613     case Intrinsic::smul_with_overflow:
614     case Intrinsic::uadd_sat:
615     case Intrinsic::sadd_sat:
616     case Intrinsic::usub_sat:
617     case Intrinsic::ssub_sat:
618       return true;
619     default:
620       return false;
621     }
622   }
623   static bool classof(const Value *V) {
624     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
625   }
626 
627   Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
628   Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
629 
630   /// Returns the binary operation underlying the intrinsic.
631   Instruction::BinaryOps getBinaryOp() const;
632 
633   /// Whether the intrinsic is signed or unsigned.
634   bool isSigned() const;
635 
636   /// Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
637   unsigned getNoWrapKind() const;
638 };
639 
640 /// Represents an op.with.overflow intrinsic.
641 class WithOverflowInst : public BinaryOpIntrinsic {
642 public:
643   static bool classof(const IntrinsicInst *I) {
644     switch (I->getIntrinsicID()) {
645     case Intrinsic::uadd_with_overflow:
646     case Intrinsic::sadd_with_overflow:
647     case Intrinsic::usub_with_overflow:
648     case Intrinsic::ssub_with_overflow:
649     case Intrinsic::umul_with_overflow:
650     case Intrinsic::smul_with_overflow:
651       return true;
652     default:
653       return false;
654     }
655   }
656   static bool classof(const Value *V) {
657     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
658   }
659 };
660 
661 /// Represents a saturating add/sub intrinsic.
662 class SaturatingInst : public BinaryOpIntrinsic {
663 public:
664   static bool classof(const IntrinsicInst *I) {
665     switch (I->getIntrinsicID()) {
666     case Intrinsic::uadd_sat:
667     case Intrinsic::sadd_sat:
668     case Intrinsic::usub_sat:
669     case Intrinsic::ssub_sat:
670       return true;
671     default:
672       return false;
673     }
674   }
675   static bool classof(const Value *V) {
676     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
677   }
678 };
679 
680 /// Common base class for all memory intrinsics. Simply provides
681 /// common methods.
682 /// Written as CRTP to avoid a common base class amongst the
683 /// three atomicity hierarchies.
684 template <typename Derived> class MemIntrinsicBase : public IntrinsicInst {
685 private:
686   enum { ARG_DEST = 0, ARG_LENGTH = 2 };
687 
688 public:
689   Value *getRawDest() const {
690     return const_cast<Value *>(getArgOperand(ARG_DEST));
691   }
692   const Use &getRawDestUse() const { return getArgOperandUse(ARG_DEST); }
693   Use &getRawDestUse() { return getArgOperandUse(ARG_DEST); }
694 
695   Value *getLength() const {
696     return const_cast<Value *>(getArgOperand(ARG_LENGTH));
697   }
698   const Use &getLengthUse() const { return getArgOperandUse(ARG_LENGTH); }
699   Use &getLengthUse() { return getArgOperandUse(ARG_LENGTH); }
700 
701   /// This is just like getRawDest, but it strips off any cast
702   /// instructions (including addrspacecast) that feed it, giving the
703   /// original input.  The returned value is guaranteed to be a pointer.
704   Value *getDest() const { return getRawDest()->stripPointerCasts(); }
705 
706   unsigned getDestAddressSpace() const {
707     return cast<PointerType>(getRawDest()->getType())->getAddressSpace();
708   }
709 
710   /// FIXME: Remove this function once transition to Align is over.
711   /// Use getDestAlign() instead.
712   unsigned getDestAlignment() const {
713     if (auto MA = getParamAlign(ARG_DEST))
714       return MA->value();
715     return 0;
716   }
717   MaybeAlign getDestAlign() const { return getParamAlign(ARG_DEST); }
718 
719   /// Set the specified arguments of the instruction.
720   void setDest(Value *Ptr) {
721     assert(getRawDest()->getType() == Ptr->getType() &&
722            "setDest called with pointer of wrong type!");
723     setArgOperand(ARG_DEST, Ptr);
724   }
725 
726   /// FIXME: Remove this function once transition to Align is over.
727   /// Use the version that takes MaybeAlign instead of this one.
728   void setDestAlignment(unsigned Alignment) {
729     setDestAlignment(MaybeAlign(Alignment));
730   }
731   void setDestAlignment(MaybeAlign Alignment) {
732     removeParamAttr(ARG_DEST, Attribute::Alignment);
733     if (Alignment)
734       addParamAttr(ARG_DEST,
735                    Attribute::getWithAlignment(getContext(), *Alignment));
736   }
737   void setDestAlignment(Align Alignment) {
738     removeParamAttr(ARG_DEST, Attribute::Alignment);
739     addParamAttr(ARG_DEST,
740                  Attribute::getWithAlignment(getContext(), Alignment));
741   }
742 
743   void setLength(Value *L) {
744     assert(getLength()->getType() == L->getType() &&
745            "setLength called with value of wrong type!");
746     setArgOperand(ARG_LENGTH, L);
747   }
748 };
749 
750 /// Common base class for all memory transfer intrinsics. Simply provides
751 /// common methods.
752 template <class BaseCL> class MemTransferBase : public BaseCL {
753 private:
754   enum { ARG_SOURCE = 1 };
755 
756 public:
757   /// Return the arguments to the instruction.
758   Value *getRawSource() const {
759     return const_cast<Value *>(BaseCL::getArgOperand(ARG_SOURCE));
760   }
761   const Use &getRawSourceUse() const {
762     return BaseCL::getArgOperandUse(ARG_SOURCE);
763   }
764   Use &getRawSourceUse() { return BaseCL::getArgOperandUse(ARG_SOURCE); }
765 
766   /// This is just like getRawSource, but it strips off any cast
767   /// instructions that feed it, giving the original input.  The returned
768   /// value is guaranteed to be a pointer.
769   Value *getSource() const { return getRawSource()->stripPointerCasts(); }
770 
771   unsigned getSourceAddressSpace() const {
772     return cast<PointerType>(getRawSource()->getType())->getAddressSpace();
773   }
774 
775   /// FIXME: Remove this function once transition to Align is over.
776   /// Use getSourceAlign() instead.
777   unsigned getSourceAlignment() const {
778     if (auto MA = BaseCL::getParamAlign(ARG_SOURCE))
779       return MA->value();
780     return 0;
781   }
782 
783   MaybeAlign getSourceAlign() const {
784     return BaseCL::getParamAlign(ARG_SOURCE);
785   }
786 
787   void setSource(Value *Ptr) {
788     assert(getRawSource()->getType() == Ptr->getType() &&
789            "setSource called with pointer of wrong type!");
790     BaseCL::setArgOperand(ARG_SOURCE, Ptr);
791   }
792 
793   /// FIXME: Remove this function once transition to Align is over.
794   /// Use the version that takes MaybeAlign instead of this one.
795   void setSourceAlignment(unsigned Alignment) {
796     setSourceAlignment(MaybeAlign(Alignment));
797   }
798   void setSourceAlignment(MaybeAlign Alignment) {
799     BaseCL::removeParamAttr(ARG_SOURCE, Attribute::Alignment);
800     if (Alignment)
801       BaseCL::addParamAttr(ARG_SOURCE, Attribute::getWithAlignment(
802                                            BaseCL::getContext(), *Alignment));
803   }
804   void setSourceAlignment(Align Alignment) {
805     BaseCL::removeParamAttr(ARG_SOURCE, Attribute::Alignment);
806     BaseCL::addParamAttr(ARG_SOURCE, Attribute::getWithAlignment(
807                                          BaseCL::getContext(), Alignment));
808   }
809 };
810 
811 /// Common base class for all memset intrinsics. Simply provides
812 /// common methods.
813 template <class BaseCL> class MemSetBase : public BaseCL {
814 private:
815   enum { ARG_VALUE = 1 };
816 
817 public:
818   Value *getValue() const {
819     return const_cast<Value *>(BaseCL::getArgOperand(ARG_VALUE));
820   }
821   const Use &getValueUse() const { return BaseCL::getArgOperandUse(ARG_VALUE); }
822   Use &getValueUse() { return BaseCL::getArgOperandUse(ARG_VALUE); }
823 
824   void setValue(Value *Val) {
825     assert(getValue()->getType() == Val->getType() &&
826            "setValue called with value of wrong type!");
827     BaseCL::setArgOperand(ARG_VALUE, Val);
828   }
829 };
830 
831 // The common base class for the atomic memset/memmove/memcpy intrinsics
832 // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
833 class AtomicMemIntrinsic : public MemIntrinsicBase<AtomicMemIntrinsic> {
834 private:
835   enum { ARG_ELEMENTSIZE = 3 };
836 
837 public:
838   Value *getRawElementSizeInBytes() const {
839     return const_cast<Value *>(getArgOperand(ARG_ELEMENTSIZE));
840   }
841 
842   ConstantInt *getElementSizeInBytesCst() const {
843     return cast<ConstantInt>(getRawElementSizeInBytes());
844   }
845 
846   uint32_t getElementSizeInBytes() const {
847     return getElementSizeInBytesCst()->getZExtValue();
848   }
849 
850   void setElementSizeInBytes(Constant *V) {
851     assert(V->getType() == Type::getInt8Ty(getContext()) &&
852            "setElementSizeInBytes called with value of wrong type!");
853     setArgOperand(ARG_ELEMENTSIZE, V);
854   }
855 
856   static bool classof(const IntrinsicInst *I) {
857     switch (I->getIntrinsicID()) {
858     case Intrinsic::memcpy_element_unordered_atomic:
859     case Intrinsic::memmove_element_unordered_atomic:
860     case Intrinsic::memset_element_unordered_atomic:
861       return true;
862     default:
863       return false;
864     }
865   }
866   static bool classof(const Value *V) {
867     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
868   }
869 };
870 
871 /// This class represents atomic memset intrinsic
872 // i.e. llvm.element.unordered.atomic.memset
873 class AtomicMemSetInst : public MemSetBase<AtomicMemIntrinsic> {
874 public:
875   static bool classof(const IntrinsicInst *I) {
876     return I->getIntrinsicID() == Intrinsic::memset_element_unordered_atomic;
877   }
878   static bool classof(const Value *V) {
879     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
880   }
881 };
882 
883 // This class wraps the atomic memcpy/memmove intrinsics
884 // i.e. llvm.element.unordered.atomic.memcpy/memmove
885 class AtomicMemTransferInst : public MemTransferBase<AtomicMemIntrinsic> {
886 public:
887   static bool classof(const IntrinsicInst *I) {
888     switch (I->getIntrinsicID()) {
889     case Intrinsic::memcpy_element_unordered_atomic:
890     case Intrinsic::memmove_element_unordered_atomic:
891       return true;
892     default:
893       return false;
894     }
895   }
896   static bool classof(const Value *V) {
897     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
898   }
899 };
900 
901 /// This class represents the atomic memcpy intrinsic
902 /// i.e. llvm.element.unordered.atomic.memcpy
903 class AtomicMemCpyInst : public AtomicMemTransferInst {
904 public:
905   static bool classof(const IntrinsicInst *I) {
906     return I->getIntrinsicID() == Intrinsic::memcpy_element_unordered_atomic;
907   }
908   static bool classof(const Value *V) {
909     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
910   }
911 };
912 
913 /// This class represents the atomic memmove intrinsic
914 /// i.e. llvm.element.unordered.atomic.memmove
915 class AtomicMemMoveInst : public AtomicMemTransferInst {
916 public:
917   static bool classof(const IntrinsicInst *I) {
918     return I->getIntrinsicID() == Intrinsic::memmove_element_unordered_atomic;
919   }
920   static bool classof(const Value *V) {
921     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
922   }
923 };
924 
925 /// This is the common base class for memset/memcpy/memmove.
926 class MemIntrinsic : public MemIntrinsicBase<MemIntrinsic> {
927 private:
928   enum { ARG_VOLATILE = 3 };
929 
930 public:
931   ConstantInt *getVolatileCst() const {
932     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(ARG_VOLATILE)));
933   }
934 
935   bool isVolatile() const { return !getVolatileCst()->isZero(); }
936 
937   void setVolatile(Constant *V) { setArgOperand(ARG_VOLATILE, V); }
938 
939   // Methods for support type inquiry through isa, cast, and dyn_cast:
940   static bool classof(const IntrinsicInst *I) {
941     switch (I->getIntrinsicID()) {
942     case Intrinsic::memcpy:
943     case Intrinsic::memmove:
944     case Intrinsic::memset:
945     case Intrinsic::memcpy_inline:
946       return true;
947     default:
948       return false;
949     }
950   }
951   static bool classof(const Value *V) {
952     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
953   }
954 };
955 
956 /// This class wraps the llvm.memset intrinsic.
957 class MemSetInst : public MemSetBase<MemIntrinsic> {
958 public:
959   // Methods for support type inquiry through isa, cast, and dyn_cast:
960   static bool classof(const IntrinsicInst *I) {
961     return I->getIntrinsicID() == Intrinsic::memset;
962   }
963   static bool classof(const Value *V) {
964     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
965   }
966 };
967 
968 /// This class wraps the llvm.memcpy/memmove intrinsics.
969 class MemTransferInst : public MemTransferBase<MemIntrinsic> {
970 public:
971   // Methods for support type inquiry through isa, cast, and dyn_cast:
972   static bool classof(const IntrinsicInst *I) {
973     switch (I->getIntrinsicID()) {
974     case Intrinsic::memcpy:
975     case Intrinsic::memmove:
976     case Intrinsic::memcpy_inline:
977       return true;
978     default:
979       return false;
980     }
981   }
982   static bool classof(const Value *V) {
983     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
984   }
985 };
986 
987 /// This class wraps the llvm.memcpy intrinsic.
988 class MemCpyInst : public MemTransferInst {
989 public:
990   // Methods for support type inquiry through isa, cast, and dyn_cast:
991   static bool classof(const IntrinsicInst *I) {
992     return I->getIntrinsicID() == Intrinsic::memcpy ||
993            I->getIntrinsicID() == Intrinsic::memcpy_inline;
994   }
995   static bool classof(const Value *V) {
996     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
997   }
998 };
999 
1000 /// This class wraps the llvm.memmove intrinsic.
1001 class MemMoveInst : public MemTransferInst {
1002 public:
1003   // Methods for support type inquiry through isa, cast, and dyn_cast:
1004   static bool classof(const IntrinsicInst *I) {
1005     return I->getIntrinsicID() == Intrinsic::memmove;
1006   }
1007   static bool classof(const Value *V) {
1008     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1009   }
1010 };
1011 
1012 /// This class wraps the llvm.memcpy.inline intrinsic.
1013 class MemCpyInlineInst : public MemCpyInst {
1014 public:
1015   ConstantInt *getLength() const {
1016     return cast<ConstantInt>(MemCpyInst::getLength());
1017   }
1018   // Methods for support type inquiry through isa, cast, and dyn_cast:
1019   static bool classof(const IntrinsicInst *I) {
1020     return I->getIntrinsicID() == Intrinsic::memcpy_inline;
1021   }
1022   static bool classof(const Value *V) {
1023     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1024   }
1025 };
1026 
1027 // The common base class for any memset/memmove/memcpy intrinsics;
1028 // whether they be atomic or non-atomic.
1029 // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
1030 //  and llvm.memset/memcpy/memmove
1031 class AnyMemIntrinsic : public MemIntrinsicBase<AnyMemIntrinsic> {
1032 public:
1033   bool isVolatile() const {
1034     // Only the non-atomic intrinsics can be volatile
1035     if (auto *MI = dyn_cast<MemIntrinsic>(this))
1036       return MI->isVolatile();
1037     return false;
1038   }
1039 
1040   static bool classof(const IntrinsicInst *I) {
1041     switch (I->getIntrinsicID()) {
1042     case Intrinsic::memcpy:
1043     case Intrinsic::memcpy_inline:
1044     case Intrinsic::memmove:
1045     case Intrinsic::memset:
1046     case Intrinsic::memcpy_element_unordered_atomic:
1047     case Intrinsic::memmove_element_unordered_atomic:
1048     case Intrinsic::memset_element_unordered_atomic:
1049       return true;
1050     default:
1051       return false;
1052     }
1053   }
1054   static bool classof(const Value *V) {
1055     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1056   }
1057 };
1058 
1059 /// This class represents any memset intrinsic
1060 // i.e. llvm.element.unordered.atomic.memset
1061 // and  llvm.memset
1062 class AnyMemSetInst : public MemSetBase<AnyMemIntrinsic> {
1063 public:
1064   static bool classof(const IntrinsicInst *I) {
1065     switch (I->getIntrinsicID()) {
1066     case Intrinsic::memset:
1067     case Intrinsic::memset_element_unordered_atomic:
1068       return true;
1069     default:
1070       return false;
1071     }
1072   }
1073   static bool classof(const Value *V) {
1074     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1075   }
1076 };
1077 
1078 // This class wraps any memcpy/memmove intrinsics
1079 // i.e. llvm.element.unordered.atomic.memcpy/memmove
1080 // and  llvm.memcpy/memmove
1081 class AnyMemTransferInst : public MemTransferBase<AnyMemIntrinsic> {
1082 public:
1083   static bool classof(const IntrinsicInst *I) {
1084     switch (I->getIntrinsicID()) {
1085     case Intrinsic::memcpy:
1086     case Intrinsic::memcpy_inline:
1087     case Intrinsic::memmove:
1088     case Intrinsic::memcpy_element_unordered_atomic:
1089     case Intrinsic::memmove_element_unordered_atomic:
1090       return true;
1091     default:
1092       return false;
1093     }
1094   }
1095   static bool classof(const Value *V) {
1096     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1097   }
1098 };
1099 
1100 /// This class represents any memcpy intrinsic
1101 /// i.e. llvm.element.unordered.atomic.memcpy
1102 ///  and llvm.memcpy
1103 class AnyMemCpyInst : public AnyMemTransferInst {
1104 public:
1105   static bool classof(const IntrinsicInst *I) {
1106     switch (I->getIntrinsicID()) {
1107     case Intrinsic::memcpy:
1108     case Intrinsic::memcpy_inline:
1109     case Intrinsic::memcpy_element_unordered_atomic:
1110       return true;
1111     default:
1112       return false;
1113     }
1114   }
1115   static bool classof(const Value *V) {
1116     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1117   }
1118 };
1119 
1120 /// This class represents any memmove intrinsic
1121 /// i.e. llvm.element.unordered.atomic.memmove
1122 ///  and llvm.memmove
1123 class AnyMemMoveInst : public AnyMemTransferInst {
1124 public:
1125   static bool classof(const IntrinsicInst *I) {
1126     switch (I->getIntrinsicID()) {
1127     case Intrinsic::memmove:
1128     case Intrinsic::memmove_element_unordered_atomic:
1129       return true;
1130     default:
1131       return false;
1132     }
1133   }
1134   static bool classof(const Value *V) {
1135     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1136   }
1137 };
1138 
1139 /// This represents the llvm.va_start intrinsic.
1140 class VAStartInst : public IntrinsicInst {
1141 public:
1142   static bool classof(const IntrinsicInst *I) {
1143     return I->getIntrinsicID() == Intrinsic::vastart;
1144   }
1145   static bool classof(const Value *V) {
1146     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1147   }
1148 
1149   Value *getArgList() const { return const_cast<Value *>(getArgOperand(0)); }
1150 };
1151 
1152 /// This represents the llvm.va_end intrinsic.
1153 class VAEndInst : public IntrinsicInst {
1154 public:
1155   static bool classof(const IntrinsicInst *I) {
1156     return I->getIntrinsicID() == Intrinsic::vaend;
1157   }
1158   static bool classof(const Value *V) {
1159     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1160   }
1161 
1162   Value *getArgList() const { return const_cast<Value *>(getArgOperand(0)); }
1163 };
1164 
1165 /// This represents the llvm.va_copy intrinsic.
1166 class VACopyInst : public IntrinsicInst {
1167 public:
1168   static bool classof(const IntrinsicInst *I) {
1169     return I->getIntrinsicID() == Intrinsic::vacopy;
1170   }
1171   static bool classof(const Value *V) {
1172     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1173   }
1174 
1175   Value *getDest() const { return const_cast<Value *>(getArgOperand(0)); }
1176   Value *getSrc() const { return const_cast<Value *>(getArgOperand(1)); }
1177 };
1178 
1179 /// A base class for all instrprof intrinsics.
1180 class InstrProfInstBase : public IntrinsicInst {
1181 public:
1182   // The name of the instrumented function.
1183   GlobalVariable *getName() const {
1184     return cast<GlobalVariable>(
1185         const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
1186   }
1187   // The hash of the CFG for the instrumented function.
1188   ConstantInt *getHash() const {
1189     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
1190   }
1191   // The number of counters for the instrumented function.
1192   ConstantInt *getNumCounters() const;
1193   // The index of the counter that this instruction acts on.
1194   ConstantInt *getIndex() const;
1195 };
1196 
1197 /// This represents the llvm.instrprof.cover intrinsic.
1198 class InstrProfCoverInst : public InstrProfInstBase {
1199 public:
1200   static bool classof(const IntrinsicInst *I) {
1201     return I->getIntrinsicID() == Intrinsic::instrprof_cover;
1202   }
1203   static bool classof(const Value *V) {
1204     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1205   }
1206 };
1207 
1208 /// This represents the llvm.instrprof.increment intrinsic.
1209 class InstrProfIncrementInst : public InstrProfInstBase {
1210 public:
1211   static bool classof(const IntrinsicInst *I) {
1212     return I->getIntrinsicID() == Intrinsic::instrprof_increment;
1213   }
1214   static bool classof(const Value *V) {
1215     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1216   }
1217   Value *getStep() const;
1218 };
1219 
1220 /// This represents the llvm.instrprof.increment.step intrinsic.
1221 class InstrProfIncrementInstStep : public InstrProfIncrementInst {
1222 public:
1223   static bool classof(const IntrinsicInst *I) {
1224     return I->getIntrinsicID() == Intrinsic::instrprof_increment_step;
1225   }
1226   static bool classof(const Value *V) {
1227     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1228   }
1229 };
1230 
1231 /// This represents the llvm.instrprof.value.profile intrinsic.
1232 class InstrProfValueProfileInst : public InstrProfInstBase {
1233 public:
1234   static bool classof(const IntrinsicInst *I) {
1235     return I->getIntrinsicID() == Intrinsic::instrprof_value_profile;
1236   }
1237   static bool classof(const Value *V) {
1238     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1239   }
1240 
1241   Value *getTargetValue() const {
1242     return cast<Value>(const_cast<Value *>(getArgOperand(2)));
1243   }
1244 
1245   ConstantInt *getValueKind() const {
1246     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
1247   }
1248 
1249   // Returns the value site index.
1250   ConstantInt *getIndex() const {
1251     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(4)));
1252   }
1253 };
1254 
1255 class PseudoProbeInst : public IntrinsicInst {
1256 public:
1257   static bool classof(const IntrinsicInst *I) {
1258     return I->getIntrinsicID() == Intrinsic::pseudoprobe;
1259   }
1260 
1261   static bool classof(const Value *V) {
1262     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1263   }
1264 
1265   ConstantInt *getFuncGuid() const {
1266     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(0)));
1267   }
1268 
1269   ConstantInt *getIndex() const {
1270     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
1271   }
1272 
1273   ConstantInt *getAttributes() const {
1274     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
1275   }
1276 
1277   ConstantInt *getFactor() const {
1278     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
1279   }
1280 };
1281 
1282 class NoAliasScopeDeclInst : public IntrinsicInst {
1283 public:
1284   static bool classof(const IntrinsicInst *I) {
1285     return I->getIntrinsicID() == Intrinsic::experimental_noalias_scope_decl;
1286   }
1287 
1288   static bool classof(const Value *V) {
1289     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1290   }
1291 
1292   MDNode *getScopeList() const {
1293     auto *MV =
1294         cast<MetadataAsValue>(getOperand(Intrinsic::NoAliasScopeDeclScopeArg));
1295     return cast<MDNode>(MV->getMetadata());
1296   }
1297 
1298   void setScopeList(MDNode *ScopeList) {
1299     setOperand(Intrinsic::NoAliasScopeDeclScopeArg,
1300                MetadataAsValue::get(getContext(), ScopeList));
1301   }
1302 };
1303 
1304 // Defined in Statepoint.h -- NOT a subclass of IntrinsicInst
1305 class GCStatepointInst;
1306 
1307 /// Common base class for representing values projected from a statepoint.
1308 /// Currently, the only projections available are gc.result and gc.relocate.
1309 class GCProjectionInst : public IntrinsicInst {
1310 public:
1311   static bool classof(const IntrinsicInst *I) {
1312     return I->getIntrinsicID() == Intrinsic::experimental_gc_relocate ||
1313       I->getIntrinsicID() == Intrinsic::experimental_gc_result;
1314   }
1315 
1316   static bool classof(const Value *V) {
1317     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1318   }
1319 
1320   /// Return true if this relocate is tied to the invoke statepoint.
1321   /// This includes relocates which are on the unwinding path.
1322   bool isTiedToInvoke() const {
1323     const Value *Token = getArgOperand(0);
1324 
1325     return isa<LandingPadInst>(Token) || isa<InvokeInst>(Token);
1326   }
1327 
1328   /// The statepoint with which this gc.relocate is associated.
1329   const GCStatepointInst *getStatepoint() const;
1330 };
1331 
1332 /// Represents calls to the gc.relocate intrinsic.
1333 class GCRelocateInst : public GCProjectionInst {
1334 public:
1335   static bool classof(const IntrinsicInst *I) {
1336     return I->getIntrinsicID() == Intrinsic::experimental_gc_relocate;
1337   }
1338 
1339   static bool classof(const Value *V) {
1340     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1341   }
1342 
1343   /// The index into the associate statepoint's argument list
1344   /// which contains the base pointer of the pointer whose
1345   /// relocation this gc.relocate describes.
1346   unsigned getBasePtrIndex() const {
1347     return cast<ConstantInt>(getArgOperand(1))->getZExtValue();
1348   }
1349 
1350   /// The index into the associate statepoint's argument list which
1351   /// contains the pointer whose relocation this gc.relocate describes.
1352   unsigned getDerivedPtrIndex() const {
1353     return cast<ConstantInt>(getArgOperand(2))->getZExtValue();
1354   }
1355 
1356   Value *getBasePtr() const;
1357   Value *getDerivedPtr() const;
1358 };
1359 
1360 /// Represents calls to the gc.result intrinsic.
1361 class GCResultInst : public GCProjectionInst {
1362 public:
1363   static bool classof(const IntrinsicInst *I) {
1364     return I->getIntrinsicID() == Intrinsic::experimental_gc_result;
1365   }
1366 
1367   static bool classof(const Value *V) {
1368     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1369   }
1370 };
1371 
1372 
1373 /// This represents the llvm.assume intrinsic.
1374 class AssumeInst : public IntrinsicInst {
1375 public:
1376   static bool classof(const IntrinsicInst *I) {
1377     return I->getIntrinsicID() == Intrinsic::assume;
1378   }
1379   static bool classof(const Value *V) {
1380     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1381   }
1382 };
1383 
1384 } // end namespace llvm
1385 
1386 #endif // LLVM_IR_INTRINSICINST_H
1387