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