Home | History | Annotate | Line # | Download | only in IR
      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   static Optional<int> GetMaskParamPos(Intrinsic::ID IntrinsicID);
    393   static Optional<int> GetVectorLengthParamPos(Intrinsic::ID IntrinsicID);
    394 
    395   /// The llvm.vp.* intrinsics for this instruction Opcode
    396   static Intrinsic::ID GetForOpcode(unsigned OC);
    397 
    398   // Whether \p ID is a VP intrinsic ID.
    399   static bool IsVPIntrinsic(Intrinsic::ID);
    400 
    401   /// \return the mask parameter or nullptr.
    402   Value *getMaskParam() const;
    403   void setMaskParam(Value *);
    404 
    405   /// \return the vector length parameter or nullptr.
    406   Value *getVectorLengthParam() const;
    407   void setVectorLengthParam(Value *);
    408 
    409   /// \return whether the vector length param can be ignored.
    410   bool canIgnoreVectorLengthParam() const;
    411 
    412   /// \return the static element count (vector number of elements) the vector
    413   /// length parameter applies to.
    414   ElementCount getStaticVectorLength() const;
    415 
    416   // Methods for support type inquiry through isa, cast, and dyn_cast:
    417   static bool classof(const IntrinsicInst *I) {
    418     return IsVPIntrinsic(I->getIntrinsicID());
    419   }
    420   static bool classof(const Value *V) {
    421     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    422   }
    423 
    424   // Equivalent non-predicated opcode
    425   Optional<unsigned> getFunctionalOpcode() const {
    426     return GetFunctionalOpcodeForVP(getIntrinsicID());
    427   }
    428 
    429   // Equivalent non-predicated opcode
    430   static Optional<unsigned> GetFunctionalOpcodeForVP(Intrinsic::ID ID);
    431 };
    432 
    433 /// This is the common base class for constrained floating point intrinsics.
    434 class ConstrainedFPIntrinsic : public IntrinsicInst {
    435 public:
    436   bool isUnaryOp() const;
    437   bool isTernaryOp() const;
    438   Optional<RoundingMode> getRoundingMode() const;
    439   Optional<fp::ExceptionBehavior> getExceptionBehavior() const;
    440   bool isDefaultFPEnvironment() const;
    441 
    442   // Methods for support type inquiry through isa, cast, and dyn_cast:
    443   static bool classof(const IntrinsicInst *I);
    444   static bool classof(const Value *V) {
    445     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    446   }
    447 };
    448 
    449 /// Constrained floating point compare intrinsics.
    450 class ConstrainedFPCmpIntrinsic : public ConstrainedFPIntrinsic {
    451 public:
    452   FCmpInst::Predicate getPredicate() const;
    453 
    454   // Methods for support type inquiry through isa, cast, and dyn_cast:
    455   static bool classof(const IntrinsicInst *I) {
    456     switch (I->getIntrinsicID()) {
    457     case Intrinsic::experimental_constrained_fcmp:
    458     case Intrinsic::experimental_constrained_fcmps:
    459       return true;
    460     default:
    461       return false;
    462     }
    463   }
    464   static bool classof(const Value *V) {
    465     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    466   }
    467 };
    468 
    469 /// This class represents min/max intrinsics.
    470 class MinMaxIntrinsic : public IntrinsicInst {
    471 public:
    472   static bool classof(const IntrinsicInst *I) {
    473     switch (I->getIntrinsicID()) {
    474     case Intrinsic::umin:
    475     case Intrinsic::umax:
    476     case Intrinsic::smin:
    477     case Intrinsic::smax:
    478       return true;
    479     default:
    480       return false;
    481     }
    482   }
    483   static bool classof(const Value *V) {
    484     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    485   }
    486 
    487   Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
    488   Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
    489 
    490   /// Returns the comparison predicate underlying the intrinsic.
    491   ICmpInst::Predicate getPredicate() const {
    492     switch (getIntrinsicID()) {
    493     case Intrinsic::umin:
    494       return ICmpInst::Predicate::ICMP_ULT;
    495     case Intrinsic::umax:
    496       return ICmpInst::Predicate::ICMP_UGT;
    497     case Intrinsic::smin:
    498       return ICmpInst::Predicate::ICMP_SLT;
    499     case Intrinsic::smax:
    500       return ICmpInst::Predicate::ICMP_SGT;
    501     default:
    502       llvm_unreachable("Invalid intrinsic");
    503     }
    504   }
    505 
    506   /// Whether the intrinsic is signed or unsigned.
    507   bool isSigned() const { return ICmpInst::isSigned(getPredicate()); };
    508 };
    509 
    510 /// This class represents an intrinsic that is based on a binary operation.
    511 /// This includes op.with.overflow and saturating add/sub intrinsics.
    512 class BinaryOpIntrinsic : public IntrinsicInst {
    513 public:
    514   static bool classof(const IntrinsicInst *I) {
    515     switch (I->getIntrinsicID()) {
    516     case Intrinsic::uadd_with_overflow:
    517     case Intrinsic::sadd_with_overflow:
    518     case Intrinsic::usub_with_overflow:
    519     case Intrinsic::ssub_with_overflow:
    520     case Intrinsic::umul_with_overflow:
    521     case Intrinsic::smul_with_overflow:
    522     case Intrinsic::uadd_sat:
    523     case Intrinsic::sadd_sat:
    524     case Intrinsic::usub_sat:
    525     case Intrinsic::ssub_sat:
    526       return true;
    527     default:
    528       return false;
    529     }
    530   }
    531   static bool classof(const Value *V) {
    532     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    533   }
    534 
    535   Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
    536   Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
    537 
    538   /// Returns the binary operation underlying the intrinsic.
    539   Instruction::BinaryOps getBinaryOp() const;
    540 
    541   /// Whether the intrinsic is signed or unsigned.
    542   bool isSigned() const;
    543 
    544   /// Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
    545   unsigned getNoWrapKind() const;
    546 };
    547 
    548 /// Represents an op.with.overflow intrinsic.
    549 class WithOverflowInst : public BinaryOpIntrinsic {
    550 public:
    551   static bool classof(const IntrinsicInst *I) {
    552     switch (I->getIntrinsicID()) {
    553     case Intrinsic::uadd_with_overflow:
    554     case Intrinsic::sadd_with_overflow:
    555     case Intrinsic::usub_with_overflow:
    556     case Intrinsic::ssub_with_overflow:
    557     case Intrinsic::umul_with_overflow:
    558     case Intrinsic::smul_with_overflow:
    559       return true;
    560     default:
    561       return false;
    562     }
    563   }
    564   static bool classof(const Value *V) {
    565     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    566   }
    567 };
    568 
    569 /// Represents a saturating add/sub intrinsic.
    570 class SaturatingInst : public BinaryOpIntrinsic {
    571 public:
    572   static bool classof(const IntrinsicInst *I) {
    573     switch (I->getIntrinsicID()) {
    574     case Intrinsic::uadd_sat:
    575     case Intrinsic::sadd_sat:
    576     case Intrinsic::usub_sat:
    577     case Intrinsic::ssub_sat:
    578       return true;
    579     default:
    580       return false;
    581     }
    582   }
    583   static bool classof(const Value *V) {
    584     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    585   }
    586 };
    587 
    588 /// Common base class for all memory intrinsics. Simply provides
    589 /// common methods.
    590 /// Written as CRTP to avoid a common base class amongst the
    591 /// three atomicity hierarchies.
    592 template <typename Derived> class MemIntrinsicBase : public IntrinsicInst {
    593 private:
    594   enum { ARG_DEST = 0, ARG_LENGTH = 2 };
    595 
    596 public:
    597   Value *getRawDest() const {
    598     return const_cast<Value *>(getArgOperand(ARG_DEST));
    599   }
    600   const Use &getRawDestUse() const { return getArgOperandUse(ARG_DEST); }
    601   Use &getRawDestUse() { return getArgOperandUse(ARG_DEST); }
    602 
    603   Value *getLength() const {
    604     return const_cast<Value *>(getArgOperand(ARG_LENGTH));
    605   }
    606   const Use &getLengthUse() const { return getArgOperandUse(ARG_LENGTH); }
    607   Use &getLengthUse() { return getArgOperandUse(ARG_LENGTH); }
    608 
    609   /// This is just like getRawDest, but it strips off any cast
    610   /// instructions (including addrspacecast) that feed it, giving the
    611   /// original input.  The returned value is guaranteed to be a pointer.
    612   Value *getDest() const { return getRawDest()->stripPointerCasts(); }
    613 
    614   unsigned getDestAddressSpace() const {
    615     return cast<PointerType>(getRawDest()->getType())->getAddressSpace();
    616   }
    617 
    618   /// FIXME: Remove this function once transition to Align is over.
    619   /// Use getDestAlign() instead.
    620   unsigned getDestAlignment() const {
    621     if (auto MA = getParamAlign(ARG_DEST))
    622       return MA->value();
    623     return 0;
    624   }
    625   MaybeAlign getDestAlign() const { return getParamAlign(ARG_DEST); }
    626 
    627   /// Set the specified arguments of the instruction.
    628   void setDest(Value *Ptr) {
    629     assert(getRawDest()->getType() == Ptr->getType() &&
    630            "setDest called with pointer of wrong type!");
    631     setArgOperand(ARG_DEST, Ptr);
    632   }
    633 
    634   /// FIXME: Remove this function once transition to Align is over.
    635   /// Use the version that takes MaybeAlign instead of this one.
    636   void setDestAlignment(unsigned Alignment) {
    637     setDestAlignment(MaybeAlign(Alignment));
    638   }
    639   void setDestAlignment(MaybeAlign Alignment) {
    640     removeParamAttr(ARG_DEST, Attribute::Alignment);
    641     if (Alignment)
    642       addParamAttr(ARG_DEST,
    643                    Attribute::getWithAlignment(getContext(), *Alignment));
    644   }
    645   void setDestAlignment(Align Alignment) {
    646     removeParamAttr(ARG_DEST, Attribute::Alignment);
    647     addParamAttr(ARG_DEST,
    648                  Attribute::getWithAlignment(getContext(), Alignment));
    649   }
    650 
    651   void setLength(Value *L) {
    652     assert(getLength()->getType() == L->getType() &&
    653            "setLength called with value of wrong type!");
    654     setArgOperand(ARG_LENGTH, L);
    655   }
    656 };
    657 
    658 /// Common base class for all memory transfer intrinsics. Simply provides
    659 /// common methods.
    660 template <class BaseCL> class MemTransferBase : public BaseCL {
    661 private:
    662   enum { ARG_SOURCE = 1 };
    663 
    664 public:
    665   /// Return the arguments to the instruction.
    666   Value *getRawSource() const {
    667     return const_cast<Value *>(BaseCL::getArgOperand(ARG_SOURCE));
    668   }
    669   const Use &getRawSourceUse() const {
    670     return BaseCL::getArgOperandUse(ARG_SOURCE);
    671   }
    672   Use &getRawSourceUse() { return BaseCL::getArgOperandUse(ARG_SOURCE); }
    673 
    674   /// This is just like getRawSource, but it strips off any cast
    675   /// instructions that feed it, giving the original input.  The returned
    676   /// value is guaranteed to be a pointer.
    677   Value *getSource() const { return getRawSource()->stripPointerCasts(); }
    678 
    679   unsigned getSourceAddressSpace() const {
    680     return cast<PointerType>(getRawSource()->getType())->getAddressSpace();
    681   }
    682 
    683   /// FIXME: Remove this function once transition to Align is over.
    684   /// Use getSourceAlign() instead.
    685   unsigned getSourceAlignment() const {
    686     if (auto MA = BaseCL::getParamAlign(ARG_SOURCE))
    687       return MA->value();
    688     return 0;
    689   }
    690 
    691   MaybeAlign getSourceAlign() const {
    692     return BaseCL::getParamAlign(ARG_SOURCE);
    693   }
    694 
    695   void setSource(Value *Ptr) {
    696     assert(getRawSource()->getType() == Ptr->getType() &&
    697            "setSource called with pointer of wrong type!");
    698     BaseCL::setArgOperand(ARG_SOURCE, Ptr);
    699   }
    700 
    701   /// FIXME: Remove this function once transition to Align is over.
    702   /// Use the version that takes MaybeAlign instead of this one.
    703   void setSourceAlignment(unsigned Alignment) {
    704     setSourceAlignment(MaybeAlign(Alignment));
    705   }
    706   void setSourceAlignment(MaybeAlign Alignment) {
    707     BaseCL::removeParamAttr(ARG_SOURCE, Attribute::Alignment);
    708     if (Alignment)
    709       BaseCL::addParamAttr(ARG_SOURCE, Attribute::getWithAlignment(
    710                                            BaseCL::getContext(), *Alignment));
    711   }
    712   void setSourceAlignment(Align Alignment) {
    713     BaseCL::removeParamAttr(ARG_SOURCE, Attribute::Alignment);
    714     BaseCL::addParamAttr(ARG_SOURCE, Attribute::getWithAlignment(
    715                                          BaseCL::getContext(), Alignment));
    716   }
    717 };
    718 
    719 /// Common base class for all memset intrinsics. Simply provides
    720 /// common methods.
    721 template <class BaseCL> class MemSetBase : public BaseCL {
    722 private:
    723   enum { ARG_VALUE = 1 };
    724 
    725 public:
    726   Value *getValue() const {
    727     return const_cast<Value *>(BaseCL::getArgOperand(ARG_VALUE));
    728   }
    729   const Use &getValueUse() const { return BaseCL::getArgOperandUse(ARG_VALUE); }
    730   Use &getValueUse() { return BaseCL::getArgOperandUse(ARG_VALUE); }
    731 
    732   void setValue(Value *Val) {
    733     assert(getValue()->getType() == Val->getType() &&
    734            "setValue called with value of wrong type!");
    735     BaseCL::setArgOperand(ARG_VALUE, Val);
    736   }
    737 };
    738 
    739 // The common base class for the atomic memset/memmove/memcpy intrinsics
    740 // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
    741 class AtomicMemIntrinsic : public MemIntrinsicBase<AtomicMemIntrinsic> {
    742 private:
    743   enum { ARG_ELEMENTSIZE = 3 };
    744 
    745 public:
    746   Value *getRawElementSizeInBytes() const {
    747     return const_cast<Value *>(getArgOperand(ARG_ELEMENTSIZE));
    748   }
    749 
    750   ConstantInt *getElementSizeInBytesCst() const {
    751     return cast<ConstantInt>(getRawElementSizeInBytes());
    752   }
    753 
    754   uint32_t getElementSizeInBytes() const {
    755     return getElementSizeInBytesCst()->getZExtValue();
    756   }
    757 
    758   void setElementSizeInBytes(Constant *V) {
    759     assert(V->getType() == Type::getInt8Ty(getContext()) &&
    760            "setElementSizeInBytes called with value of wrong type!");
    761     setArgOperand(ARG_ELEMENTSIZE, V);
    762   }
    763 
    764   static bool classof(const IntrinsicInst *I) {
    765     switch (I->getIntrinsicID()) {
    766     case Intrinsic::memcpy_element_unordered_atomic:
    767     case Intrinsic::memmove_element_unordered_atomic:
    768     case Intrinsic::memset_element_unordered_atomic:
    769       return true;
    770     default:
    771       return false;
    772     }
    773   }
    774   static bool classof(const Value *V) {
    775     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    776   }
    777 };
    778 
    779 /// This class represents atomic memset intrinsic
    780 // i.e. llvm.element.unordered.atomic.memset
    781 class AtomicMemSetInst : public MemSetBase<AtomicMemIntrinsic> {
    782 public:
    783   static bool classof(const IntrinsicInst *I) {
    784     return I->getIntrinsicID() == Intrinsic::memset_element_unordered_atomic;
    785   }
    786   static bool classof(const Value *V) {
    787     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    788   }
    789 };
    790 
    791 // This class wraps the atomic memcpy/memmove intrinsics
    792 // i.e. llvm.element.unordered.atomic.memcpy/memmove
    793 class AtomicMemTransferInst : public MemTransferBase<AtomicMemIntrinsic> {
    794 public:
    795   static bool classof(const IntrinsicInst *I) {
    796     switch (I->getIntrinsicID()) {
    797     case Intrinsic::memcpy_element_unordered_atomic:
    798     case Intrinsic::memmove_element_unordered_atomic:
    799       return true;
    800     default:
    801       return false;
    802     }
    803   }
    804   static bool classof(const Value *V) {
    805     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    806   }
    807 };
    808 
    809 /// This class represents the atomic memcpy intrinsic
    810 /// i.e. llvm.element.unordered.atomic.memcpy
    811 class AtomicMemCpyInst : public AtomicMemTransferInst {
    812 public:
    813   static bool classof(const IntrinsicInst *I) {
    814     return I->getIntrinsicID() == Intrinsic::memcpy_element_unordered_atomic;
    815   }
    816   static bool classof(const Value *V) {
    817     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    818   }
    819 };
    820 
    821 /// This class represents the atomic memmove intrinsic
    822 /// i.e. llvm.element.unordered.atomic.memmove
    823 class AtomicMemMoveInst : public AtomicMemTransferInst {
    824 public:
    825   static bool classof(const IntrinsicInst *I) {
    826     return I->getIntrinsicID() == Intrinsic::memmove_element_unordered_atomic;
    827   }
    828   static bool classof(const Value *V) {
    829     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    830   }
    831 };
    832 
    833 /// This is the common base class for memset/memcpy/memmove.
    834 class MemIntrinsic : public MemIntrinsicBase<MemIntrinsic> {
    835 private:
    836   enum { ARG_VOLATILE = 3 };
    837 
    838 public:
    839   ConstantInt *getVolatileCst() const {
    840     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(ARG_VOLATILE)));
    841   }
    842 
    843   bool isVolatile() const { return !getVolatileCst()->isZero(); }
    844 
    845   void setVolatile(Constant *V) { setArgOperand(ARG_VOLATILE, V); }
    846 
    847   // Methods for support type inquiry through isa, cast, and dyn_cast:
    848   static bool classof(const IntrinsicInst *I) {
    849     switch (I->getIntrinsicID()) {
    850     case Intrinsic::memcpy:
    851     case Intrinsic::memmove:
    852     case Intrinsic::memset:
    853     case Intrinsic::memcpy_inline:
    854       return true;
    855     default:
    856       return false;
    857     }
    858   }
    859   static bool classof(const Value *V) {
    860     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    861   }
    862 };
    863 
    864 /// This class wraps the llvm.memset intrinsic.
    865 class MemSetInst : public MemSetBase<MemIntrinsic> {
    866 public:
    867   // Methods for support type inquiry through isa, cast, and dyn_cast:
    868   static bool classof(const IntrinsicInst *I) {
    869     return I->getIntrinsicID() == Intrinsic::memset;
    870   }
    871   static bool classof(const Value *V) {
    872     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    873   }
    874 };
    875 
    876 /// This class wraps the llvm.memcpy/memmove intrinsics.
    877 class MemTransferInst : public MemTransferBase<MemIntrinsic> {
    878 public:
    879   // Methods for support type inquiry through isa, cast, and dyn_cast:
    880   static bool classof(const IntrinsicInst *I) {
    881     switch (I->getIntrinsicID()) {
    882     case Intrinsic::memcpy:
    883     case Intrinsic::memmove:
    884     case Intrinsic::memcpy_inline:
    885       return true;
    886     default:
    887       return false;
    888     }
    889   }
    890   static bool classof(const Value *V) {
    891     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    892   }
    893 };
    894 
    895 /// This class wraps the llvm.memcpy intrinsic.
    896 class MemCpyInst : public MemTransferInst {
    897 public:
    898   // Methods for support type inquiry through isa, cast, and dyn_cast:
    899   static bool classof(const IntrinsicInst *I) {
    900     return I->getIntrinsicID() == Intrinsic::memcpy;
    901   }
    902   static bool classof(const Value *V) {
    903     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    904   }
    905 };
    906 
    907 /// This class wraps the llvm.memmove intrinsic.
    908 class MemMoveInst : public MemTransferInst {
    909 public:
    910   // Methods for support type inquiry through isa, cast, and dyn_cast:
    911   static bool classof(const IntrinsicInst *I) {
    912     return I->getIntrinsicID() == Intrinsic::memmove;
    913   }
    914   static bool classof(const Value *V) {
    915     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    916   }
    917 };
    918 
    919 /// This class wraps the llvm.memcpy.inline intrinsic.
    920 class MemCpyInlineInst : public MemTransferInst {
    921 public:
    922   ConstantInt *getLength() const {
    923     return cast<ConstantInt>(MemTransferInst::getLength());
    924   }
    925   // Methods for support type inquiry through isa, cast, and dyn_cast:
    926   static bool classof(const IntrinsicInst *I) {
    927     return I->getIntrinsicID() == Intrinsic::memcpy_inline;
    928   }
    929   static bool classof(const Value *V) {
    930     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    931   }
    932 };
    933 
    934 // The common base class for any memset/memmove/memcpy intrinsics;
    935 // whether they be atomic or non-atomic.
    936 // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
    937 //  and llvm.memset/memcpy/memmove
    938 class AnyMemIntrinsic : public MemIntrinsicBase<AnyMemIntrinsic> {
    939 public:
    940   bool isVolatile() const {
    941     // Only the non-atomic intrinsics can be volatile
    942     if (auto *MI = dyn_cast<MemIntrinsic>(this))
    943       return MI->isVolatile();
    944     return false;
    945   }
    946 
    947   static bool classof(const IntrinsicInst *I) {
    948     switch (I->getIntrinsicID()) {
    949     case Intrinsic::memcpy:
    950     case Intrinsic::memcpy_inline:
    951     case Intrinsic::memmove:
    952     case Intrinsic::memset:
    953     case Intrinsic::memcpy_element_unordered_atomic:
    954     case Intrinsic::memmove_element_unordered_atomic:
    955     case Intrinsic::memset_element_unordered_atomic:
    956       return true;
    957     default:
    958       return false;
    959     }
    960   }
    961   static bool classof(const Value *V) {
    962     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    963   }
    964 };
    965 
    966 /// This class represents any memset intrinsic
    967 // i.e. llvm.element.unordered.atomic.memset
    968 // and  llvm.memset
    969 class AnyMemSetInst : public MemSetBase<AnyMemIntrinsic> {
    970 public:
    971   static bool classof(const IntrinsicInst *I) {
    972     switch (I->getIntrinsicID()) {
    973     case Intrinsic::memset:
    974     case Intrinsic::memset_element_unordered_atomic:
    975       return true;
    976     default:
    977       return false;
    978     }
    979   }
    980   static bool classof(const Value *V) {
    981     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    982   }
    983 };
    984 
    985 // This class wraps any memcpy/memmove intrinsics
    986 // i.e. llvm.element.unordered.atomic.memcpy/memmove
    987 // and  llvm.memcpy/memmove
    988 class AnyMemTransferInst : public MemTransferBase<AnyMemIntrinsic> {
    989 public:
    990   static bool classof(const IntrinsicInst *I) {
    991     switch (I->getIntrinsicID()) {
    992     case Intrinsic::memcpy:
    993     case Intrinsic::memcpy_inline:
    994     case Intrinsic::memmove:
    995     case Intrinsic::memcpy_element_unordered_atomic:
    996     case Intrinsic::memmove_element_unordered_atomic:
    997       return true;
    998     default:
    999       return false;
   1000     }
   1001   }
   1002   static bool classof(const Value *V) {
   1003     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1004   }
   1005 };
   1006 
   1007 /// This class represents any memcpy intrinsic
   1008 /// i.e. llvm.element.unordered.atomic.memcpy
   1009 ///  and llvm.memcpy
   1010 class AnyMemCpyInst : public AnyMemTransferInst {
   1011 public:
   1012   static bool classof(const IntrinsicInst *I) {
   1013     switch (I->getIntrinsicID()) {
   1014     case Intrinsic::memcpy:
   1015     case Intrinsic::memcpy_inline:
   1016     case Intrinsic::memcpy_element_unordered_atomic:
   1017       return true;
   1018     default:
   1019       return false;
   1020     }
   1021   }
   1022   static bool classof(const Value *V) {
   1023     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1024   }
   1025 };
   1026 
   1027 /// This class represents any memmove intrinsic
   1028 /// i.e. llvm.element.unordered.atomic.memmove
   1029 ///  and llvm.memmove
   1030 class AnyMemMoveInst : public AnyMemTransferInst {
   1031 public:
   1032   static bool classof(const IntrinsicInst *I) {
   1033     switch (I->getIntrinsicID()) {
   1034     case Intrinsic::memmove:
   1035     case Intrinsic::memmove_element_unordered_atomic:
   1036       return true;
   1037     default:
   1038       return false;
   1039     }
   1040   }
   1041   static bool classof(const Value *V) {
   1042     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1043   }
   1044 };
   1045 
   1046 /// This represents the llvm.va_start intrinsic.
   1047 class VAStartInst : public IntrinsicInst {
   1048 public:
   1049   static bool classof(const IntrinsicInst *I) {
   1050     return I->getIntrinsicID() == Intrinsic::vastart;
   1051   }
   1052   static bool classof(const Value *V) {
   1053     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1054   }
   1055 
   1056   Value *getArgList() const { return const_cast<Value *>(getArgOperand(0)); }
   1057 };
   1058 
   1059 /// This represents the llvm.va_end intrinsic.
   1060 class VAEndInst : public IntrinsicInst {
   1061 public:
   1062   static bool classof(const IntrinsicInst *I) {
   1063     return I->getIntrinsicID() == Intrinsic::vaend;
   1064   }
   1065   static bool classof(const Value *V) {
   1066     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1067   }
   1068 
   1069   Value *getArgList() const { return const_cast<Value *>(getArgOperand(0)); }
   1070 };
   1071 
   1072 /// This represents the llvm.va_copy intrinsic.
   1073 class VACopyInst : public IntrinsicInst {
   1074 public:
   1075   static bool classof(const IntrinsicInst *I) {
   1076     return I->getIntrinsicID() == Intrinsic::vacopy;
   1077   }
   1078   static bool classof(const Value *V) {
   1079     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1080   }
   1081 
   1082   Value *getDest() const { return const_cast<Value *>(getArgOperand(0)); }
   1083   Value *getSrc() const { return const_cast<Value *>(getArgOperand(1)); }
   1084 };
   1085 
   1086 /// This represents the llvm.instrprof_increment intrinsic.
   1087 class InstrProfIncrementInst : public IntrinsicInst {
   1088 public:
   1089   static bool classof(const IntrinsicInst *I) {
   1090     return I->getIntrinsicID() == Intrinsic::instrprof_increment;
   1091   }
   1092   static bool classof(const Value *V) {
   1093     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1094   }
   1095 
   1096   GlobalVariable *getName() const {
   1097     return cast<GlobalVariable>(
   1098         const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
   1099   }
   1100 
   1101   ConstantInt *getHash() const {
   1102     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
   1103   }
   1104 
   1105   ConstantInt *getNumCounters() const {
   1106     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
   1107   }
   1108 
   1109   ConstantInt *getIndex() const {
   1110     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
   1111   }
   1112 
   1113   Value *getStep() const;
   1114 };
   1115 
   1116 class InstrProfIncrementInstStep : public InstrProfIncrementInst {
   1117 public:
   1118   static bool classof(const IntrinsicInst *I) {
   1119     return I->getIntrinsicID() == Intrinsic::instrprof_increment_step;
   1120   }
   1121   static bool classof(const Value *V) {
   1122     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1123   }
   1124 };
   1125 
   1126 /// This represents the llvm.instrprof_value_profile intrinsic.
   1127 class InstrProfValueProfileInst : public IntrinsicInst {
   1128 public:
   1129   static bool classof(const IntrinsicInst *I) {
   1130     return I->getIntrinsicID() == Intrinsic::instrprof_value_profile;
   1131   }
   1132   static bool classof(const Value *V) {
   1133     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1134   }
   1135 
   1136   GlobalVariable *getName() const {
   1137     return cast<GlobalVariable>(
   1138         const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
   1139   }
   1140 
   1141   ConstantInt *getHash() const {
   1142     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
   1143   }
   1144 
   1145   Value *getTargetValue() const {
   1146     return cast<Value>(const_cast<Value *>(getArgOperand(2)));
   1147   }
   1148 
   1149   ConstantInt *getValueKind() const {
   1150     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
   1151   }
   1152 
   1153   // Returns the value site index.
   1154   ConstantInt *getIndex() const {
   1155     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(4)));
   1156   }
   1157 };
   1158 
   1159 class PseudoProbeInst : public IntrinsicInst {
   1160 public:
   1161   static bool classof(const IntrinsicInst *I) {
   1162     return I->getIntrinsicID() == Intrinsic::pseudoprobe;
   1163   }
   1164 
   1165   static bool classof(const Value *V) {
   1166     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1167   }
   1168 
   1169   ConstantInt *getFuncGuid() const {
   1170     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(0)));
   1171   }
   1172 
   1173   ConstantInt *getIndex() const {
   1174     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
   1175   }
   1176 
   1177   ConstantInt *getAttributes() const {
   1178     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
   1179   }
   1180 
   1181   ConstantInt *getFactor() const {
   1182     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
   1183   }
   1184 };
   1185 
   1186 class NoAliasScopeDeclInst : public IntrinsicInst {
   1187 public:
   1188   static bool classof(const IntrinsicInst *I) {
   1189     return I->getIntrinsicID() == Intrinsic::experimental_noalias_scope_decl;
   1190   }
   1191 
   1192   static bool classof(const Value *V) {
   1193     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1194   }
   1195 
   1196   MDNode *getScopeList() const {
   1197     auto *MV =
   1198         cast<MetadataAsValue>(getOperand(Intrinsic::NoAliasScopeDeclScopeArg));
   1199     return cast<MDNode>(MV->getMetadata());
   1200   }
   1201 
   1202   void setScopeList(MDNode *ScopeList) {
   1203     setOperand(Intrinsic::NoAliasScopeDeclScopeArg,
   1204                MetadataAsValue::get(getContext(), ScopeList));
   1205   }
   1206 };
   1207 
   1208 // Defined in Statepoint.h -- NOT a subclass of IntrinsicInst
   1209 class GCStatepointInst;
   1210 
   1211 /// Common base class for representing values projected from a statepoint.
   1212 /// Currently, the only projections available are gc.result and gc.relocate.
   1213 class GCProjectionInst : public IntrinsicInst {
   1214 public:
   1215   static bool classof(const IntrinsicInst *I) {
   1216     return I->getIntrinsicID() == Intrinsic::experimental_gc_relocate ||
   1217       I->getIntrinsicID() == Intrinsic::experimental_gc_result;
   1218   }
   1219 
   1220   static bool classof(const Value *V) {
   1221     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1222   }
   1223 
   1224   /// Return true if this relocate is tied to the invoke statepoint.
   1225   /// This includes relocates which are on the unwinding path.
   1226   bool isTiedToInvoke() const {
   1227     const Value *Token = getArgOperand(0);
   1228 
   1229     return isa<LandingPadInst>(Token) || isa<InvokeInst>(Token);
   1230   }
   1231 
   1232   /// The statepoint with which this gc.relocate is associated.
   1233   const GCStatepointInst *getStatepoint() const;
   1234 };
   1235 
   1236 /// Represents calls to the gc.relocate intrinsic.
   1237 class GCRelocateInst : public GCProjectionInst {
   1238 public:
   1239   static bool classof(const IntrinsicInst *I) {
   1240     return I->getIntrinsicID() == Intrinsic::experimental_gc_relocate;
   1241   }
   1242 
   1243   static bool classof(const Value *V) {
   1244     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1245   }
   1246 
   1247   /// The index into the associate statepoint's argument list
   1248   /// which contains the base pointer of the pointer whose
   1249   /// relocation this gc.relocate describes.
   1250   unsigned getBasePtrIndex() const {
   1251     return cast<ConstantInt>(getArgOperand(1))->getZExtValue();
   1252   }
   1253 
   1254   /// The index into the associate statepoint's argument list which
   1255   /// contains the pointer whose relocation this gc.relocate describes.
   1256   unsigned getDerivedPtrIndex() const {
   1257     return cast<ConstantInt>(getArgOperand(2))->getZExtValue();
   1258   }
   1259 
   1260   Value *getBasePtr() const;
   1261   Value *getDerivedPtr() const;
   1262 };
   1263 
   1264 /// Represents calls to the gc.result intrinsic.
   1265 class GCResultInst : public GCProjectionInst {
   1266 public:
   1267   static bool classof(const IntrinsicInst *I) {
   1268     return I->getIntrinsicID() == Intrinsic::experimental_gc_result;
   1269   }
   1270 
   1271   static bool classof(const Value *V) {
   1272     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1273   }
   1274 };
   1275 
   1276 
   1277 /// This represents the llvm.assume intrinsic.
   1278 class AssumeInst : public IntrinsicInst {
   1279 public:
   1280   static bool classof(const IntrinsicInst *I) {
   1281     return I->getIntrinsicID() == Intrinsic::assume;
   1282   }
   1283   static bool classof(const Value *V) {
   1284     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
   1285   }
   1286 };
   1287 
   1288 } // end namespace llvm
   1289 
   1290 #endif // LLVM_IR_INTRINSICINST_H
   1291