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