LCOV - code coverage report
Current view: top level - /usr/lib/llvm-19/include/llvm/IR - IntrinsicInst.h (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 88.9 % 18 16
Test Date: 2026-02-27 04:14:43 Functions: 100.0 % 6 6
Legend: Lines:     hit not hit

            Line data    Source code
       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/Value.h"
      35              : #include "llvm/Support/Casting.h"
      36              : #include "llvm/Support/MathExtras.h"
      37              : #include <cassert>
      38              : #include <cstdint>
      39              : #include <optional>
      40              : 
      41              : namespace llvm {
      42              : 
      43              : class Metadata;
      44              : 
      45              : /// A wrapper class for inspecting calls to intrinsic functions.
      46              : /// This allows the standard isa/dyncast/cast functionality to work with calls
      47              : /// to intrinsic functions.
      48              : class IntrinsicInst : public CallInst {
      49              : public:
      50              :   IntrinsicInst() = delete;
      51              :   IntrinsicInst(const IntrinsicInst &) = delete;
      52              :   IntrinsicInst &operator=(const IntrinsicInst &) = delete;
      53              : 
      54              :   /// Return the intrinsic ID of this intrinsic.
      55         6988 :   Intrinsic::ID getIntrinsicID() const {
      56         6988 :     return getCalledFunction()->getIntrinsicID();
      57              :   }
      58              : 
      59              :   bool isAssociative() const {
      60              :     switch (getIntrinsicID()) {
      61              :     case Intrinsic::smax:
      62              :     case Intrinsic::smin:
      63              :     case Intrinsic::umax:
      64              :     case Intrinsic::umin:
      65              :       return true;
      66              :     default:
      67              :       return false;
      68              :     }
      69              :   }
      70              : 
      71              :   /// Return true if swapping the first two arguments to the intrinsic produces
      72              :   /// the same result.
      73              :   bool isCommutative() const {
      74              :     switch (getIntrinsicID()) {
      75              :     case Intrinsic::maxnum:
      76              :     case Intrinsic::minnum:
      77              :     case Intrinsic::maximum:
      78              :     case Intrinsic::minimum:
      79              :     case Intrinsic::smax:
      80              :     case Intrinsic::smin:
      81              :     case Intrinsic::umax:
      82              :     case Intrinsic::umin:
      83              :     case Intrinsic::sadd_sat:
      84              :     case Intrinsic::uadd_sat:
      85              :     case Intrinsic::sadd_with_overflow:
      86              :     case Intrinsic::uadd_with_overflow:
      87              :     case Intrinsic::smul_with_overflow:
      88              :     case Intrinsic::umul_with_overflow:
      89              :     case Intrinsic::smul_fix:
      90              :     case Intrinsic::umul_fix:
      91              :     case Intrinsic::smul_fix_sat:
      92              :     case Intrinsic::umul_fix_sat:
      93              :     case Intrinsic::fma:
      94              :     case Intrinsic::fmuladd:
      95              :       return true;
      96              :     default:
      97              :       return false;
      98              :     }
      99              :   }
     100              : 
     101              :   /// Checks if the intrinsic is an annotation.
     102              :   bool isAssumeLikeIntrinsic() const {
     103              :     switch (getIntrinsicID()) {
     104              :     default: break;
     105              :     case Intrinsic::assume:
     106              :     case Intrinsic::sideeffect:
     107              :     case Intrinsic::pseudoprobe:
     108              :     case Intrinsic::dbg_assign:
     109              :     case Intrinsic::dbg_declare:
     110              :     case Intrinsic::dbg_value:
     111              :     case Intrinsic::dbg_label:
     112              :     case Intrinsic::invariant_start:
     113              :     case Intrinsic::invariant_end:
     114              :     case Intrinsic::lifetime_start:
     115              :     case Intrinsic::lifetime_end:
     116              :     case Intrinsic::experimental_noalias_scope_decl:
     117              :     case Intrinsic::objectsize:
     118              :     case Intrinsic::ptr_annotation:
     119              :     case Intrinsic::var_annotation:
     120              :       return true;
     121              :     }
     122              :     return false;
     123              :   }
     124              : 
     125              :   /// Check if the intrinsic might lower into a regular function call in the
     126              :   /// course of IR transformations
     127              :   static bool mayLowerToFunctionCall(Intrinsic::ID IID);
     128              : 
     129              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
     130        54009 :   static bool classof(const CallInst *I) {
     131        54009 :     if (const Function *CF = I->getCalledFunction())
     132        53716 :       return CF->isIntrinsic();
     133          293 :     return false;
     134              :   }
     135       291145 :   static bool classof(const Value *V) {
     136       291145 :     return isa<CallInst>(V) && classof(cast<CallInst>(V));
     137              :   }
     138              : };
     139              : 
     140              : /// Check if \p ID corresponds to a lifetime intrinsic.
     141              : static inline bool isLifetimeIntrinsic(Intrinsic::ID ID) {
     142              :   switch (ID) {
     143              :   case Intrinsic::lifetime_start:
     144              :   case Intrinsic::lifetime_end:
     145              :     return true;
     146              :   default:
     147              :     return false;
     148              :   }
     149              : }
     150              : 
     151              : /// This is the common base class for lifetime intrinsics.
     152              : class LifetimeIntrinsic : public IntrinsicInst {
     153              : public:
     154              :   /// \name Casting methods
     155              :   /// @{
     156              :   static bool classof(const IntrinsicInst *I) {
     157              :     return isLifetimeIntrinsic(I->getIntrinsicID());
     158              :   }
     159              :   static bool classof(const Value *V) {
     160              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     161              :   }
     162              :   /// @}
     163              : };
     164              : 
     165              : /// Check if \p ID corresponds to a debug info intrinsic.
     166         6988 : static inline bool isDbgInfoIntrinsic(Intrinsic::ID ID) {
     167         6988 :   switch (ID) {
     168            0 :   case Intrinsic::dbg_declare:
     169              :   case Intrinsic::dbg_value:
     170              :   case Intrinsic::dbg_label:
     171              :   case Intrinsic::dbg_assign:
     172            0 :     return true;
     173         6988 :   default:
     174         6988 :     return false;
     175              :   }
     176              : }
     177              : 
     178              : /// This is the common base class for debug info intrinsics.
     179              : class DbgInfoIntrinsic : public IntrinsicInst {
     180              : public:
     181              :   /// \name Casting methods
     182              :   /// @{
     183         6988 :   static bool classof(const IntrinsicInst *I) {
     184         6988 :     return isDbgInfoIntrinsic(I->getIntrinsicID());
     185              :   }
     186       284157 :   static bool classof(const Value *V) {
     187       284157 :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     188              :   }
     189              :   /// @}
     190              : };
     191              : 
     192              : // Iterator for ValueAsMetadata that internally uses direct pointer iteration
     193              : // over either a ValueAsMetadata* or a ValueAsMetadata**, dereferencing to the
     194              : // ValueAsMetadata .
     195              : class location_op_iterator
     196              :     : public iterator_facade_base<location_op_iterator,
     197              :                                   std::bidirectional_iterator_tag, Value *> {
     198              :   PointerUnion<ValueAsMetadata *, ValueAsMetadata **> I;
     199              : 
     200              : public:
     201              :   location_op_iterator(ValueAsMetadata *SingleIter) : I(SingleIter) {}
     202              :   location_op_iterator(ValueAsMetadata **MultiIter) : I(MultiIter) {}
     203              : 
     204              :   location_op_iterator(const location_op_iterator &R) : I(R.I) {}
     205              :   location_op_iterator &operator=(const location_op_iterator &R) {
     206              :     I = R.I;
     207              :     return *this;
     208              :   }
     209              :   bool operator==(const location_op_iterator &RHS) const { return I == RHS.I; }
     210              :   const Value *operator*() const {
     211              :     ValueAsMetadata *VAM = isa<ValueAsMetadata *>(I)
     212              :                                ? cast<ValueAsMetadata *>(I)
     213              :                                : *cast<ValueAsMetadata **>(I);
     214              :     return VAM->getValue();
     215              :   };
     216              :   Value *operator*() {
     217              :     ValueAsMetadata *VAM = isa<ValueAsMetadata *>(I)
     218              :                                ? cast<ValueAsMetadata *>(I)
     219              :                                : *cast<ValueAsMetadata **>(I);
     220              :     return VAM->getValue();
     221              :   }
     222              :   location_op_iterator &operator++() {
     223              :     if (isa<ValueAsMetadata *>(I))
     224              :       I = cast<ValueAsMetadata *>(I) + 1;
     225              :     else
     226              :       I = cast<ValueAsMetadata **>(I) + 1;
     227              :     return *this;
     228              :   }
     229              :   location_op_iterator &operator--() {
     230              :     if (isa<ValueAsMetadata *>(I))
     231              :       I = cast<ValueAsMetadata *>(I) - 1;
     232              :     else
     233              :       I = cast<ValueAsMetadata **>(I) - 1;
     234              :     return *this;
     235              :   }
     236              : };
     237              : 
     238              : /// Lightweight class that wraps the location operand metadata of a debug
     239              : /// intrinsic. The raw location may be a ValueAsMetadata, an empty MDTuple,
     240              : /// or a DIArgList.
     241              : class RawLocationWrapper {
     242              :   Metadata *RawLocation = nullptr;
     243              : 
     244              : public:
     245              :   RawLocationWrapper() = default;
     246              :   explicit RawLocationWrapper(Metadata *RawLocation)
     247              :       : RawLocation(RawLocation) {
     248              :     // Allow ValueAsMetadata, empty MDTuple, DIArgList.
     249              :     assert(RawLocation && "unexpected null RawLocation");
     250              :     assert(isa<ValueAsMetadata>(RawLocation) || isa<DIArgList>(RawLocation) ||
     251              :            (isa<MDNode>(RawLocation) &&
     252              :             !cast<MDNode>(RawLocation)->getNumOperands()));
     253              :   }
     254              :   Metadata *getRawLocation() const { return RawLocation; }
     255              :   /// Get the locations corresponding to the variable referenced by the debug
     256              :   /// info intrinsic.  Depending on the intrinsic, this could be the
     257              :   /// variable's value or its address.
     258              :   iterator_range<location_op_iterator> location_ops() const;
     259              :   Value *getVariableLocationOp(unsigned OpIdx) const;
     260              :   unsigned getNumVariableLocationOps() const {
     261              :     if (hasArgList())
     262              :       return cast<DIArgList>(getRawLocation())->getArgs().size();
     263              :     return 1;
     264              :   }
     265              :   bool hasArgList() const { return isa<DIArgList>(getRawLocation()); }
     266              :   bool isKillLocation(const DIExpression *Expression) const {
     267              :     // Check for "kill" sentinel values.
     268              :     // Non-variadic: empty metadata.
     269              :     if (!hasArgList() && isa<MDNode>(getRawLocation()))
     270              :       return true;
     271              :     // Variadic: empty DIArgList with empty expression.
     272              :     if (getNumVariableLocationOps() == 0 && !Expression->isComplex())
     273              :       return true;
     274              :     // Variadic and non-variadic: Interpret expressions using undef or poison
     275              :     // values as kills.
     276              :     return any_of(location_ops(), [](Value *V) { return isa<UndefValue>(V); });
     277              :   }
     278              : 
     279              :   friend bool operator==(const RawLocationWrapper &A,
     280              :                          const RawLocationWrapper &B) {
     281              :     return A.RawLocation == B.RawLocation;
     282              :   }
     283              :   friend bool operator!=(const RawLocationWrapper &A,
     284              :                          const RawLocationWrapper &B) {
     285              :     return !(A == B);
     286              :   }
     287              :   friend bool operator>(const RawLocationWrapper &A,
     288              :                         const RawLocationWrapper &B) {
     289              :     return A.RawLocation > B.RawLocation;
     290              :   }
     291              :   friend bool operator>=(const RawLocationWrapper &A,
     292              :                          const RawLocationWrapper &B) {
     293              :     return A.RawLocation >= B.RawLocation;
     294              :   }
     295              :   friend bool operator<(const RawLocationWrapper &A,
     296              :                         const RawLocationWrapper &B) {
     297              :     return A.RawLocation < B.RawLocation;
     298              :   }
     299              :   friend bool operator<=(const RawLocationWrapper &A,
     300              :                          const RawLocationWrapper &B) {
     301              :     return A.RawLocation <= B.RawLocation;
     302              :   }
     303              : };
     304              : 
     305              : /// This is the common base class for debug info intrinsics for variables.
     306              : class DbgVariableIntrinsic : public DbgInfoIntrinsic {
     307              : public:
     308              :   /// Get the locations corresponding to the variable referenced by the debug
     309              :   /// info intrinsic.  Depending on the intrinsic, this could be the
     310              :   /// variable's value or its address.
     311              :   iterator_range<location_op_iterator> location_ops() const;
     312              : 
     313              :   Value *getVariableLocationOp(unsigned OpIdx) const;
     314              : 
     315              :   void replaceVariableLocationOp(Value *OldValue, Value *NewValue,
     316              :                                  bool AllowEmpty = false);
     317              :   void replaceVariableLocationOp(unsigned OpIdx, Value *NewValue);
     318              :   /// Adding a new location operand will always result in this intrinsic using
     319              :   /// an ArgList, and must always be accompanied by a new expression that uses
     320              :   /// the new operand.
     321              :   void addVariableLocationOps(ArrayRef<Value *> NewValues,
     322              :                               DIExpression *NewExpr);
     323              : 
     324              :   void setVariable(DILocalVariable *NewVar) {
     325              :     setArgOperand(1, MetadataAsValue::get(NewVar->getContext(), NewVar));
     326              :   }
     327              : 
     328              :   void setExpression(DIExpression *NewExpr) {
     329              :     setArgOperand(2, MetadataAsValue::get(NewExpr->getContext(), NewExpr));
     330              :   }
     331              : 
     332              :   unsigned getNumVariableLocationOps() const {
     333              :     return getWrappedLocation().getNumVariableLocationOps();
     334              :   }
     335              : 
     336              :   bool hasArgList() const { return getWrappedLocation().hasArgList(); }
     337              : 
     338              :   /// Does this describe the address of a local variable. True for dbg.declare,
     339              :   /// but not dbg.value, which describes its value, or dbg.assign, which
     340              :   /// describes a combination of the variable's value and address.
     341              :   bool isAddressOfVariable() const {
     342              :     return getIntrinsicID() == Intrinsic::dbg_declare;
     343              :   }
     344              : 
     345              :   void setKillLocation() {
     346              :     // TODO: When/if we remove duplicate values from DIArgLists, we don't need
     347              :     // this set anymore.
     348              :     SmallPtrSet<Value *, 4> RemovedValues;
     349              :     for (Value *OldValue : location_ops()) {
     350              :       if (!RemovedValues.insert(OldValue).second)
     351              :         continue;
     352              :       Value *Poison = PoisonValue::get(OldValue->getType());
     353              :       replaceVariableLocationOp(OldValue, Poison);
     354              :     }
     355              :   }
     356              : 
     357              :   bool isKillLocation() const {
     358              :     return getWrappedLocation().isKillLocation(getExpression());
     359              :   }
     360              : 
     361              :   DILocalVariable *getVariable() const {
     362              :     return cast<DILocalVariable>(getRawVariable());
     363              :   }
     364              : 
     365              :   DIExpression *getExpression() const {
     366              :     return cast<DIExpression>(getRawExpression());
     367              :   }
     368              : 
     369              :   Metadata *getRawLocation() const {
     370              :     return cast<MetadataAsValue>(getArgOperand(0))->getMetadata();
     371              :   }
     372              : 
     373              :   RawLocationWrapper getWrappedLocation() const {
     374              :     return RawLocationWrapper(getRawLocation());
     375              :   }
     376              : 
     377              :   Metadata *getRawVariable() const {
     378              :     return cast<MetadataAsValue>(getArgOperand(1))->getMetadata();
     379              :   }
     380              : 
     381              :   Metadata *getRawExpression() const {
     382              :     return cast<MetadataAsValue>(getArgOperand(2))->getMetadata();
     383              :   }
     384              : 
     385              :   /// Use of this should generally be avoided; instead,
     386              :   /// replaceVariableLocationOp and addVariableLocationOps should be used where
     387              :   /// possible to avoid creating invalid state.
     388              :   void setRawLocation(Metadata *Location) {
     389              :     return setArgOperand(0, MetadataAsValue::get(getContext(), Location));
     390              :   }
     391              : 
     392              :   /// Get the size (in bits) of the variable, or fragment of the variable that
     393              :   /// is described.
     394              :   std::optional<uint64_t> getFragmentSizeInBits() const;
     395              : 
     396              :   /// Get the FragmentInfo for the variable.
     397              :   std::optional<DIExpression::FragmentInfo> getFragment() const {
     398              :     return getExpression()->getFragmentInfo();
     399              :   }
     400              : 
     401              :   /// Get the FragmentInfo for the variable if it exists, otherwise return a
     402              :   /// FragmentInfo that covers the entire variable if the variable size is
     403              :   /// known, otherwise return a zero-sized fragment.
     404              :   DIExpression::FragmentInfo getFragmentOrEntireVariable() const {
     405              :     DIExpression::FragmentInfo VariableSlice(0, 0);
     406              :     // Get the fragment or variable size, or zero.
     407              :     if (auto Sz = getFragmentSizeInBits())
     408              :       VariableSlice.SizeInBits = *Sz;
     409              :     if (auto Frag = getExpression()->getFragmentInfo())
     410              :       VariableSlice.OffsetInBits = Frag->OffsetInBits;
     411              :     return VariableSlice;
     412              :   }
     413              : 
     414              :   /// \name Casting methods
     415              :   /// @{
     416              :   static bool classof(const IntrinsicInst *I) {
     417              :     switch (I->getIntrinsicID()) {
     418              :     case Intrinsic::dbg_declare:
     419              :     case Intrinsic::dbg_value:
     420              :     case Intrinsic::dbg_assign:
     421              :       return true;
     422              :     default:
     423              :       return false;
     424              :     }
     425              :   }
     426              :   static bool classof(const Value *V) {
     427              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     428              :   }
     429              :   /// @}
     430              : protected:
     431              :   void setArgOperand(unsigned i, Value *v) {
     432              :     DbgInfoIntrinsic::setArgOperand(i, v);
     433              :   }
     434              :   void setOperand(unsigned i, Value *v) { DbgInfoIntrinsic::setOperand(i, v); }
     435              : };
     436              : 
     437              : /// This represents the llvm.dbg.declare instruction.
     438              : class DbgDeclareInst : public DbgVariableIntrinsic {
     439              : public:
     440              :   Value *getAddress() const {
     441              :     assert(getNumVariableLocationOps() == 1 &&
     442              :            "dbg.declare must have exactly 1 location operand.");
     443              :     return getVariableLocationOp(0);
     444              :   }
     445              : 
     446              :   /// \name Casting methods
     447              :   /// @{
     448              :   static bool classof(const IntrinsicInst *I) {
     449              :     return I->getIntrinsicID() == Intrinsic::dbg_declare;
     450              :   }
     451              :   static bool classof(const Value *V) {
     452              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     453              :   }
     454              :   /// @}
     455              : };
     456              : 
     457              : /// This represents the llvm.dbg.value instruction.
     458              : class DbgValueInst : public DbgVariableIntrinsic {
     459              : public:
     460              :   // The default argument should only be used in ISel, and the default option
     461              :   // should be removed once ISel support for multiple location ops is complete.
     462              :   Value *getValue(unsigned OpIdx = 0) const {
     463              :     return getVariableLocationOp(OpIdx);
     464              :   }
     465              :   iterator_range<location_op_iterator> getValues() const {
     466              :     return location_ops();
     467              :   }
     468              : 
     469              :   /// \name Casting methods
     470              :   /// @{
     471              :   static bool classof(const IntrinsicInst *I) {
     472              :     return I->getIntrinsicID() == Intrinsic::dbg_value ||
     473              :            I->getIntrinsicID() == Intrinsic::dbg_assign;
     474              :   }
     475              :   static bool classof(const Value *V) {
     476              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     477              :   }
     478              :   /// @}
     479              : };
     480              : 
     481              : /// This represents the llvm.dbg.assign instruction.
     482              : class DbgAssignIntrinsic : public DbgValueInst {
     483              :   enum Operands {
     484              :     OpValue,
     485              :     OpVar,
     486              :     OpExpr,
     487              :     OpAssignID,
     488              :     OpAddress,
     489              :     OpAddressExpr,
     490              :   };
     491              : 
     492              : public:
     493              :   Value *getAddress() const;
     494              :   Metadata *getRawAddress() const {
     495              :     return cast<MetadataAsValue>(getArgOperand(OpAddress))->getMetadata();
     496              :   }
     497              :   Metadata *getRawAssignID() const {
     498              :     return cast<MetadataAsValue>(getArgOperand(OpAssignID))->getMetadata();
     499              :   }
     500              :   DIAssignID *getAssignID() const { return cast<DIAssignID>(getRawAssignID()); }
     501              :   Metadata *getRawAddressExpression() const {
     502              :     return cast<MetadataAsValue>(getArgOperand(OpAddressExpr))->getMetadata();
     503              :   }
     504              :   DIExpression *getAddressExpression() const {
     505              :     return cast<DIExpression>(getRawAddressExpression());
     506              :   }
     507              :   void setAddressExpression(DIExpression *NewExpr) {
     508              :     setArgOperand(OpAddressExpr,
     509              :                   MetadataAsValue::get(NewExpr->getContext(), NewExpr));
     510              :   }
     511              :   void setAssignId(DIAssignID *New);
     512              :   void setAddress(Value *V);
     513              :   /// Kill the address component.
     514              :   void setKillAddress();
     515              :   /// Check whether this kills the address component. This doesn't take into
     516              :   /// account the position of the intrinsic, therefore a returned value of false
     517              :   /// does not guarentee the address is a valid location for the variable at the
     518              :   /// intrinsic's position in IR.
     519              :   bool isKillAddress() const;
     520              :   void setValue(Value *V);
     521              :   /// \name Casting methods
     522              :   /// @{
     523              :   static bool classof(const IntrinsicInst *I) {
     524              :     return I->getIntrinsicID() == Intrinsic::dbg_assign;
     525              :   }
     526              :   static bool classof(const Value *V) {
     527              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     528              :   }
     529              :   /// @}
     530              : };
     531              : 
     532              : /// This represents the llvm.dbg.label instruction.
     533              : class DbgLabelInst : public DbgInfoIntrinsic {
     534              : public:
     535              :   DILabel *getLabel() const { return cast<DILabel>(getRawLabel()); }
     536              :   void setLabel(DILabel *NewLabel) {
     537              :     setArgOperand(0, MetadataAsValue::get(getContext(), NewLabel));
     538              :   }
     539              : 
     540              :   Metadata *getRawLabel() const {
     541              :     return cast<MetadataAsValue>(getArgOperand(0))->getMetadata();
     542              :   }
     543              : 
     544              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
     545              :   /// @{
     546              :   static bool classof(const IntrinsicInst *I) {
     547              :     return I->getIntrinsicID() == Intrinsic::dbg_label;
     548              :   }
     549              :   static bool classof(const Value *V) {
     550              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     551              :   }
     552              :   /// @}
     553              : };
     554              : 
     555              : /// This is the common base class for vector predication intrinsics.
     556              : class VPIntrinsic : public IntrinsicInst {
     557              : public:
     558              :   /// \brief Declares a llvm.vp.* intrinsic in \p M that matches the parameters
     559              :   /// \p Params. Additionally, the load and gather intrinsics require
     560              :   /// \p ReturnType to be specified.
     561              :   static Function *getDeclarationForParams(Module *M, Intrinsic::ID,
     562              :                                            Type *ReturnType,
     563              :                                            ArrayRef<Value *> Params);
     564              : 
     565              :   static std::optional<unsigned> getMaskParamPos(Intrinsic::ID IntrinsicID);
     566              :   static std::optional<unsigned> getVectorLengthParamPos(
     567              :       Intrinsic::ID IntrinsicID);
     568              : 
     569              :   /// The llvm.vp.* intrinsics for this instruction Opcode
     570              :   static Intrinsic::ID getForOpcode(unsigned OC);
     571              : 
     572              :   /// The llvm.vp.* intrinsics for this intrinsic ID \p Id. Return \p Id if it
     573              :   /// is already a VP intrinsic.
     574              :   static Intrinsic::ID getForIntrinsic(Intrinsic::ID Id);
     575              : 
     576              :   // Whether \p ID is a VP intrinsic ID.
     577              :   static bool isVPIntrinsic(Intrinsic::ID);
     578              : 
     579              :   /// \return The mask parameter or nullptr.
     580              :   Value *getMaskParam() const;
     581              :   void setMaskParam(Value *);
     582              : 
     583              :   /// \return The vector length parameter or nullptr.
     584              :   Value *getVectorLengthParam() const;
     585              :   void setVectorLengthParam(Value *);
     586              : 
     587              :   /// \return Whether the vector length param can be ignored.
     588              :   bool canIgnoreVectorLengthParam() const;
     589              : 
     590              :   /// \return The static element count (vector number of elements) the vector
     591              :   /// length parameter applies to.
     592              :   ElementCount getStaticVectorLength() const;
     593              : 
     594              :   /// \return The alignment of the pointer used by this load/store/gather or
     595              :   /// scatter.
     596              :   MaybeAlign getPointerAlignment() const;
     597              :   // MaybeAlign setPointerAlignment(Align NewAlign); // TODO
     598              : 
     599              :   /// \return The pointer operand of this load,store, gather or scatter.
     600              :   Value *getMemoryPointerParam() const;
     601              :   static std::optional<unsigned> getMemoryPointerParamPos(Intrinsic::ID);
     602              : 
     603              :   /// \return The data (payload) operand of this store or scatter.
     604              :   Value *getMemoryDataParam() const;
     605              :   static std::optional<unsigned> getMemoryDataParamPos(Intrinsic::ID);
     606              : 
     607              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
     608              :   static bool classof(const IntrinsicInst *I) {
     609              :     return isVPIntrinsic(I->getIntrinsicID());
     610              :   }
     611              :   static bool classof(const Value *V) {
     612              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     613              :   }
     614              : 
     615              :   // Equivalent non-predicated opcode
     616              :   std::optional<unsigned> getFunctionalOpcode() const {
     617              :     return getFunctionalOpcodeForVP(getIntrinsicID());
     618              :   }
     619              : 
     620              :   // Equivalent non-predicated intrinsic ID
     621              :   std::optional<unsigned> getFunctionalIntrinsicID() const {
     622              :     return getFunctionalIntrinsicIDForVP(getIntrinsicID());
     623              :   }
     624              : 
     625              :   // Equivalent non-predicated constrained ID
     626              :   std::optional<unsigned> getConstrainedIntrinsicID() const {
     627              :     return getConstrainedIntrinsicIDForVP(getIntrinsicID());
     628              :   }
     629              : 
     630              :   // Equivalent non-predicated opcode
     631              :   static std::optional<unsigned> getFunctionalOpcodeForVP(Intrinsic::ID ID);
     632              : 
     633              :   // Equivalent non-predicated intrinsic ID
     634              :   static std::optional<Intrinsic::ID>
     635              :   getFunctionalIntrinsicIDForVP(Intrinsic::ID ID);
     636              : 
     637              :   // Equivalent non-predicated constrained ID
     638              :   static std::optional<Intrinsic::ID>
     639              :   getConstrainedIntrinsicIDForVP(Intrinsic::ID ID);
     640              : };
     641              : 
     642              : /// This represents vector predication reduction intrinsics.
     643              : class VPReductionIntrinsic : public VPIntrinsic {
     644              : public:
     645              :   static bool isVPReduction(Intrinsic::ID ID);
     646              : 
     647              :   unsigned getStartParamPos() const;
     648              :   unsigned getVectorParamPos() const;
     649              : 
     650              :   static std::optional<unsigned> getStartParamPos(Intrinsic::ID ID);
     651              :   static std::optional<unsigned> getVectorParamPos(Intrinsic::ID ID);
     652              : 
     653              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
     654              :   /// @{
     655              :   static bool classof(const IntrinsicInst *I) {
     656              :     return VPReductionIntrinsic::isVPReduction(I->getIntrinsicID());
     657              :   }
     658              :   static bool classof(const Value *V) {
     659              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     660              :   }
     661              :   /// @}
     662              : };
     663              : 
     664              : class VPCastIntrinsic : public VPIntrinsic {
     665              : public:
     666              :   static bool isVPCast(Intrinsic::ID ID);
     667              : 
     668              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
     669              :   /// @{
     670              :   static bool classof(const IntrinsicInst *I) {
     671              :     return VPCastIntrinsic::isVPCast(I->getIntrinsicID());
     672              :   }
     673              :   static bool classof(const Value *V) {
     674              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     675              :   }
     676              :   /// @}
     677              : };
     678              : 
     679              : class VPCmpIntrinsic : public VPIntrinsic {
     680              : public:
     681              :   static bool isVPCmp(Intrinsic::ID ID);
     682              : 
     683              :   CmpInst::Predicate getPredicate() const;
     684              : 
     685              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
     686              :   /// @{
     687              :   static bool classof(const IntrinsicInst *I) {
     688              :     return VPCmpIntrinsic::isVPCmp(I->getIntrinsicID());
     689              :   }
     690              :   static bool classof(const Value *V) {
     691              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     692              :   }
     693              :   /// @}
     694              : };
     695              : 
     696              : class VPBinOpIntrinsic : public VPIntrinsic {
     697              : public:
     698              :   static bool isVPBinOp(Intrinsic::ID ID);
     699              : 
     700              :   /// Methods for support type inquiry through isa, cast, and dyn_cast:
     701              :   /// @{
     702              :   static bool classof(const IntrinsicInst *I) {
     703              :     return VPBinOpIntrinsic::isVPBinOp(I->getIntrinsicID());
     704              :   }
     705              :   static bool classof(const Value *V) {
     706              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     707              :   }
     708              :   /// @}
     709              : };
     710              : 
     711              : 
     712              : /// This is the common base class for constrained floating point intrinsics.
     713              : class ConstrainedFPIntrinsic : public IntrinsicInst {
     714              : public:
     715              :   unsigned getNonMetadataArgCount() const;
     716              :   std::optional<RoundingMode> getRoundingMode() const;
     717              :   std::optional<fp::ExceptionBehavior> getExceptionBehavior() const;
     718              :   bool isDefaultFPEnvironment() const;
     719              : 
     720              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
     721              :   static bool classof(const IntrinsicInst *I);
     722              :   static bool classof(const Value *V) {
     723              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     724              :   }
     725              : };
     726              : 
     727              : /// Constrained floating point compare intrinsics.
     728              : class ConstrainedFPCmpIntrinsic : public ConstrainedFPIntrinsic {
     729              : public:
     730              :   FCmpInst::Predicate getPredicate() const;
     731              :   bool isSignaling() const {
     732              :     return getIntrinsicID() == Intrinsic::experimental_constrained_fcmps;
     733              :   }
     734              : 
     735              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
     736              :   static bool classof(const IntrinsicInst *I) {
     737              :     switch (I->getIntrinsicID()) {
     738              :     case Intrinsic::experimental_constrained_fcmp:
     739              :     case Intrinsic::experimental_constrained_fcmps:
     740              :       return true;
     741              :     default:
     742              :       return false;
     743              :     }
     744              :   }
     745              :   static bool classof(const Value *V) {
     746              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     747              :   }
     748              : };
     749              : 
     750              : /// This class represents min/max intrinsics.
     751              : class MinMaxIntrinsic : public IntrinsicInst {
     752              : public:
     753              :   static bool classof(const IntrinsicInst *I) {
     754              :     switch (I->getIntrinsicID()) {
     755              :     case Intrinsic::umin:
     756              :     case Intrinsic::umax:
     757              :     case Intrinsic::smin:
     758              :     case Intrinsic::smax:
     759              :       return true;
     760              :     default:
     761              :       return false;
     762              :     }
     763              :   }
     764              :   static bool classof(const Value *V) {
     765              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     766              :   }
     767              : 
     768              :   Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
     769              :   Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
     770              : 
     771              :   /// Returns the comparison predicate underlying the intrinsic.
     772              :   static ICmpInst::Predicate getPredicate(Intrinsic::ID ID) {
     773              :     switch (ID) {
     774              :     case Intrinsic::umin:
     775              :       return ICmpInst::Predicate::ICMP_ULT;
     776              :     case Intrinsic::umax:
     777              :       return ICmpInst::Predicate::ICMP_UGT;
     778              :     case Intrinsic::smin:
     779              :       return ICmpInst::Predicate::ICMP_SLT;
     780              :     case Intrinsic::smax:
     781              :       return ICmpInst::Predicate::ICMP_SGT;
     782              :     default:
     783              :       llvm_unreachable("Invalid intrinsic");
     784              :     }
     785              :   }
     786              : 
     787              :   /// Returns the comparison predicate underlying the intrinsic.
     788              :   ICmpInst::Predicate getPredicate() const {
     789              :     return getPredicate(getIntrinsicID());
     790              :   }
     791              : 
     792              :   /// Whether the intrinsic is signed or unsigned.
     793              :   static bool isSigned(Intrinsic::ID ID) {
     794              :     return ICmpInst::isSigned(getPredicate(ID));
     795              :   };
     796              : 
     797              :   /// Whether the intrinsic is signed or unsigned.
     798              :   bool isSigned() const { return isSigned(getIntrinsicID()); };
     799              : 
     800              :   /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
     801              :   /// so there is a certain threshold value, upon reaching which,
     802              :   /// their value can no longer change. Return said threshold.
     803              :   static APInt getSaturationPoint(Intrinsic::ID ID, unsigned numBits) {
     804              :     switch (ID) {
     805              :     case Intrinsic::umin:
     806              :       return APInt::getMinValue(numBits);
     807              :     case Intrinsic::umax:
     808              :       return APInt::getMaxValue(numBits);
     809              :     case Intrinsic::smin:
     810              :       return APInt::getSignedMinValue(numBits);
     811              :     case Intrinsic::smax:
     812              :       return APInt::getSignedMaxValue(numBits);
     813              :     default:
     814              :       llvm_unreachable("Invalid intrinsic");
     815              :     }
     816              :   }
     817              : 
     818              :   /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
     819              :   /// so there is a certain threshold value, upon reaching which,
     820              :   /// their value can no longer change. Return said threshold.
     821              :   APInt getSaturationPoint(unsigned numBits) const {
     822              :     return getSaturationPoint(getIntrinsicID(), numBits);
     823              :   }
     824              : 
     825              :   /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
     826              :   /// so there is a certain threshold value, upon reaching which,
     827              :   /// their value can no longer change. Return said threshold.
     828              :   static Constant *getSaturationPoint(Intrinsic::ID ID, Type *Ty) {
     829              :     return Constant::getIntegerValue(
     830              :         Ty, getSaturationPoint(ID, Ty->getScalarSizeInBits()));
     831              :   }
     832              : 
     833              :   /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
     834              :   /// so there is a certain threshold value, upon reaching which,
     835              :   /// their value can no longer change. Return said threshold.
     836              :   Constant *getSaturationPoint(Type *Ty) const {
     837              :     return getSaturationPoint(getIntrinsicID(), Ty);
     838              :   }
     839              : };
     840              : 
     841              : /// This class represents a ucmp/scmp intrinsic
     842              : class CmpIntrinsic : public IntrinsicInst {
     843              : public:
     844              :   static bool classof(const IntrinsicInst *I) {
     845              :     switch (I->getIntrinsicID()) {
     846              :     case Intrinsic::scmp:
     847              :     case Intrinsic::ucmp:
     848              :       return true;
     849              :     default:
     850              :       return false;
     851              :     }
     852              :   }
     853              :   static bool classof(const Value *V) {
     854              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     855              :   }
     856              : 
     857              :   Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
     858              :   Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
     859              : 
     860              :   static bool isSigned(Intrinsic::ID ID) { return ID == Intrinsic::scmp; }
     861              :   bool isSigned() const { return isSigned(getIntrinsicID()); }
     862              : 
     863              :   static CmpInst::Predicate getGTPredicate(Intrinsic::ID ID) {
     864              :     return isSigned(ID) ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
     865              :   }
     866              :   CmpInst::Predicate getGTPredicate() const {
     867              :     return getGTPredicate(getIntrinsicID());
     868              :   }
     869              : 
     870              :   static CmpInst::Predicate getLTPredicate(Intrinsic::ID ID) {
     871              :     return isSigned(ID) ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
     872              :   }
     873              :   CmpInst::Predicate getLTPredicate() const {
     874              :     return getLTPredicate(getIntrinsicID());
     875              :   }
     876              : };
     877              : 
     878              : /// This class represents an intrinsic that is based on a binary operation.
     879              : /// This includes op.with.overflow and saturating add/sub intrinsics.
     880              : class BinaryOpIntrinsic : public IntrinsicInst {
     881              : public:
     882              :   static bool classof(const IntrinsicInst *I) {
     883              :     switch (I->getIntrinsicID()) {
     884              :     case Intrinsic::uadd_with_overflow:
     885              :     case Intrinsic::sadd_with_overflow:
     886              :     case Intrinsic::usub_with_overflow:
     887              :     case Intrinsic::ssub_with_overflow:
     888              :     case Intrinsic::umul_with_overflow:
     889              :     case Intrinsic::smul_with_overflow:
     890              :     case Intrinsic::uadd_sat:
     891              :     case Intrinsic::sadd_sat:
     892              :     case Intrinsic::usub_sat:
     893              :     case Intrinsic::ssub_sat:
     894              :       return true;
     895              :     default:
     896              :       return false;
     897              :     }
     898              :   }
     899              :   static bool classof(const Value *V) {
     900              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     901              :   }
     902              : 
     903              :   Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
     904              :   Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
     905              : 
     906              :   /// Returns the binary operation underlying the intrinsic.
     907              :   Instruction::BinaryOps getBinaryOp() const;
     908              : 
     909              :   /// Whether the intrinsic is signed or unsigned.
     910              :   bool isSigned() const;
     911              : 
     912              :   /// Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
     913              :   unsigned getNoWrapKind() const;
     914              : };
     915              : 
     916              : /// Represents an op.with.overflow intrinsic.
     917              : class WithOverflowInst : public BinaryOpIntrinsic {
     918              : public:
     919              :   static bool classof(const IntrinsicInst *I) {
     920              :     switch (I->getIntrinsicID()) {
     921              :     case Intrinsic::uadd_with_overflow:
     922              :     case Intrinsic::sadd_with_overflow:
     923              :     case Intrinsic::usub_with_overflow:
     924              :     case Intrinsic::ssub_with_overflow:
     925              :     case Intrinsic::umul_with_overflow:
     926              :     case Intrinsic::smul_with_overflow:
     927              :       return true;
     928              :     default:
     929              :       return false;
     930              :     }
     931              :   }
     932              :   static bool classof(const Value *V) {
     933              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
     934              :   }
     935              : };
     936              : 
     937              : /// Represents a saturating add/sub intrinsic.
     938              : class SaturatingInst : public BinaryOpIntrinsic {
     939              : public:
     940              :   static bool classof(const IntrinsicInst *I) {
     941              :     switch (I->getIntrinsicID()) {
     942              :     case Intrinsic::uadd_sat:
     943              :     case Intrinsic::sadd_sat:
     944              :     case Intrinsic::usub_sat:
     945              :     case Intrinsic::ssub_sat:
     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              : /// Common base class for all memory intrinsics. Simply provides
     957              : /// common methods.
     958              : /// Written as CRTP to avoid a common base class amongst the
     959              : /// three atomicity hierarchies.
     960              : template <typename Derived> class MemIntrinsicBase : public IntrinsicInst {
     961              : private:
     962              :   enum { ARG_DEST = 0, ARG_LENGTH = 2 };
     963              : 
     964              : public:
     965              :   Value *getRawDest() const {
     966              :     return const_cast<Value *>(getArgOperand(ARG_DEST));
     967              :   }
     968              :   const Use &getRawDestUse() const { return getArgOperandUse(ARG_DEST); }
     969              :   Use &getRawDestUse() { return getArgOperandUse(ARG_DEST); }
     970              : 
     971              :   Value *getLength() const {
     972              :     return const_cast<Value *>(getArgOperand(ARG_LENGTH));
     973              :   }
     974              :   const Use &getLengthUse() const { return getArgOperandUse(ARG_LENGTH); }
     975              :   Use &getLengthUse() { return getArgOperandUse(ARG_LENGTH); }
     976              : 
     977              :   /// This is just like getRawDest, but it strips off any cast
     978              :   /// instructions (including addrspacecast) that feed it, giving the
     979              :   /// original input.  The returned value is guaranteed to be a pointer.
     980              :   Value *getDest() const { return getRawDest()->stripPointerCasts(); }
     981              : 
     982              :   unsigned getDestAddressSpace() const {
     983              :     return cast<PointerType>(getRawDest()->getType())->getAddressSpace();
     984              :   }
     985              : 
     986              :   /// FIXME: Remove this function once transition to Align is over.
     987              :   /// Use getDestAlign() instead.
     988              :   LLVM_DEPRECATED("Use getDestAlign() instead", "getDestAlign")
     989              :   unsigned getDestAlignment() const {
     990              :     if (auto MA = getParamAlign(ARG_DEST))
     991              :       return MA->value();
     992              :     return 0;
     993              :   }
     994              :   MaybeAlign getDestAlign() const { return getParamAlign(ARG_DEST); }
     995              : 
     996              :   /// Set the specified arguments of the instruction.
     997              :   void setDest(Value *Ptr) {
     998              :     assert(getRawDest()->getType() == Ptr->getType() &&
     999              :            "setDest called with pointer of wrong type!");
    1000              :     setArgOperand(ARG_DEST, Ptr);
    1001              :   }
    1002              : 
    1003              :   void setDestAlignment(MaybeAlign Alignment) {
    1004              :     removeParamAttr(ARG_DEST, Attribute::Alignment);
    1005              :     if (Alignment)
    1006              :       addParamAttr(ARG_DEST,
    1007              :                    Attribute::getWithAlignment(getContext(), *Alignment));
    1008              :   }
    1009              :   void setDestAlignment(Align Alignment) {
    1010              :     removeParamAttr(ARG_DEST, Attribute::Alignment);
    1011              :     addParamAttr(ARG_DEST,
    1012              :                  Attribute::getWithAlignment(getContext(), Alignment));
    1013              :   }
    1014              : 
    1015              :   void setLength(Value *L) {
    1016              :     assert(getLength()->getType() == L->getType() &&
    1017              :            "setLength called with value of wrong type!");
    1018              :     setArgOperand(ARG_LENGTH, L);
    1019              :   }
    1020              : };
    1021              : 
    1022              : /// Common base class for all memory transfer intrinsics. Simply provides
    1023              : /// common methods.
    1024              : template <class BaseCL> class MemTransferBase : public BaseCL {
    1025              : private:
    1026              :   enum { ARG_SOURCE = 1 };
    1027              : 
    1028              : public:
    1029              :   /// Return the arguments to the instruction.
    1030              :   Value *getRawSource() const {
    1031              :     return const_cast<Value *>(BaseCL::getArgOperand(ARG_SOURCE));
    1032              :   }
    1033              :   const Use &getRawSourceUse() const {
    1034              :     return BaseCL::getArgOperandUse(ARG_SOURCE);
    1035              :   }
    1036              :   Use &getRawSourceUse() { return BaseCL::getArgOperandUse(ARG_SOURCE); }
    1037              : 
    1038              :   /// This is just like getRawSource, but it strips off any cast
    1039              :   /// instructions that feed it, giving the original input.  The returned
    1040              :   /// value is guaranteed to be a pointer.
    1041              :   Value *getSource() const { return getRawSource()->stripPointerCasts(); }
    1042              : 
    1043              :   unsigned getSourceAddressSpace() const {
    1044              :     return cast<PointerType>(getRawSource()->getType())->getAddressSpace();
    1045              :   }
    1046              : 
    1047              :   /// FIXME: Remove this function once transition to Align is over.
    1048              :   /// Use getSourceAlign() instead.
    1049              :   LLVM_DEPRECATED("Use getSourceAlign() instead", "getSourceAlign")
    1050              :   unsigned getSourceAlignment() const {
    1051              :     if (auto MA = BaseCL::getParamAlign(ARG_SOURCE))
    1052              :       return MA->value();
    1053              :     return 0;
    1054              :   }
    1055              : 
    1056              :   MaybeAlign getSourceAlign() const {
    1057              :     return BaseCL::getParamAlign(ARG_SOURCE);
    1058              :   }
    1059              : 
    1060              :   void setSource(Value *Ptr) {
    1061              :     assert(getRawSource()->getType() == Ptr->getType() &&
    1062              :            "setSource called with pointer of wrong type!");
    1063              :     BaseCL::setArgOperand(ARG_SOURCE, Ptr);
    1064              :   }
    1065              : 
    1066              :   void setSourceAlignment(MaybeAlign Alignment) {
    1067              :     BaseCL::removeParamAttr(ARG_SOURCE, Attribute::Alignment);
    1068              :     if (Alignment)
    1069              :       BaseCL::addParamAttr(ARG_SOURCE, Attribute::getWithAlignment(
    1070              :                                            BaseCL::getContext(), *Alignment));
    1071              :   }
    1072              : 
    1073              :   void setSourceAlignment(Align Alignment) {
    1074              :     BaseCL::removeParamAttr(ARG_SOURCE, Attribute::Alignment);
    1075              :     BaseCL::addParamAttr(ARG_SOURCE, Attribute::getWithAlignment(
    1076              :                                          BaseCL::getContext(), Alignment));
    1077              :   }
    1078              : };
    1079              : 
    1080              : /// Common base class for all memset intrinsics. Simply provides
    1081              : /// common methods.
    1082              : template <class BaseCL> class MemSetBase : public BaseCL {
    1083              : private:
    1084              :   enum { ARG_VALUE = 1 };
    1085              : 
    1086              : public:
    1087              :   Value *getValue() const {
    1088              :     return const_cast<Value *>(BaseCL::getArgOperand(ARG_VALUE));
    1089              :   }
    1090              :   const Use &getValueUse() const { return BaseCL::getArgOperandUse(ARG_VALUE); }
    1091              :   Use &getValueUse() { return BaseCL::getArgOperandUse(ARG_VALUE); }
    1092              : 
    1093              :   void setValue(Value *Val) {
    1094              :     assert(getValue()->getType() == Val->getType() &&
    1095              :            "setValue called with value of wrong type!");
    1096              :     BaseCL::setArgOperand(ARG_VALUE, Val);
    1097              :   }
    1098              : };
    1099              : 
    1100              : // The common base class for the atomic memset/memmove/memcpy intrinsics
    1101              : // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
    1102              : class AtomicMemIntrinsic : public MemIntrinsicBase<AtomicMemIntrinsic> {
    1103              : private:
    1104              :   enum { ARG_ELEMENTSIZE = 3 };
    1105              : 
    1106              : public:
    1107              :   Value *getRawElementSizeInBytes() const {
    1108              :     return const_cast<Value *>(getArgOperand(ARG_ELEMENTSIZE));
    1109              :   }
    1110              : 
    1111              :   ConstantInt *getElementSizeInBytesCst() const {
    1112              :     return cast<ConstantInt>(getRawElementSizeInBytes());
    1113              :   }
    1114              : 
    1115              :   uint32_t getElementSizeInBytes() const {
    1116              :     return getElementSizeInBytesCst()->getZExtValue();
    1117              :   }
    1118              : 
    1119              :   void setElementSizeInBytes(Constant *V) {
    1120              :     assert(V->getType() == Type::getInt8Ty(getContext()) &&
    1121              :            "setElementSizeInBytes called with value of wrong type!");
    1122              :     setArgOperand(ARG_ELEMENTSIZE, V);
    1123              :   }
    1124              : 
    1125              :   static bool classof(const IntrinsicInst *I) {
    1126              :     switch (I->getIntrinsicID()) {
    1127              :     case Intrinsic::memcpy_element_unordered_atomic:
    1128              :     case Intrinsic::memmove_element_unordered_atomic:
    1129              :     case Intrinsic::memset_element_unordered_atomic:
    1130              :       return true;
    1131              :     default:
    1132              :       return false;
    1133              :     }
    1134              :   }
    1135              :   static bool classof(const Value *V) {
    1136              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1137              :   }
    1138              : };
    1139              : 
    1140              : /// This class represents atomic memset intrinsic
    1141              : // i.e. llvm.element.unordered.atomic.memset
    1142              : class AtomicMemSetInst : public MemSetBase<AtomicMemIntrinsic> {
    1143              : public:
    1144              :   static bool classof(const IntrinsicInst *I) {
    1145              :     return I->getIntrinsicID() == Intrinsic::memset_element_unordered_atomic;
    1146              :   }
    1147              :   static bool classof(const Value *V) {
    1148              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1149              :   }
    1150              : };
    1151              : 
    1152              : // This class wraps the atomic memcpy/memmove intrinsics
    1153              : // i.e. llvm.element.unordered.atomic.memcpy/memmove
    1154              : class AtomicMemTransferInst : public MemTransferBase<AtomicMemIntrinsic> {
    1155              : public:
    1156              :   static bool classof(const IntrinsicInst *I) {
    1157              :     switch (I->getIntrinsicID()) {
    1158              :     case Intrinsic::memcpy_element_unordered_atomic:
    1159              :     case Intrinsic::memmove_element_unordered_atomic:
    1160              :       return true;
    1161              :     default:
    1162              :       return false;
    1163              :     }
    1164              :   }
    1165              :   static bool classof(const Value *V) {
    1166              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1167              :   }
    1168              : };
    1169              : 
    1170              : /// This class represents the atomic memcpy intrinsic
    1171              : /// i.e. llvm.element.unordered.atomic.memcpy
    1172              : class AtomicMemCpyInst : public AtomicMemTransferInst {
    1173              : public:
    1174              :   static bool classof(const IntrinsicInst *I) {
    1175              :     return I->getIntrinsicID() == Intrinsic::memcpy_element_unordered_atomic;
    1176              :   }
    1177              :   static bool classof(const Value *V) {
    1178              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1179              :   }
    1180              : };
    1181              : 
    1182              : /// This class represents the atomic memmove intrinsic
    1183              : /// i.e. llvm.element.unordered.atomic.memmove
    1184              : class AtomicMemMoveInst : public AtomicMemTransferInst {
    1185              : public:
    1186              :   static bool classof(const IntrinsicInst *I) {
    1187              :     return I->getIntrinsicID() == Intrinsic::memmove_element_unordered_atomic;
    1188              :   }
    1189              :   static bool classof(const Value *V) {
    1190              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1191              :   }
    1192              : };
    1193              : 
    1194              : /// This is the common base class for memset/memcpy/memmove.
    1195              : class MemIntrinsic : public MemIntrinsicBase<MemIntrinsic> {
    1196              : private:
    1197              :   enum { ARG_VOLATILE = 3 };
    1198              : 
    1199              : public:
    1200              :   ConstantInt *getVolatileCst() const {
    1201              :     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(ARG_VOLATILE)));
    1202              :   }
    1203              : 
    1204              :   bool isVolatile() const { return !getVolatileCst()->isZero(); }
    1205              : 
    1206              :   void setVolatile(Constant *V) { setArgOperand(ARG_VOLATILE, V); }
    1207              : 
    1208              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1209              :   static bool classof(const IntrinsicInst *I) {
    1210              :     switch (I->getIntrinsicID()) {
    1211              :     case Intrinsic::memcpy:
    1212              :     case Intrinsic::memmove:
    1213              :     case Intrinsic::memset:
    1214              :     case Intrinsic::memset_inline:
    1215              :     case Intrinsic::memcpy_inline:
    1216              :       return true;
    1217              :     default:
    1218              :       return false;
    1219              :     }
    1220              :   }
    1221              :   static bool classof(const Value *V) {
    1222              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1223              :   }
    1224              : };
    1225              : 
    1226              : /// This class wraps the llvm.memset and llvm.memset.inline intrinsics.
    1227              : class MemSetInst : public MemSetBase<MemIntrinsic> {
    1228              : public:
    1229              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1230              :   static bool classof(const IntrinsicInst *I) {
    1231              :     switch (I->getIntrinsicID()) {
    1232              :     case Intrinsic::memset:
    1233              :     case Intrinsic::memset_inline:
    1234              :       return true;
    1235              :     default:
    1236              :       return false;
    1237              :     }
    1238              :   }
    1239              :   static bool classof(const Value *V) {
    1240              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1241              :   }
    1242              : };
    1243              : 
    1244              : /// This class wraps the llvm.memset.inline intrinsic.
    1245              : class MemSetInlineInst : public MemSetInst {
    1246              : public:
    1247              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1248              :   static bool classof(const IntrinsicInst *I) {
    1249              :     return I->getIntrinsicID() == Intrinsic::memset_inline;
    1250              :   }
    1251              :   static bool classof(const Value *V) {
    1252              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1253              :   }
    1254              : };
    1255              : 
    1256              : /// This class wraps the llvm.memcpy/memmove intrinsics.
    1257              : class MemTransferInst : public MemTransferBase<MemIntrinsic> {
    1258              : public:
    1259              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1260              :   static bool classof(const IntrinsicInst *I) {
    1261              :     switch (I->getIntrinsicID()) {
    1262              :     case Intrinsic::memcpy:
    1263              :     case Intrinsic::memmove:
    1264              :     case Intrinsic::memcpy_inline:
    1265              :       return true;
    1266              :     default:
    1267              :       return false;
    1268              :     }
    1269              :   }
    1270              :   static bool classof(const Value *V) {
    1271              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1272              :   }
    1273              : };
    1274              : 
    1275              : /// This class wraps the llvm.memcpy intrinsic.
    1276              : class MemCpyInst : public MemTransferInst {
    1277              : public:
    1278              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1279              :   static bool classof(const IntrinsicInst *I) {
    1280              :     return I->getIntrinsicID() == Intrinsic::memcpy ||
    1281              :            I->getIntrinsicID() == Intrinsic::memcpy_inline;
    1282              :   }
    1283              :   static bool classof(const Value *V) {
    1284              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1285              :   }
    1286              : };
    1287              : 
    1288              : /// This class wraps the llvm.memmove intrinsic.
    1289              : class MemMoveInst : public MemTransferInst {
    1290              : public:
    1291              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1292              :   static bool classof(const IntrinsicInst *I) {
    1293              :     return I->getIntrinsicID() == Intrinsic::memmove;
    1294              :   }
    1295              :   static bool classof(const Value *V) {
    1296              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1297              :   }
    1298              : };
    1299              : 
    1300              : /// This class wraps the llvm.memcpy.inline intrinsic.
    1301              : class MemCpyInlineInst : public MemCpyInst {
    1302              : public:
    1303              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
    1304              :   static bool classof(const IntrinsicInst *I) {
    1305              :     return I->getIntrinsicID() == Intrinsic::memcpy_inline;
    1306              :   }
    1307              :   static bool classof(const Value *V) {
    1308              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1309              :   }
    1310              : };
    1311              : 
    1312              : // The common base class for any memset/memmove/memcpy intrinsics;
    1313              : // whether they be atomic or non-atomic.
    1314              : // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
    1315              : //  and llvm.memset/memcpy/memmove
    1316              : class AnyMemIntrinsic : public MemIntrinsicBase<AnyMemIntrinsic> {
    1317              : public:
    1318              :   bool isVolatile() const {
    1319              :     // Only the non-atomic intrinsics can be volatile
    1320              :     if (auto *MI = dyn_cast<MemIntrinsic>(this))
    1321              :       return MI->isVolatile();
    1322              :     return false;
    1323              :   }
    1324              : 
    1325              :   static bool classof(const IntrinsicInst *I) {
    1326              :     switch (I->getIntrinsicID()) {
    1327              :     case Intrinsic::memcpy:
    1328              :     case Intrinsic::memcpy_inline:
    1329              :     case Intrinsic::memmove:
    1330              :     case Intrinsic::memset:
    1331              :     case Intrinsic::memset_inline:
    1332              :     case Intrinsic::memcpy_element_unordered_atomic:
    1333              :     case Intrinsic::memmove_element_unordered_atomic:
    1334              :     case Intrinsic::memset_element_unordered_atomic:
    1335              :       return true;
    1336              :     default:
    1337              :       return false;
    1338              :     }
    1339              :   }
    1340              :   static bool classof(const Value *V) {
    1341              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1342              :   }
    1343              : };
    1344              : 
    1345              : /// This class represents any memset intrinsic
    1346              : // i.e. llvm.element.unordered.atomic.memset
    1347              : // and  llvm.memset
    1348              : class AnyMemSetInst : public MemSetBase<AnyMemIntrinsic> {
    1349              : public:
    1350              :   static bool classof(const IntrinsicInst *I) {
    1351              :     switch (I->getIntrinsicID()) {
    1352              :     case Intrinsic::memset:
    1353              :     case Intrinsic::memset_inline:
    1354              :     case Intrinsic::memset_element_unordered_atomic:
    1355              :       return true;
    1356              :     default:
    1357              :       return false;
    1358              :     }
    1359              :   }
    1360              :   static bool classof(const Value *V) {
    1361              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1362              :   }
    1363              : };
    1364              : 
    1365              : // This class wraps any memcpy/memmove intrinsics
    1366              : // i.e. llvm.element.unordered.atomic.memcpy/memmove
    1367              : // and  llvm.memcpy/memmove
    1368              : class AnyMemTransferInst : public MemTransferBase<AnyMemIntrinsic> {
    1369              : public:
    1370              :   static bool classof(const IntrinsicInst *I) {
    1371              :     switch (I->getIntrinsicID()) {
    1372              :     case Intrinsic::memcpy:
    1373              :     case Intrinsic::memcpy_inline:
    1374              :     case Intrinsic::memmove:
    1375              :     case Intrinsic::memcpy_element_unordered_atomic:
    1376              :     case Intrinsic::memmove_element_unordered_atomic:
    1377              :       return true;
    1378              :     default:
    1379              :       return false;
    1380              :     }
    1381              :   }
    1382              :   static bool classof(const Value *V) {
    1383              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1384              :   }
    1385              : };
    1386              : 
    1387              : /// This class represents any memcpy intrinsic
    1388              : /// i.e. llvm.element.unordered.atomic.memcpy
    1389              : ///  and llvm.memcpy
    1390              : class AnyMemCpyInst : public AnyMemTransferInst {
    1391              : public:
    1392              :   static bool classof(const IntrinsicInst *I) {
    1393              :     switch (I->getIntrinsicID()) {
    1394              :     case Intrinsic::memcpy:
    1395              :     case Intrinsic::memcpy_inline:
    1396              :     case Intrinsic::memcpy_element_unordered_atomic:
    1397              :       return true;
    1398              :     default:
    1399              :       return false;
    1400              :     }
    1401              :   }
    1402              :   static bool classof(const Value *V) {
    1403              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1404              :   }
    1405              : };
    1406              : 
    1407              : /// This class represents any memmove intrinsic
    1408              : /// i.e. llvm.element.unordered.atomic.memmove
    1409              : ///  and llvm.memmove
    1410              : class AnyMemMoveInst : public AnyMemTransferInst {
    1411              : public:
    1412              :   static bool classof(const IntrinsicInst *I) {
    1413              :     switch (I->getIntrinsicID()) {
    1414              :     case Intrinsic::memmove:
    1415              :     case Intrinsic::memmove_element_unordered_atomic:
    1416              :       return true;
    1417              :     default:
    1418              :       return false;
    1419              :     }
    1420              :   }
    1421              :   static bool classof(const Value *V) {
    1422              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1423              :   }
    1424              : };
    1425              : 
    1426              : /// This represents the llvm.va_start intrinsic.
    1427              : class VAStartInst : public IntrinsicInst {
    1428              : public:
    1429              :   static bool classof(const IntrinsicInst *I) {
    1430              :     return I->getIntrinsicID() == Intrinsic::vastart;
    1431              :   }
    1432              :   static bool classof(const Value *V) {
    1433              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1434              :   }
    1435              : 
    1436              :   Value *getArgList() const { return const_cast<Value *>(getArgOperand(0)); }
    1437              : };
    1438              : 
    1439              : /// This represents the llvm.va_end intrinsic.
    1440              : class VAEndInst : public IntrinsicInst {
    1441              : public:
    1442              :   static bool classof(const IntrinsicInst *I) {
    1443              :     return I->getIntrinsicID() == Intrinsic::vaend;
    1444              :   }
    1445              :   static bool classof(const Value *V) {
    1446              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1447              :   }
    1448              : 
    1449              :   Value *getArgList() const { return const_cast<Value *>(getArgOperand(0)); }
    1450              : };
    1451              : 
    1452              : /// This represents the llvm.va_copy intrinsic.
    1453              : class VACopyInst : public IntrinsicInst {
    1454              : public:
    1455              :   static bool classof(const IntrinsicInst *I) {
    1456              :     return I->getIntrinsicID() == Intrinsic::vacopy;
    1457              :   }
    1458              :   static bool classof(const Value *V) {
    1459              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1460              :   }
    1461              : 
    1462              :   Value *getDest() const { return const_cast<Value *>(getArgOperand(0)); }
    1463              :   Value *getSrc() const { return const_cast<Value *>(getArgOperand(1)); }
    1464              : };
    1465              : 
    1466              : /// A base class for all instrprof intrinsics.
    1467              : class InstrProfInstBase : public IntrinsicInst {
    1468              : protected:
    1469              :   static bool isCounterBase(const IntrinsicInst &I) {
    1470              :     switch (I.getIntrinsicID()) {
    1471              :     case Intrinsic::instrprof_cover:
    1472              :     case Intrinsic::instrprof_increment:
    1473              :     case Intrinsic::instrprof_increment_step:
    1474              :     case Intrinsic::instrprof_callsite:
    1475              :     case Intrinsic::instrprof_timestamp:
    1476              :     case Intrinsic::instrprof_value_profile:
    1477              :       return true;
    1478              :     }
    1479              :     return false;
    1480              :   }
    1481              :   static bool isMCDCBitmapBase(const IntrinsicInst &I) {
    1482              :     switch (I.getIntrinsicID()) {
    1483              :     case Intrinsic::instrprof_mcdc_parameters:
    1484              :     case Intrinsic::instrprof_mcdc_tvbitmap_update:
    1485              :       return true;
    1486              :     }
    1487              :     return false;
    1488              :   }
    1489              : 
    1490              : public:
    1491              :   static bool classof(const Value *V) {
    1492              :     if (const auto *Instr = dyn_cast<IntrinsicInst>(V))
    1493              :       return isCounterBase(*Instr) || isMCDCBitmapBase(*Instr);
    1494              :     return false;
    1495              :   }
    1496              :   // The name of the instrumented function.
    1497              :   GlobalVariable *getName() const {
    1498              :     return cast<GlobalVariable>(
    1499              :         const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
    1500              :   }
    1501              :   // The hash of the CFG for the instrumented function.
    1502              :   ConstantInt *getHash() const {
    1503              :     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
    1504              :   }
    1505              : };
    1506              : 
    1507              : /// A base class for all instrprof counter intrinsics.
    1508              : class InstrProfCntrInstBase : public InstrProfInstBase {
    1509              : public:
    1510              :   static bool classof(const Value *V) {
    1511              :     if (const auto *Instr = dyn_cast<IntrinsicInst>(V))
    1512              :       return InstrProfInstBase::isCounterBase(*Instr);
    1513              :     return false;
    1514              :   }
    1515              : 
    1516              :   // The number of counters for the instrumented function.
    1517              :   ConstantInt *getNumCounters() const;
    1518              :   // The index of the counter that this instruction acts on.
    1519              :   ConstantInt *getIndex() const;
    1520              : };
    1521              : 
    1522              : /// This represents the llvm.instrprof.cover intrinsic.
    1523              : class InstrProfCoverInst : public InstrProfCntrInstBase {
    1524              : public:
    1525              :   static bool classof(const IntrinsicInst *I) {
    1526              :     return I->getIntrinsicID() == Intrinsic::instrprof_cover;
    1527              :   }
    1528              :   static bool classof(const Value *V) {
    1529              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1530              :   }
    1531              : };
    1532              : 
    1533              : /// This represents the llvm.instrprof.increment intrinsic.
    1534              : class InstrProfIncrementInst : public InstrProfCntrInstBase {
    1535              : public:
    1536              :   static bool classof(const IntrinsicInst *I) {
    1537              :     return I->getIntrinsicID() == Intrinsic::instrprof_increment ||
    1538              :            I->getIntrinsicID() == Intrinsic::instrprof_increment_step;
    1539              :   }
    1540              :   static bool classof(const Value *V) {
    1541              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1542              :   }
    1543              :   Value *getStep() const;
    1544              : };
    1545              : 
    1546              : /// This represents the llvm.instrprof.increment.step intrinsic.
    1547              : class InstrProfIncrementInstStep : public InstrProfIncrementInst {
    1548              : public:
    1549              :   static bool classof(const IntrinsicInst *I) {
    1550              :     return I->getIntrinsicID() == Intrinsic::instrprof_increment_step;
    1551              :   }
    1552              :   static bool classof(const Value *V) {
    1553              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1554              :   }
    1555              : };
    1556              : 
    1557              : /// This represents the llvm.instrprof.callsite intrinsic.
    1558              : /// It is structurally like the increment or step counters, hence the
    1559              : /// inheritance relationship, albeit somewhat tenuous (it's not 'counting' per
    1560              : /// se)
    1561              : class InstrProfCallsite : public InstrProfCntrInstBase {
    1562              : public:
    1563              :   static bool classof(const IntrinsicInst *I) {
    1564              :     return I->getIntrinsicID() == Intrinsic::instrprof_callsite;
    1565              :   }
    1566              :   static bool classof(const Value *V) {
    1567              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1568              :   }
    1569              :   Value *getCallee() const;
    1570              : };
    1571              : 
    1572              : /// This represents the llvm.instrprof.timestamp intrinsic.
    1573              : class InstrProfTimestampInst : public InstrProfCntrInstBase {
    1574              : public:
    1575              :   static bool classof(const IntrinsicInst *I) {
    1576              :     return I->getIntrinsicID() == Intrinsic::instrprof_timestamp;
    1577              :   }
    1578              :   static bool classof(const Value *V) {
    1579              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1580              :   }
    1581              : };
    1582              : 
    1583              : /// This represents the llvm.instrprof.value.profile intrinsic.
    1584              : class InstrProfValueProfileInst : public InstrProfCntrInstBase {
    1585              : public:
    1586              :   static bool classof(const IntrinsicInst *I) {
    1587              :     return I->getIntrinsicID() == Intrinsic::instrprof_value_profile;
    1588              :   }
    1589              :   static bool classof(const Value *V) {
    1590              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1591              :   }
    1592              : 
    1593              :   Value *getTargetValue() const {
    1594              :     return cast<Value>(const_cast<Value *>(getArgOperand(2)));
    1595              :   }
    1596              : 
    1597              :   ConstantInt *getValueKind() const {
    1598              :     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
    1599              :   }
    1600              : 
    1601              :   // Returns the value site index.
    1602              :   ConstantInt *getIndex() const {
    1603              :     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(4)));
    1604              :   }
    1605              : };
    1606              : 
    1607              : /// A base class for instrprof mcdc intrinsics that require global bitmap bytes.
    1608              : class InstrProfMCDCBitmapInstBase : public InstrProfInstBase {
    1609              : public:
    1610              :   static bool classof(const IntrinsicInst *I) {
    1611              :     return InstrProfInstBase::isMCDCBitmapBase(*I);
    1612              :   }
    1613              :   static bool classof(const Value *V) {
    1614              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1615              :   }
    1616              : 
    1617              :   /// \return The number of bits used for the MCDC bitmaps for the instrumented
    1618              :   /// function.
    1619              :   ConstantInt *getNumBitmapBits() const {
    1620              :     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
    1621              :   }
    1622              : 
    1623              :   /// \return The number of bytes used for the MCDC bitmaps for the instrumented
    1624              :   /// function.
    1625              :   auto getNumBitmapBytes() const {
    1626              :     return alignTo(getNumBitmapBits()->getZExtValue(), CHAR_BIT) / CHAR_BIT;
    1627              :   }
    1628              : };
    1629              : 
    1630              : /// This represents the llvm.instrprof.mcdc.parameters intrinsic.
    1631              : class InstrProfMCDCBitmapParameters : public InstrProfMCDCBitmapInstBase {
    1632              : public:
    1633              :   static bool classof(const IntrinsicInst *I) {
    1634              :     return I->getIntrinsicID() == Intrinsic::instrprof_mcdc_parameters;
    1635              :   }
    1636              :   static bool classof(const Value *V) {
    1637              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1638              :   }
    1639              : };
    1640              : 
    1641              : /// This represents the llvm.instrprof.mcdc.tvbitmap.update intrinsic.
    1642              : class InstrProfMCDCTVBitmapUpdate : public InstrProfMCDCBitmapInstBase {
    1643              : public:
    1644              :   static bool classof(const IntrinsicInst *I) {
    1645              :     return I->getIntrinsicID() == Intrinsic::instrprof_mcdc_tvbitmap_update;
    1646              :   }
    1647              :   static bool classof(const Value *V) {
    1648              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1649              :   }
    1650              : 
    1651              :   /// \return The index of the TestVector Bitmap upon which this intrinsic
    1652              :   /// acts.
    1653              :   ConstantInt *getBitmapIndex() const {
    1654              :     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
    1655              :   }
    1656              : 
    1657              :   /// \return The address of the corresponding condition bitmap containing
    1658              :   /// the index of the TestVector to update within the TestVector Bitmap.
    1659              :   Value *getMCDCCondBitmapAddr() const {
    1660              :     return cast<Value>(const_cast<Value *>(getArgOperand(3)));
    1661              :   }
    1662              : };
    1663              : 
    1664              : class PseudoProbeInst : public IntrinsicInst {
    1665              : public:
    1666              :   static bool classof(const IntrinsicInst *I) {
    1667              :     return I->getIntrinsicID() == Intrinsic::pseudoprobe;
    1668              :   }
    1669              : 
    1670              :   static bool classof(const Value *V) {
    1671              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1672              :   }
    1673              : 
    1674              :   ConstantInt *getFuncGuid() const {
    1675              :     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(0)));
    1676              :   }
    1677              : 
    1678              :   ConstantInt *getIndex() const {
    1679              :     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
    1680              :   }
    1681              : 
    1682              :   ConstantInt *getAttributes() const {
    1683              :     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
    1684              :   }
    1685              : 
    1686              :   ConstantInt *getFactor() const {
    1687              :     return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
    1688              :   }
    1689              : };
    1690              : 
    1691              : class NoAliasScopeDeclInst : public IntrinsicInst {
    1692              : public:
    1693              :   static bool classof(const IntrinsicInst *I) {
    1694              :     return I->getIntrinsicID() == Intrinsic::experimental_noalias_scope_decl;
    1695              :   }
    1696              : 
    1697              :   static bool classof(const Value *V) {
    1698              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1699              :   }
    1700              : 
    1701              :   MDNode *getScopeList() const {
    1702              :     auto *MV =
    1703              :         cast<MetadataAsValue>(getOperand(Intrinsic::NoAliasScopeDeclScopeArg));
    1704              :     return cast<MDNode>(MV->getMetadata());
    1705              :   }
    1706              : 
    1707              :   void setScopeList(MDNode *ScopeList) {
    1708              :     setOperand(Intrinsic::NoAliasScopeDeclScopeArg,
    1709              :                MetadataAsValue::get(getContext(), ScopeList));
    1710              :   }
    1711              : };
    1712              : 
    1713              : /// Common base class for representing values projected from a statepoint.
    1714              : /// Currently, the only projections available are gc.result and gc.relocate.
    1715              : class GCProjectionInst : public IntrinsicInst {
    1716              : public:
    1717              :   static bool classof(const IntrinsicInst *I) {
    1718              :     return I->getIntrinsicID() == Intrinsic::experimental_gc_relocate ||
    1719              :       I->getIntrinsicID() == Intrinsic::experimental_gc_result;
    1720              :   }
    1721              : 
    1722              :   static bool classof(const Value *V) {
    1723              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1724              :   }
    1725              : 
    1726              :   /// Return true if this relocate is tied to the invoke statepoint.
    1727              :   /// This includes relocates which are on the unwinding path.
    1728              :   bool isTiedToInvoke() const {
    1729              :     const Value *Token = getArgOperand(0);
    1730              : 
    1731              :     return isa<LandingPadInst>(Token) || isa<InvokeInst>(Token);
    1732              :   }
    1733              : 
    1734              :   /// The statepoint with which this gc.relocate is associated.
    1735              :   const Value *getStatepoint() const;
    1736              : };
    1737              : 
    1738              : /// Represents calls to the gc.relocate intrinsic.
    1739              : class GCRelocateInst : public GCProjectionInst {
    1740              : public:
    1741              :   static bool classof(const IntrinsicInst *I) {
    1742              :     return I->getIntrinsicID() == Intrinsic::experimental_gc_relocate;
    1743              :   }
    1744              : 
    1745              :   static bool classof(const Value *V) {
    1746              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1747              :   }
    1748              : 
    1749              :   /// The index into the associate statepoint's argument list
    1750              :   /// which contains the base pointer of the pointer whose
    1751              :   /// relocation this gc.relocate describes.
    1752              :   unsigned getBasePtrIndex() const {
    1753              :     return cast<ConstantInt>(getArgOperand(1))->getZExtValue();
    1754              :   }
    1755              : 
    1756              :   /// The index into the associate statepoint's argument list which
    1757              :   /// contains the pointer whose relocation this gc.relocate describes.
    1758              :   unsigned getDerivedPtrIndex() const {
    1759              :     return cast<ConstantInt>(getArgOperand(2))->getZExtValue();
    1760              :   }
    1761              : 
    1762              :   Value *getBasePtr() const;
    1763              :   Value *getDerivedPtr() const;
    1764              : };
    1765              : 
    1766              : /// Represents calls to the gc.result intrinsic.
    1767              : class GCResultInst : public GCProjectionInst {
    1768              : public:
    1769              :   static bool classof(const IntrinsicInst *I) {
    1770              :     return I->getIntrinsicID() == Intrinsic::experimental_gc_result;
    1771              :   }
    1772              : 
    1773              :   static bool classof(const Value *V) {
    1774              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1775              :   }
    1776              : };
    1777              : 
    1778              : 
    1779              : /// This represents the llvm.assume intrinsic.
    1780              : class AssumeInst : public IntrinsicInst {
    1781              : public:
    1782              :   static bool classof(const IntrinsicInst *I) {
    1783              :     return I->getIntrinsicID() == Intrinsic::assume;
    1784              :   }
    1785              :   static bool classof(const Value *V) {
    1786              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1787              :   }
    1788              : };
    1789              : 
    1790              : /// Check if \p ID corresponds to a convergence control intrinsic.
    1791              : static inline bool isConvergenceControlIntrinsic(unsigned IntrinsicID) {
    1792              :   switch (IntrinsicID) {
    1793              :   default:
    1794              :     return false;
    1795              :   case Intrinsic::experimental_convergence_anchor:
    1796              :   case Intrinsic::experimental_convergence_entry:
    1797              :   case Intrinsic::experimental_convergence_loop:
    1798              :     return true;
    1799              :   }
    1800              : }
    1801              : 
    1802              : /// Represents calls to the llvm.experimintal.convergence.* intrinsics.
    1803              : class ConvergenceControlInst : public IntrinsicInst {
    1804              : public:
    1805              :   static bool classof(const IntrinsicInst *I) {
    1806              :     return isConvergenceControlIntrinsic(I->getIntrinsicID());
    1807              :   }
    1808              : 
    1809              :   static bool classof(const Value *V) {
    1810              :     return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
    1811              :   }
    1812              : 
    1813              :   bool isAnchor() {
    1814              :     return getIntrinsicID() == Intrinsic::experimental_convergence_anchor;
    1815              :   }
    1816              :   bool isEntry() {
    1817              :     return getIntrinsicID() == Intrinsic::experimental_convergence_entry;
    1818              :   }
    1819              :   bool isLoop() {
    1820              :     return getIntrinsicID() == Intrinsic::experimental_convergence_loop;
    1821              :   }
    1822              : };
    1823              : 
    1824              : } // end namespace llvm
    1825              : 
    1826              : #endif // LLVM_IR_INTRINSICINST_H
        

Generated by: LCOV version 2.0-1