1 //===-- llvm/Instructions.h - Instruction subclass definitions --*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file exposes the class definitions of all of the subclasses of the 11 // Instruction class. This is meant to be an easy way to get access to all 12 // instruction subclasses. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #ifndef LLVM_INSTRUCTIONS_H 17 #define LLVM_INSTRUCTIONS_H 18 19 #include "llvm/InstrTypes.h" 20 #include "llvm/DerivedTypes.h" 21 #include "llvm/Attributes.h" 22 #include "llvm/CallingConv.h" 23 #include "llvm/ADT/ArrayRef.h" 24 #include "llvm/ADT/SmallVector.h" 25 #include "llvm/Support/ErrorHandling.h" 26 #include <iterator> 27 28 namespace llvm { 29 30 class ConstantInt; 31 class ConstantRange; 32 class APInt; 33 class LLVMContext; 34 35 enum AtomicOrdering { 36 NotAtomic = 0, 37 Unordered = 1, 38 Monotonic = 2, 39 // Consume = 3, // Not specified yet. 40 Acquire = 4, 41 Release = 5, 42 AcquireRelease = 6, 43 SequentiallyConsistent = 7 44 }; 45 46 enum SynchronizationScope { 47 SingleThread = 0, 48 CrossThread = 1 49 }; 50 51 //===----------------------------------------------------------------------===// 52 // AllocaInst Class 53 //===----------------------------------------------------------------------===// 54 55 /// AllocaInst - an instruction to allocate memory on the stack 56 /// 57 class AllocaInst : public UnaryInstruction { 58 protected: 59 virtual AllocaInst *clone_impl() const; 60 public: 61 explicit AllocaInst(Type *Ty, Value *ArraySize = 0, 62 const Twine &Name = "", Instruction *InsertBefore = 0); 63 AllocaInst(Type *Ty, Value *ArraySize, 64 const Twine &Name, BasicBlock *InsertAtEnd); 65 66 AllocaInst(Type *Ty, const Twine &Name, Instruction *InsertBefore = 0); 67 AllocaInst(Type *Ty, const Twine &Name, BasicBlock *InsertAtEnd); 68 69 AllocaInst(Type *Ty, Value *ArraySize, unsigned Align, 70 const Twine &Name = "", Instruction *InsertBefore = 0); 71 AllocaInst(Type *Ty, Value *ArraySize, unsigned Align, 72 const Twine &Name, BasicBlock *InsertAtEnd); 73 74 // Out of line virtual method, so the vtable, etc. has a home. 75 virtual ~AllocaInst(); 76 77 /// isArrayAllocation - Return true if there is an allocation size parameter 78 /// to the allocation instruction that is not 1. 79 /// 80 bool isArrayAllocation() const; 81 82 /// getArraySize - Get the number of elements allocated. For a simple 83 /// allocation of a single element, this will return a constant 1 value. 84 /// 85 const Value *getArraySize() const { return getOperand(0); } 86 Value *getArraySize() { return getOperand(0); } 87 88 /// getType - Overload to return most specific pointer type 89 /// 90 PointerType *getType() const { 91 return reinterpret_cast<PointerType*>(Instruction::getType()); 92 } 93 94 /// getAllocatedType - Return the type that is being allocated by the 95 /// instruction. 96 /// 97 Type *getAllocatedType() const; 98 99 /// getAlignment - Return the alignment of the memory that is being allocated 100 /// by the instruction. 101 /// 102 unsigned getAlignment() const { 103 return (1u << getSubclassDataFromInstruction()) >> 1; 104 } 105 void setAlignment(unsigned Align); 106 107 /// isStaticAlloca - Return true if this alloca is in the entry block of the 108 /// function and is a constant size. If so, the code generator will fold it 109 /// into the prolog/epilog code, so it is basically free. 110 bool isStaticAlloca() const; 111 112 // Methods for support type inquiry through isa, cast, and dyn_cast: 113 static inline bool classof(const AllocaInst *) { return true; } 114 static inline bool classof(const Instruction *I) { 115 return (I->getOpcode() == Instruction::Alloca); 116 } 117 static inline bool classof(const Value *V) { 118 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 119 } 120 private: 121 // Shadow Instruction::setInstructionSubclassData with a private forwarding 122 // method so that subclasses cannot accidentally use it. 123 void setInstructionSubclassData(unsigned short D) { 124 Instruction::setInstructionSubclassData(D); 125 } 126 }; 127 128 129 //===----------------------------------------------------------------------===// 130 // LoadInst Class 131 //===----------------------------------------------------------------------===// 132 133 /// LoadInst - an instruction for reading from memory. This uses the 134 /// SubclassData field in Value to store whether or not the load is volatile. 135 /// 136 class LoadInst : public UnaryInstruction { 137 void AssertOK(); 138 protected: 139 virtual LoadInst *clone_impl() const; 140 public: 141 LoadInst(Value *Ptr, const Twine &NameStr, Instruction *InsertBefore); 142 LoadInst(Value *Ptr, const Twine &NameStr, BasicBlock *InsertAtEnd); 143 LoadInst(Value *Ptr, const Twine &NameStr, bool isVolatile = false, 144 Instruction *InsertBefore = 0); 145 LoadInst(Value *Ptr, const Twine &NameStr, bool isVolatile, 146 BasicBlock *InsertAtEnd); 147 LoadInst(Value *Ptr, const Twine &NameStr, bool isVolatile, 148 unsigned Align, Instruction *InsertBefore = 0); 149 LoadInst(Value *Ptr, const Twine &NameStr, bool isVolatile, 150 unsigned Align, BasicBlock *InsertAtEnd); 151 LoadInst(Value *Ptr, const Twine &NameStr, bool isVolatile, 152 unsigned Align, AtomicOrdering Order, 153 SynchronizationScope SynchScope = CrossThread, 154 Instruction *InsertBefore = 0); 155 LoadInst(Value *Ptr, const Twine &NameStr, bool isVolatile, 156 unsigned Align, AtomicOrdering Order, 157 SynchronizationScope SynchScope, 158 BasicBlock *InsertAtEnd); 159 160 LoadInst(Value *Ptr, const char *NameStr, Instruction *InsertBefore); 161 LoadInst(Value *Ptr, const char *NameStr, BasicBlock *InsertAtEnd); 162 explicit LoadInst(Value *Ptr, const char *NameStr = 0, 163 bool isVolatile = false, Instruction *InsertBefore = 0); 164 LoadInst(Value *Ptr, const char *NameStr, bool isVolatile, 165 BasicBlock *InsertAtEnd); 166 167 /// isVolatile - Return true if this is a load from a volatile memory 168 /// location. 169 /// 170 bool isVolatile() const { return getSubclassDataFromInstruction() & 1; } 171 172 /// setVolatile - Specify whether this is a volatile load or not. 173 /// 174 void setVolatile(bool V) { 175 setInstructionSubclassData((getSubclassDataFromInstruction() & ~1) | 176 (V ? 1 : 0)); 177 } 178 179 /// getAlignment - Return the alignment of the access that is being performed 180 /// 181 unsigned getAlignment() const { 182 return (1 << ((getSubclassDataFromInstruction() >> 1) & 31)) >> 1; 183 } 184 185 void setAlignment(unsigned Align); 186 187 /// Returns the ordering effect of this fence. 188 AtomicOrdering getOrdering() const { 189 return AtomicOrdering((getSubclassDataFromInstruction() >> 7) & 7); 190 } 191 192 /// Set the ordering constraint on this load. May not be Release or 193 /// AcquireRelease. 194 void setOrdering(AtomicOrdering Ordering) { 195 setInstructionSubclassData((getSubclassDataFromInstruction() & ~(7 << 7)) | 196 (Ordering << 7)); 197 } 198 199 SynchronizationScope getSynchScope() const { 200 return SynchronizationScope((getSubclassDataFromInstruction() >> 6) & 1); 201 } 202 203 /// Specify whether this load is ordered with respect to all 204 /// concurrently executing threads, or only with respect to signal handlers 205 /// executing in the same thread. 206 void setSynchScope(SynchronizationScope xthread) { 207 setInstructionSubclassData((getSubclassDataFromInstruction() & ~(1 << 6)) | 208 (xthread << 6)); 209 } 210 211 bool isAtomic() const { return getOrdering() != NotAtomic; } 212 void setAtomic(AtomicOrdering Ordering, 213 SynchronizationScope SynchScope = CrossThread) { 214 setOrdering(Ordering); 215 setSynchScope(SynchScope); 216 } 217 218 bool isSimple() const { return !isAtomic() && !isVolatile(); } 219 bool isUnordered() const { 220 return getOrdering() <= Unordered && !isVolatile(); 221 } 222 223 Value *getPointerOperand() { return getOperand(0); } 224 const Value *getPointerOperand() const { return getOperand(0); } 225 static unsigned getPointerOperandIndex() { return 0U; } 226 227 unsigned getPointerAddressSpace() const { 228 return cast<PointerType>(getPointerOperand()->getType())->getAddressSpace(); 229 } 230 231 232 // Methods for support type inquiry through isa, cast, and dyn_cast: 233 static inline bool classof(const LoadInst *) { return true; } 234 static inline bool classof(const Instruction *I) { 235 return I->getOpcode() == Instruction::Load; 236 } 237 static inline bool classof(const Value *V) { 238 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 239 } 240 private: 241 // Shadow Instruction::setInstructionSubclassData with a private forwarding 242 // method so that subclasses cannot accidentally use it. 243 void setInstructionSubclassData(unsigned short D) { 244 Instruction::setInstructionSubclassData(D); 245 } 246 }; 247 248 249 //===----------------------------------------------------------------------===// 250 // StoreInst Class 251 //===----------------------------------------------------------------------===// 252 253 /// StoreInst - an instruction for storing to memory 254 /// 255 class StoreInst : public Instruction { 256 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 257 void AssertOK(); 258 protected: 259 virtual StoreInst *clone_impl() const; 260 public: 261 // allocate space for exactly two operands 262 void *operator new(size_t s) { 263 return User::operator new(s, 2); 264 } 265 StoreInst(Value *Val, Value *Ptr, Instruction *InsertBefore); 266 StoreInst(Value *Val, Value *Ptr, BasicBlock *InsertAtEnd); 267 StoreInst(Value *Val, Value *Ptr, bool isVolatile = false, 268 Instruction *InsertBefore = 0); 269 StoreInst(Value *Val, Value *Ptr, bool isVolatile, BasicBlock *InsertAtEnd); 270 StoreInst(Value *Val, Value *Ptr, bool isVolatile, 271 unsigned Align, Instruction *InsertBefore = 0); 272 StoreInst(Value *Val, Value *Ptr, bool isVolatile, 273 unsigned Align, BasicBlock *InsertAtEnd); 274 StoreInst(Value *Val, Value *Ptr, bool isVolatile, 275 unsigned Align, AtomicOrdering Order, 276 SynchronizationScope SynchScope = CrossThread, 277 Instruction *InsertBefore = 0); 278 StoreInst(Value *Val, Value *Ptr, bool isVolatile, 279 unsigned Align, AtomicOrdering Order, 280 SynchronizationScope SynchScope, 281 BasicBlock *InsertAtEnd); 282 283 284 /// isVolatile - Return true if this is a store to a volatile memory 285 /// location. 286 /// 287 bool isVolatile() const { return getSubclassDataFromInstruction() & 1; } 288 289 /// setVolatile - Specify whether this is a volatile store or not. 290 /// 291 void setVolatile(bool V) { 292 setInstructionSubclassData((getSubclassDataFromInstruction() & ~1) | 293 (V ? 1 : 0)); 294 } 295 296 /// Transparently provide more efficient getOperand methods. 297 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 298 299 /// getAlignment - Return the alignment of the access that is being performed 300 /// 301 unsigned getAlignment() const { 302 return (1 << ((getSubclassDataFromInstruction() >> 1) & 31)) >> 1; 303 } 304 305 void setAlignment(unsigned Align); 306 307 /// Returns the ordering effect of this store. 308 AtomicOrdering getOrdering() const { 309 return AtomicOrdering((getSubclassDataFromInstruction() >> 7) & 7); 310 } 311 312 /// Set the ordering constraint on this store. May not be Acquire or 313 /// AcquireRelease. 314 void setOrdering(AtomicOrdering Ordering) { 315 setInstructionSubclassData((getSubclassDataFromInstruction() & ~(7 << 7)) | 316 (Ordering << 7)); 317 } 318 319 SynchronizationScope getSynchScope() const { 320 return SynchronizationScope((getSubclassDataFromInstruction() >> 6) & 1); 321 } 322 323 /// Specify whether this store instruction is ordered with respect to all 324 /// concurrently executing threads, or only with respect to signal handlers 325 /// executing in the same thread. 326 void setSynchScope(SynchronizationScope xthread) { 327 setInstructionSubclassData((getSubclassDataFromInstruction() & ~(1 << 6)) | 328 (xthread << 6)); 329 } 330 331 bool isAtomic() const { return getOrdering() != NotAtomic; } 332 void setAtomic(AtomicOrdering Ordering, 333 SynchronizationScope SynchScope = CrossThread) { 334 setOrdering(Ordering); 335 setSynchScope(SynchScope); 336 } 337 338 bool isSimple() const { return !isAtomic() && !isVolatile(); } 339 bool isUnordered() const { 340 return getOrdering() <= Unordered && !isVolatile(); 341 } 342 343 Value *getValueOperand() { return getOperand(0); } 344 const Value *getValueOperand() const { return getOperand(0); } 345 346 Value *getPointerOperand() { return getOperand(1); } 347 const Value *getPointerOperand() const { return getOperand(1); } 348 static unsigned getPointerOperandIndex() { return 1U; } 349 350 unsigned getPointerAddressSpace() const { 351 return cast<PointerType>(getPointerOperand()->getType())->getAddressSpace(); 352 } 353 354 // Methods for support type inquiry through isa, cast, and dyn_cast: 355 static inline bool classof(const StoreInst *) { return true; } 356 static inline bool classof(const Instruction *I) { 357 return I->getOpcode() == Instruction::Store; 358 } 359 static inline bool classof(const Value *V) { 360 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 361 } 362 private: 363 // Shadow Instruction::setInstructionSubclassData with a private forwarding 364 // method so that subclasses cannot accidentally use it. 365 void setInstructionSubclassData(unsigned short D) { 366 Instruction::setInstructionSubclassData(D); 367 } 368 }; 369 370 template <> 371 struct OperandTraits<StoreInst> : public FixedNumOperandTraits<StoreInst, 2> { 372 }; 373 374 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(StoreInst, Value) 375 376 //===----------------------------------------------------------------------===// 377 // FenceInst Class 378 //===----------------------------------------------------------------------===// 379 380 /// FenceInst - an instruction for ordering other memory operations 381 /// 382 class FenceInst : public Instruction { 383 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 384 void Init(AtomicOrdering Ordering, SynchronizationScope SynchScope); 385 protected: 386 virtual FenceInst *clone_impl() const; 387 public: 388 // allocate space for exactly zero operands 389 void *operator new(size_t s) { 390 return User::operator new(s, 0); 391 } 392 393 // Ordering may only be Acquire, Release, AcquireRelease, or 394 // SequentiallyConsistent. 395 FenceInst(LLVMContext &C, AtomicOrdering Ordering, 396 SynchronizationScope SynchScope = CrossThread, 397 Instruction *InsertBefore = 0); 398 FenceInst(LLVMContext &C, AtomicOrdering Ordering, 399 SynchronizationScope SynchScope, 400 BasicBlock *InsertAtEnd); 401 402 /// Returns the ordering effect of this fence. 403 AtomicOrdering getOrdering() const { 404 return AtomicOrdering(getSubclassDataFromInstruction() >> 1); 405 } 406 407 /// Set the ordering constraint on this fence. May only be Acquire, Release, 408 /// AcquireRelease, or SequentiallyConsistent. 409 void setOrdering(AtomicOrdering Ordering) { 410 setInstructionSubclassData((getSubclassDataFromInstruction() & 1) | 411 (Ordering << 1)); 412 } 413 414 SynchronizationScope getSynchScope() const { 415 return SynchronizationScope(getSubclassDataFromInstruction() & 1); 416 } 417 418 /// Specify whether this fence orders other operations with respect to all 419 /// concurrently executing threads, or only with respect to signal handlers 420 /// executing in the same thread. 421 void setSynchScope(SynchronizationScope xthread) { 422 setInstructionSubclassData((getSubclassDataFromInstruction() & ~1) | 423 xthread); 424 } 425 426 // Methods for support type inquiry through isa, cast, and dyn_cast: 427 static inline bool classof(const FenceInst *) { return true; } 428 static inline bool classof(const Instruction *I) { 429 return I->getOpcode() == Instruction::Fence; 430 } 431 static inline bool classof(const Value *V) { 432 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 433 } 434 private: 435 // Shadow Instruction::setInstructionSubclassData with a private forwarding 436 // method so that subclasses cannot accidentally use it. 437 void setInstructionSubclassData(unsigned short D) { 438 Instruction::setInstructionSubclassData(D); 439 } 440 }; 441 442 //===----------------------------------------------------------------------===// 443 // AtomicCmpXchgInst Class 444 //===----------------------------------------------------------------------===// 445 446 /// AtomicCmpXchgInst - an instruction that atomically checks whether a 447 /// specified value is in a memory location, and, if it is, stores a new value 448 /// there. Returns the value that was loaded. 449 /// 450 class AtomicCmpXchgInst : public Instruction { 451 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 452 void Init(Value *Ptr, Value *Cmp, Value *NewVal, 453 AtomicOrdering Ordering, SynchronizationScope SynchScope); 454 protected: 455 virtual AtomicCmpXchgInst *clone_impl() const; 456 public: 457 // allocate space for exactly three operands 458 void *operator new(size_t s) { 459 return User::operator new(s, 3); 460 } 461 AtomicCmpXchgInst(Value *Ptr, Value *Cmp, Value *NewVal, 462 AtomicOrdering Ordering, SynchronizationScope SynchScope, 463 Instruction *InsertBefore = 0); 464 AtomicCmpXchgInst(Value *Ptr, Value *Cmp, Value *NewVal, 465 AtomicOrdering Ordering, SynchronizationScope SynchScope, 466 BasicBlock *InsertAtEnd); 467 468 /// isVolatile - Return true if this is a cmpxchg from a volatile memory 469 /// location. 470 /// 471 bool isVolatile() const { 472 return getSubclassDataFromInstruction() & 1; 473 } 474 475 /// setVolatile - Specify whether this is a volatile cmpxchg. 476 /// 477 void setVolatile(bool V) { 478 setInstructionSubclassData((getSubclassDataFromInstruction() & ~1) | 479 (unsigned)V); 480 } 481 482 /// Transparently provide more efficient getOperand methods. 483 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 484 485 /// Set the ordering constraint on this cmpxchg. 486 void setOrdering(AtomicOrdering Ordering) { 487 assert(Ordering != NotAtomic && 488 "CmpXchg instructions can only be atomic."); 489 setInstructionSubclassData((getSubclassDataFromInstruction() & 3) | 490 (Ordering << 2)); 491 } 492 493 /// Specify whether this cmpxchg is atomic and orders other operations with 494 /// respect to all concurrently executing threads, or only with respect to 495 /// signal handlers executing in the same thread. 496 void setSynchScope(SynchronizationScope SynchScope) { 497 setInstructionSubclassData((getSubclassDataFromInstruction() & ~2) | 498 (SynchScope << 1)); 499 } 500 501 /// Returns the ordering constraint on this cmpxchg. 502 AtomicOrdering getOrdering() const { 503 return AtomicOrdering(getSubclassDataFromInstruction() >> 2); 504 } 505 506 /// Returns whether this cmpxchg is atomic between threads or only within a 507 /// single thread. 508 SynchronizationScope getSynchScope() const { 509 return SynchronizationScope((getSubclassDataFromInstruction() & 2) >> 1); 510 } 511 512 Value *getPointerOperand() { return getOperand(0); } 513 const Value *getPointerOperand() const { return getOperand(0); } 514 static unsigned getPointerOperandIndex() { return 0U; } 515 516 Value *getCompareOperand() { return getOperand(1); } 517 const Value *getCompareOperand() const { return getOperand(1); } 518 519 Value *getNewValOperand() { return getOperand(2); } 520 const Value *getNewValOperand() const { return getOperand(2); } 521 522 unsigned getPointerAddressSpace() const { 523 return cast<PointerType>(getPointerOperand()->getType())->getAddressSpace(); 524 } 525 526 // Methods for support type inquiry through isa, cast, and dyn_cast: 527 static inline bool classof(const AtomicCmpXchgInst *) { return true; } 528 static inline bool classof(const Instruction *I) { 529 return I->getOpcode() == Instruction::AtomicCmpXchg; 530 } 531 static inline bool classof(const Value *V) { 532 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 533 } 534 private: 535 // Shadow Instruction::setInstructionSubclassData with a private forwarding 536 // method so that subclasses cannot accidentally use it. 537 void setInstructionSubclassData(unsigned short D) { 538 Instruction::setInstructionSubclassData(D); 539 } 540 }; 541 542 template <> 543 struct OperandTraits<AtomicCmpXchgInst> : 544 public FixedNumOperandTraits<AtomicCmpXchgInst, 3> { 545 }; 546 547 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(AtomicCmpXchgInst, Value) 548 549 //===----------------------------------------------------------------------===// 550 // AtomicRMWInst Class 551 //===----------------------------------------------------------------------===// 552 553 /// AtomicRMWInst - an instruction that atomically reads a memory location, 554 /// combines it with another value, and then stores the result back. Returns 555 /// the old value. 556 /// 557 class AtomicRMWInst : public Instruction { 558 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 559 protected: 560 virtual AtomicRMWInst *clone_impl() const; 561 public: 562 /// This enumeration lists the possible modifications atomicrmw can make. In 563 /// the descriptions, 'p' is the pointer to the instruction's memory location, 564 /// 'old' is the initial value of *p, and 'v' is the other value passed to the 565 /// instruction. These instructions always return 'old'. 566 enum BinOp { 567 /// *p = v 568 Xchg, 569 /// *p = old + v 570 Add, 571 /// *p = old - v 572 Sub, 573 /// *p = old & v 574 And, 575 /// *p = ~old & v 576 Nand, 577 /// *p = old | v 578 Or, 579 /// *p = old ^ v 580 Xor, 581 /// *p = old >signed v ? old : v 582 Max, 583 /// *p = old <signed v ? old : v 584 Min, 585 /// *p = old >unsigned v ? old : v 586 UMax, 587 /// *p = old <unsigned v ? old : v 588 UMin, 589 590 FIRST_BINOP = Xchg, 591 LAST_BINOP = UMin, 592 BAD_BINOP 593 }; 594 595 // allocate space for exactly two operands 596 void *operator new(size_t s) { 597 return User::operator new(s, 2); 598 } 599 AtomicRMWInst(BinOp Operation, Value *Ptr, Value *Val, 600 AtomicOrdering Ordering, SynchronizationScope SynchScope, 601 Instruction *InsertBefore = 0); 602 AtomicRMWInst(BinOp Operation, Value *Ptr, Value *Val, 603 AtomicOrdering Ordering, SynchronizationScope SynchScope, 604 BasicBlock *InsertAtEnd); 605 606 BinOp getOperation() const { 607 return static_cast<BinOp>(getSubclassDataFromInstruction() >> 5); 608 } 609 610 void setOperation(BinOp Operation) { 611 unsigned short SubclassData = getSubclassDataFromInstruction(); 612 setInstructionSubclassData((SubclassData & 31) | 613 (Operation << 5)); 614 } 615 616 /// isVolatile - Return true if this is a RMW on a volatile memory location. 617 /// 618 bool isVolatile() const { 619 return getSubclassDataFromInstruction() & 1; 620 } 621 622 /// setVolatile - Specify whether this is a volatile RMW or not. 623 /// 624 void setVolatile(bool V) { 625 setInstructionSubclassData((getSubclassDataFromInstruction() & ~1) | 626 (unsigned)V); 627 } 628 629 /// Transparently provide more efficient getOperand methods. 630 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 631 632 /// Set the ordering constraint on this RMW. 633 void setOrdering(AtomicOrdering Ordering) { 634 assert(Ordering != NotAtomic && 635 "atomicrmw instructions can only be atomic."); 636 setInstructionSubclassData((getSubclassDataFromInstruction() & ~(7 << 2)) | 637 (Ordering << 2)); 638 } 639 640 /// Specify whether this RMW orders other operations with respect to all 641 /// concurrently executing threads, or only with respect to signal handlers 642 /// executing in the same thread. 643 void setSynchScope(SynchronizationScope SynchScope) { 644 setInstructionSubclassData((getSubclassDataFromInstruction() & ~2) | 645 (SynchScope << 1)); 646 } 647 648 /// Returns the ordering constraint on this RMW. 649 AtomicOrdering getOrdering() const { 650 return AtomicOrdering((getSubclassDataFromInstruction() >> 2) & 7); 651 } 652 653 /// Returns whether this RMW is atomic between threads or only within a 654 /// single thread. 655 SynchronizationScope getSynchScope() const { 656 return SynchronizationScope((getSubclassDataFromInstruction() & 2) >> 1); 657 } 658 659 Value *getPointerOperand() { return getOperand(0); } 660 const Value *getPointerOperand() const { return getOperand(0); } 661 static unsigned getPointerOperandIndex() { return 0U; } 662 663 Value *getValOperand() { return getOperand(1); } 664 const Value *getValOperand() const { return getOperand(1); } 665 666 unsigned getPointerAddressSpace() const { 667 return cast<PointerType>(getPointerOperand()->getType())->getAddressSpace(); 668 } 669 670 // Methods for support type inquiry through isa, cast, and dyn_cast: 671 static inline bool classof(const AtomicRMWInst *) { return true; } 672 static inline bool classof(const Instruction *I) { 673 return I->getOpcode() == Instruction::AtomicRMW; 674 } 675 static inline bool classof(const Value *V) { 676 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 677 } 678 private: 679 void Init(BinOp Operation, Value *Ptr, Value *Val, 680 AtomicOrdering Ordering, SynchronizationScope SynchScope); 681 // Shadow Instruction::setInstructionSubclassData with a private forwarding 682 // method so that subclasses cannot accidentally use it. 683 void setInstructionSubclassData(unsigned short D) { 684 Instruction::setInstructionSubclassData(D); 685 } 686 }; 687 688 template <> 689 struct OperandTraits<AtomicRMWInst> 690 : public FixedNumOperandTraits<AtomicRMWInst,2> { 691 }; 692 693 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(AtomicRMWInst, Value) 694 695 //===----------------------------------------------------------------------===// 696 // GetElementPtrInst Class 697 //===----------------------------------------------------------------------===// 698 699 // checkGEPType - Simple wrapper function to give a better assertion failure 700 // message on bad indexes for a gep instruction. 701 // 702 static inline Type *checkGEPType(Type *Ty) { 703 assert(Ty && "Invalid GetElementPtrInst indices for type!"); 704 return Ty; 705 } 706 707 /// GetElementPtrInst - an instruction for type-safe pointer arithmetic to 708 /// access elements of arrays and structs 709 /// 710 class GetElementPtrInst : public Instruction { 711 GetElementPtrInst(const GetElementPtrInst &GEPI); 712 void init(Value *Ptr, ArrayRef<Value *> IdxList, const Twine &NameStr); 713 714 /// Constructors - Create a getelementptr instruction with a base pointer an 715 /// list of indices. The first ctor can optionally insert before an existing 716 /// instruction, the second appends the new instruction to the specified 717 /// BasicBlock. 718 inline GetElementPtrInst(Value *Ptr, ArrayRef<Value *> IdxList, 719 unsigned Values, const Twine &NameStr, 720 Instruction *InsertBefore); 721 inline GetElementPtrInst(Value *Ptr, ArrayRef<Value *> IdxList, 722 unsigned Values, const Twine &NameStr, 723 BasicBlock *InsertAtEnd); 724 protected: 725 virtual GetElementPtrInst *clone_impl() const; 726 public: 727 static GetElementPtrInst *Create(Value *Ptr, ArrayRef<Value *> IdxList, 728 const Twine &NameStr = "", 729 Instruction *InsertBefore = 0) { 730 unsigned Values = 1 + unsigned(IdxList.size()); 731 return new(Values) 732 GetElementPtrInst(Ptr, IdxList, Values, NameStr, InsertBefore); 733 } 734 static GetElementPtrInst *Create(Value *Ptr, ArrayRef<Value *> IdxList, 735 const Twine &NameStr, 736 BasicBlock *InsertAtEnd) { 737 unsigned Values = 1 + unsigned(IdxList.size()); 738 return new(Values) 739 GetElementPtrInst(Ptr, IdxList, Values, NameStr, InsertAtEnd); 740 } 741 742 /// Create an "inbounds" getelementptr. See the documentation for the 743 /// "inbounds" flag in LangRef.html for details. 744 static GetElementPtrInst *CreateInBounds(Value *Ptr, 745 ArrayRef<Value *> IdxList, 746 const Twine &NameStr = "", 747 Instruction *InsertBefore = 0) { 748 GetElementPtrInst *GEP = Create(Ptr, IdxList, NameStr, InsertBefore); 749 GEP->setIsInBounds(true); 750 return GEP; 751 } 752 static GetElementPtrInst *CreateInBounds(Value *Ptr, 753 ArrayRef<Value *> IdxList, 754 const Twine &NameStr, 755 BasicBlock *InsertAtEnd) { 756 GetElementPtrInst *GEP = Create(Ptr, IdxList, NameStr, InsertAtEnd); 757 GEP->setIsInBounds(true); 758 return GEP; 759 } 760 761 /// Transparently provide more efficient getOperand methods. 762 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 763 764 // getType - Overload to return most specific pointer type... 765 PointerType *getType() const { 766 return reinterpret_cast<PointerType*>(Instruction::getType()); 767 } 768 769 /// getIndexedType - Returns the type of the element that would be loaded with 770 /// a load instruction with the specified parameters. 771 /// 772 /// Null is returned if the indices are invalid for the specified 773 /// pointer type. 774 /// 775 static Type *getIndexedType(Type *Ptr, ArrayRef<Value *> IdxList); 776 static Type *getIndexedType(Type *Ptr, ArrayRef<Constant *> IdxList); 777 static Type *getIndexedType(Type *Ptr, ArrayRef<uint64_t> IdxList); 778 779 /// getIndexedType - Returns the address space used by the GEP pointer. 780 /// 781 static unsigned getAddressSpace(Value *Ptr); 782 783 inline op_iterator idx_begin() { return op_begin()+1; } 784 inline const_op_iterator idx_begin() const { return op_begin()+1; } 785 inline op_iterator idx_end() { return op_end(); } 786 inline const_op_iterator idx_end() const { return op_end(); } 787 788 Value *getPointerOperand() { 789 return getOperand(0); 790 } 791 const Value *getPointerOperand() const { 792 return getOperand(0); 793 } 794 static unsigned getPointerOperandIndex() { 795 return 0U; // get index for modifying correct operand. 796 } 797 798 unsigned getPointerAddressSpace() const { 799 return cast<PointerType>(getType())->getAddressSpace(); 800 } 801 802 /// getPointerOperandType - Method to return the pointer operand as a 803 /// PointerType. 804 Type *getPointerOperandType() const { 805 return getPointerOperand()->getType(); 806 } 807 808 /// GetGEPReturnType - Returns the pointer type returned by the GEP 809 /// instruction, which may be a vector of pointers. 810 static Type *getGEPReturnType(Value *Ptr, ArrayRef<Value *> IdxList) { 811 Type *PtrTy = PointerType::get(checkGEPType( 812 getIndexedType(Ptr->getType(), IdxList)), 813 getAddressSpace(Ptr)); 814 // Vector GEP 815 if (Ptr->getType()->isVectorTy()) { 816 unsigned NumElem = cast<VectorType>(Ptr->getType())->getNumElements(); 817 return VectorType::get(PtrTy, NumElem); 818 } 819 820 // Scalar GEP 821 return PtrTy; 822 } 823 824 unsigned getNumIndices() const { // Note: always non-negative 825 return getNumOperands() - 1; 826 } 827 828 bool hasIndices() const { 829 return getNumOperands() > 1; 830 } 831 832 /// hasAllZeroIndices - Return true if all of the indices of this GEP are 833 /// zeros. If so, the result pointer and the first operand have the same 834 /// value, just potentially different types. 835 bool hasAllZeroIndices() const; 836 837 /// hasAllConstantIndices - Return true if all of the indices of this GEP are 838 /// constant integers. If so, the result pointer and the first operand have 839 /// a constant offset between them. 840 bool hasAllConstantIndices() const; 841 842 /// setIsInBounds - Set or clear the inbounds flag on this GEP instruction. 843 /// See LangRef.html for the meaning of inbounds on a getelementptr. 844 void setIsInBounds(bool b = true); 845 846 /// isInBounds - Determine whether the GEP has the inbounds flag. 847 bool isInBounds() const; 848 849 // Methods for support type inquiry through isa, cast, and dyn_cast: 850 static inline bool classof(const GetElementPtrInst *) { return true; } 851 static inline bool classof(const Instruction *I) { 852 return (I->getOpcode() == Instruction::GetElementPtr); 853 } 854 static inline bool classof(const Value *V) { 855 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 856 } 857 }; 858 859 template <> 860 struct OperandTraits<GetElementPtrInst> : 861 public VariadicOperandTraits<GetElementPtrInst, 1> { 862 }; 863 864 GetElementPtrInst::GetElementPtrInst(Value *Ptr, 865 ArrayRef<Value *> IdxList, 866 unsigned Values, 867 const Twine &NameStr, 868 Instruction *InsertBefore) 869 : Instruction(getGEPReturnType(Ptr, IdxList), 870 GetElementPtr, 871 OperandTraits<GetElementPtrInst>::op_end(this) - Values, 872 Values, InsertBefore) { 873 init(Ptr, IdxList, NameStr); 874 } 875 GetElementPtrInst::GetElementPtrInst(Value *Ptr, 876 ArrayRef<Value *> IdxList, 877 unsigned Values, 878 const Twine &NameStr, 879 BasicBlock *InsertAtEnd) 880 : Instruction(getGEPReturnType(Ptr, IdxList), 881 GetElementPtr, 882 OperandTraits<GetElementPtrInst>::op_end(this) - Values, 883 Values, InsertAtEnd) { 884 init(Ptr, IdxList, NameStr); 885 } 886 887 888 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(GetElementPtrInst, Value) 889 890 891 //===----------------------------------------------------------------------===// 892 // ICmpInst Class 893 //===----------------------------------------------------------------------===// 894 895 /// This instruction compares its operands according to the predicate given 896 /// to the constructor. It only operates on integers or pointers. The operands 897 /// must be identical types. 898 /// @brief Represent an integer comparison operator. 899 class ICmpInst: public CmpInst { 900 protected: 901 /// @brief Clone an identical ICmpInst 902 virtual ICmpInst *clone_impl() const; 903 public: 904 /// @brief Constructor with insert-before-instruction semantics. 905 ICmpInst( 906 Instruction *InsertBefore, ///< Where to insert 907 Predicate pred, ///< The predicate to use for the comparison 908 Value *LHS, ///< The left-hand-side of the expression 909 Value *RHS, ///< The right-hand-side of the expression 910 const Twine &NameStr = "" ///< Name of the instruction 911 ) : CmpInst(makeCmpResultType(LHS->getType()), 912 Instruction::ICmp, pred, LHS, RHS, NameStr, 913 InsertBefore) { 914 assert(pred >= CmpInst::FIRST_ICMP_PREDICATE && 915 pred <= CmpInst::LAST_ICMP_PREDICATE && 916 "Invalid ICmp predicate value"); 917 assert(getOperand(0)->getType() == getOperand(1)->getType() && 918 "Both operands to ICmp instruction are not of the same type!"); 919 // Check that the operands are the right type 920 assert((getOperand(0)->getType()->isIntOrIntVectorTy() || 921 getOperand(0)->getType()->getScalarType()->isPointerTy()) && 922 "Invalid operand types for ICmp instruction"); 923 } 924 925 /// @brief Constructor with insert-at-end semantics. 926 ICmpInst( 927 BasicBlock &InsertAtEnd, ///< Block to insert into. 928 Predicate pred, ///< The predicate to use for the comparison 929 Value *LHS, ///< The left-hand-side of the expression 930 Value *RHS, ///< The right-hand-side of the expression 931 const Twine &NameStr = "" ///< Name of the instruction 932 ) : CmpInst(makeCmpResultType(LHS->getType()), 933 Instruction::ICmp, pred, LHS, RHS, NameStr, 934 &InsertAtEnd) { 935 assert(pred >= CmpInst::FIRST_ICMP_PREDICATE && 936 pred <= CmpInst::LAST_ICMP_PREDICATE && 937 "Invalid ICmp predicate value"); 938 assert(getOperand(0)->getType() == getOperand(1)->getType() && 939 "Both operands to ICmp instruction are not of the same type!"); 940 // Check that the operands are the right type 941 assert((getOperand(0)->getType()->isIntOrIntVectorTy() || 942 getOperand(0)->getType()->isPointerTy()) && 943 "Invalid operand types for ICmp instruction"); 944 } 945 946 /// @brief Constructor with no-insertion semantics 947 ICmpInst( 948 Predicate pred, ///< The predicate to use for the comparison 949 Value *LHS, ///< The left-hand-side of the expression 950 Value *RHS, ///< The right-hand-side of the expression 951 const Twine &NameStr = "" ///< Name of the instruction 952 ) : CmpInst(makeCmpResultType(LHS->getType()), 953 Instruction::ICmp, pred, LHS, RHS, NameStr) { 954 assert(pred >= CmpInst::FIRST_ICMP_PREDICATE && 955 pred <= CmpInst::LAST_ICMP_PREDICATE && 956 "Invalid ICmp predicate value"); 957 assert(getOperand(0)->getType() == getOperand(1)->getType() && 958 "Both operands to ICmp instruction are not of the same type!"); 959 // Check that the operands are the right type 960 assert((getOperand(0)->getType()->isIntOrIntVectorTy() || 961 getOperand(0)->getType()->getScalarType()->isPointerTy()) && 962 "Invalid operand types for ICmp instruction"); 963 } 964 965 /// For example, EQ->EQ, SLE->SLE, UGT->SGT, etc. 966 /// @returns the predicate that would be the result if the operand were 967 /// regarded as signed. 968 /// @brief Return the signed version of the predicate 969 Predicate getSignedPredicate() const { 970 return getSignedPredicate(getPredicate()); 971 } 972 973 /// This is a static version that you can use without an instruction. 974 /// @brief Return the signed version of the predicate. 975 static Predicate getSignedPredicate(Predicate pred); 976 977 /// For example, EQ->EQ, SLE->ULE, UGT->UGT, etc. 978 /// @returns the predicate that would be the result if the operand were 979 /// regarded as unsigned. 980 /// @brief Return the unsigned version of the predicate 981 Predicate getUnsignedPredicate() const { 982 return getUnsignedPredicate(getPredicate()); 983 } 984 985 /// This is a static version that you can use without an instruction. 986 /// @brief Return the unsigned version of the predicate. 987 static Predicate getUnsignedPredicate(Predicate pred); 988 989 /// isEquality - Return true if this predicate is either EQ or NE. This also 990 /// tests for commutativity. 991 static bool isEquality(Predicate P) { 992 return P == ICMP_EQ || P == ICMP_NE; 993 } 994 995 /// isEquality - Return true if this predicate is either EQ or NE. This also 996 /// tests for commutativity. 997 bool isEquality() const { 998 return isEquality(getPredicate()); 999 } 1000 1001 /// @returns true if the predicate of this ICmpInst is commutative 1002 /// @brief Determine if this relation is commutative. 1003 bool isCommutative() const { return isEquality(); } 1004 1005 /// isRelational - Return true if the predicate is relational (not EQ or NE). 1006 /// 1007 bool isRelational() const { 1008 return !isEquality(); 1009 } 1010 1011 /// isRelational - Return true if the predicate is relational (not EQ or NE). 1012 /// 1013 static bool isRelational(Predicate P) { 1014 return !isEquality(P); 1015 } 1016 1017 /// Initialize a set of values that all satisfy the predicate with C. 1018 /// @brief Make a ConstantRange for a relation with a constant value. 1019 static ConstantRange makeConstantRange(Predicate pred, const APInt &C); 1020 1021 /// Exchange the two operands to this instruction in such a way that it does 1022 /// not modify the semantics of the instruction. The predicate value may be 1023 /// changed to retain the same result if the predicate is order dependent 1024 /// (e.g. ult). 1025 /// @brief Swap operands and adjust predicate. 1026 void swapOperands() { 1027 setPredicate(getSwappedPredicate()); 1028 Op<0>().swap(Op<1>()); 1029 } 1030 1031 // Methods for support type inquiry through isa, cast, and dyn_cast: 1032 static inline bool classof(const ICmpInst *) { return true; } 1033 static inline bool classof(const Instruction *I) { 1034 return I->getOpcode() == Instruction::ICmp; 1035 } 1036 static inline bool classof(const Value *V) { 1037 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 1038 } 1039 1040 }; 1041 1042 //===----------------------------------------------------------------------===// 1043 // FCmpInst Class 1044 //===----------------------------------------------------------------------===// 1045 1046 /// This instruction compares its operands according to the predicate given 1047 /// to the constructor. It only operates on floating point values or packed 1048 /// vectors of floating point values. The operands must be identical types. 1049 /// @brief Represents a floating point comparison operator. 1050 class FCmpInst: public CmpInst { 1051 protected: 1052 /// @brief Clone an identical FCmpInst 1053 virtual FCmpInst *clone_impl() const; 1054 public: 1055 /// @brief Constructor with insert-before-instruction semantics. 1056 FCmpInst( 1057 Instruction *InsertBefore, ///< Where to insert 1058 Predicate pred, ///< The predicate to use for the comparison 1059 Value *LHS, ///< The left-hand-side of the expression 1060 Value *RHS, ///< The right-hand-side of the expression 1061 const Twine &NameStr = "" ///< Name of the instruction 1062 ) : CmpInst(makeCmpResultType(LHS->getType()), 1063 Instruction::FCmp, pred, LHS, RHS, NameStr, 1064 InsertBefore) { 1065 assert(pred <= FCmpInst::LAST_FCMP_PREDICATE && 1066 "Invalid FCmp predicate value"); 1067 assert(getOperand(0)->getType() == getOperand(1)->getType() && 1068 "Both operands to FCmp instruction are not of the same type!"); 1069 // Check that the operands are the right type 1070 assert(getOperand(0)->getType()->isFPOrFPVectorTy() && 1071 "Invalid operand types for FCmp instruction"); 1072 } 1073 1074 /// @brief Constructor with insert-at-end semantics. 1075 FCmpInst( 1076 BasicBlock &InsertAtEnd, ///< Block to insert into. 1077 Predicate pred, ///< The predicate to use for the comparison 1078 Value *LHS, ///< The left-hand-side of the expression 1079 Value *RHS, ///< The right-hand-side of the expression 1080 const Twine &NameStr = "" ///< Name of the instruction 1081 ) : CmpInst(makeCmpResultType(LHS->getType()), 1082 Instruction::FCmp, pred, LHS, RHS, NameStr, 1083 &InsertAtEnd) { 1084 assert(pred <= FCmpInst::LAST_FCMP_PREDICATE && 1085 "Invalid FCmp predicate value"); 1086 assert(getOperand(0)->getType() == getOperand(1)->getType() && 1087 "Both operands to FCmp instruction are not of the same type!"); 1088 // Check that the operands are the right type 1089 assert(getOperand(0)->getType()->isFPOrFPVectorTy() && 1090 "Invalid operand types for FCmp instruction"); 1091 } 1092 1093 /// @brief Constructor with no-insertion semantics 1094 FCmpInst( 1095 Predicate pred, ///< The predicate to use for the comparison 1096 Value *LHS, ///< The left-hand-side of the expression 1097 Value *RHS, ///< The right-hand-side of the expression 1098 const Twine &NameStr = "" ///< Name of the instruction 1099 ) : CmpInst(makeCmpResultType(LHS->getType()), 1100 Instruction::FCmp, pred, LHS, RHS, NameStr) { 1101 assert(pred <= FCmpInst::LAST_FCMP_PREDICATE && 1102 "Invalid FCmp predicate value"); 1103 assert(getOperand(0)->getType() == getOperand(1)->getType() && 1104 "Both operands to FCmp instruction are not of the same type!"); 1105 // Check that the operands are the right type 1106 assert(getOperand(0)->getType()->isFPOrFPVectorTy() && 1107 "Invalid operand types for FCmp instruction"); 1108 } 1109 1110 /// @returns true if the predicate of this instruction is EQ or NE. 1111 /// @brief Determine if this is an equality predicate. 1112 bool isEquality() const { 1113 return getPredicate() == FCMP_OEQ || getPredicate() == FCMP_ONE || 1114 getPredicate() == FCMP_UEQ || getPredicate() == FCMP_UNE; 1115 } 1116 1117 /// @returns true if the predicate of this instruction is commutative. 1118 /// @brief Determine if this is a commutative predicate. 1119 bool isCommutative() const { 1120 return isEquality() || 1121 getPredicate() == FCMP_FALSE || 1122 getPredicate() == FCMP_TRUE || 1123 getPredicate() == FCMP_ORD || 1124 getPredicate() == FCMP_UNO; 1125 } 1126 1127 /// @returns true if the predicate is relational (not EQ or NE). 1128 /// @brief Determine if this a relational predicate. 1129 bool isRelational() const { return !isEquality(); } 1130 1131 /// Exchange the two operands to this instruction in such a way that it does 1132 /// not modify the semantics of the instruction. The predicate value may be 1133 /// changed to retain the same result if the predicate is order dependent 1134 /// (e.g. ult). 1135 /// @brief Swap operands and adjust predicate. 1136 void swapOperands() { 1137 setPredicate(getSwappedPredicate()); 1138 Op<0>().swap(Op<1>()); 1139 } 1140 1141 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: 1142 static inline bool classof(const FCmpInst *) { return true; } 1143 static inline bool classof(const Instruction *I) { 1144 return I->getOpcode() == Instruction::FCmp; 1145 } 1146 static inline bool classof(const Value *V) { 1147 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 1148 } 1149 }; 1150 1151 //===----------------------------------------------------------------------===// 1152 /// CallInst - This class represents a function call, abstracting a target 1153 /// machine's calling convention. This class uses low bit of the SubClassData 1154 /// field to indicate whether or not this is a tail call. The rest of the bits 1155 /// hold the calling convention of the call. 1156 /// 1157 class CallInst : public Instruction { 1158 AttrListPtr AttributeList; ///< parameter attributes for call 1159 CallInst(const CallInst &CI); 1160 void init(Value *Func, ArrayRef<Value *> Args, const Twine &NameStr); 1161 void init(Value *Func, const Twine &NameStr); 1162 1163 /// Construct a CallInst given a range of arguments. 1164 /// @brief Construct a CallInst from a range of arguments 1165 inline CallInst(Value *Func, ArrayRef<Value *> Args, 1166 const Twine &NameStr, Instruction *InsertBefore); 1167 1168 /// Construct a CallInst given a range of arguments. 1169 /// @brief Construct a CallInst from a range of arguments 1170 inline CallInst(Value *Func, ArrayRef<Value *> Args, 1171 const Twine &NameStr, BasicBlock *InsertAtEnd); 1172 1173 CallInst(Value *F, Value *Actual, const Twine &NameStr, 1174 Instruction *InsertBefore); 1175 CallInst(Value *F, Value *Actual, const Twine &NameStr, 1176 BasicBlock *InsertAtEnd); 1177 explicit CallInst(Value *F, const Twine &NameStr, 1178 Instruction *InsertBefore); 1179 CallInst(Value *F, const Twine &NameStr, BasicBlock *InsertAtEnd); 1180 protected: 1181 virtual CallInst *clone_impl() const; 1182 public: 1183 static CallInst *Create(Value *Func, 1184 ArrayRef<Value *> Args, 1185 const Twine &NameStr = "", 1186 Instruction *InsertBefore = 0) { 1187 return new(unsigned(Args.size() + 1)) 1188 CallInst(Func, Args, NameStr, InsertBefore); 1189 } 1190 static CallInst *Create(Value *Func, 1191 ArrayRef<Value *> Args, 1192 const Twine &NameStr, BasicBlock *InsertAtEnd) { 1193 return new(unsigned(Args.size() + 1)) 1194 CallInst(Func, Args, NameStr, InsertAtEnd); 1195 } 1196 static CallInst *Create(Value *F, const Twine &NameStr = "", 1197 Instruction *InsertBefore = 0) { 1198 return new(1) CallInst(F, NameStr, InsertBefore); 1199 } 1200 static CallInst *Create(Value *F, const Twine &NameStr, 1201 BasicBlock *InsertAtEnd) { 1202 return new(1) CallInst(F, NameStr, InsertAtEnd); 1203 } 1204 /// CreateMalloc - Generate the IR for a call to malloc: 1205 /// 1. Compute the malloc call's argument as the specified type's size, 1206 /// possibly multiplied by the array size if the array size is not 1207 /// constant 1. 1208 /// 2. Call malloc with that argument. 1209 /// 3. Bitcast the result of the malloc call to the specified type. 1210 static Instruction *CreateMalloc(Instruction *InsertBefore, 1211 Type *IntPtrTy, Type *AllocTy, 1212 Value *AllocSize, Value *ArraySize = 0, 1213 Function* MallocF = 0, 1214 const Twine &Name = ""); 1215 static Instruction *CreateMalloc(BasicBlock *InsertAtEnd, 1216 Type *IntPtrTy, Type *AllocTy, 1217 Value *AllocSize, Value *ArraySize = 0, 1218 Function* MallocF = 0, 1219 const Twine &Name = ""); 1220 /// CreateFree - Generate the IR for a call to the builtin free function. 1221 static Instruction* CreateFree(Value* Source, Instruction *InsertBefore); 1222 static Instruction* CreateFree(Value* Source, BasicBlock *InsertAtEnd); 1223 1224 ~CallInst(); 1225 1226 bool isTailCall() const { return getSubclassDataFromInstruction() & 1; } 1227 void setTailCall(bool isTC = true) { 1228 setInstructionSubclassData((getSubclassDataFromInstruction() & ~1) | 1229 unsigned(isTC)); 1230 } 1231 1232 /// Provide fast operand accessors 1233 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 1234 1235 /// getNumArgOperands - Return the number of call arguments. 1236 /// 1237 unsigned getNumArgOperands() const { return getNumOperands() - 1; } 1238 1239 /// getArgOperand/setArgOperand - Return/set the i-th call argument. 1240 /// 1241 Value *getArgOperand(unsigned i) const { return getOperand(i); } 1242 void setArgOperand(unsigned i, Value *v) { setOperand(i, v); } 1243 1244 /// getCallingConv/setCallingConv - Get or set the calling convention of this 1245 /// function call. 1246 CallingConv::ID getCallingConv() const { 1247 return static_cast<CallingConv::ID>(getSubclassDataFromInstruction() >> 1); 1248 } 1249 void setCallingConv(CallingConv::ID CC) { 1250 setInstructionSubclassData((getSubclassDataFromInstruction() & 1) | 1251 (static_cast<unsigned>(CC) << 1)); 1252 } 1253 1254 /// getAttributes - Return the parameter attributes for this call. 1255 /// 1256 const AttrListPtr &getAttributes() const { return AttributeList; } 1257 1258 /// setAttributes - Set the parameter attributes for this call. 1259 /// 1260 void setAttributes(const AttrListPtr &Attrs) { AttributeList = Attrs; } 1261 1262 /// addAttribute - adds the attribute to the list of attributes. 1263 void addAttribute(unsigned i, Attributes attr); 1264 1265 /// removeAttribute - removes the attribute from the list of attributes. 1266 void removeAttribute(unsigned i, Attributes attr); 1267 1268 /// @brief Determine whether the call or the callee has the given attribute. 1269 bool paramHasAttr(unsigned i, Attributes attr) const; 1270 1271 /// @brief Extract the alignment for a call or parameter (0=unknown). 1272 unsigned getParamAlignment(unsigned i) const { 1273 return AttributeList.getParamAlignment(i); 1274 } 1275 1276 /// @brief Return true if the call should not be inlined. 1277 bool isNoInline() const { return paramHasAttr(~0, Attribute::NoInline); } 1278 void setIsNoInline(bool Value = true) { 1279 if (Value) addAttribute(~0, Attribute::NoInline); 1280 else removeAttribute(~0, Attribute::NoInline); 1281 } 1282 1283 /// @brief Return true if the call can return twice 1284 bool canReturnTwice() const { 1285 return paramHasAttr(~0, Attribute::ReturnsTwice); 1286 } 1287 void setCanReturnTwice(bool Value = true) { 1288 if (Value) addAttribute(~0, Attribute::ReturnsTwice); 1289 else removeAttribute(~0, Attribute::ReturnsTwice); 1290 } 1291 1292 /// @brief Determine if the call does not access memory. 1293 bool doesNotAccessMemory() const { 1294 return paramHasAttr(~0, Attribute::ReadNone); 1295 } 1296 void setDoesNotAccessMemory(bool NotAccessMemory = true) { 1297 if (NotAccessMemory) addAttribute(~0, Attribute::ReadNone); 1298 else removeAttribute(~0, Attribute::ReadNone); 1299 } 1300 1301 /// @brief Determine if the call does not access or only reads memory. 1302 bool onlyReadsMemory() const { 1303 return doesNotAccessMemory() || paramHasAttr(~0, Attribute::ReadOnly); 1304 } 1305 void setOnlyReadsMemory(bool OnlyReadsMemory = true) { 1306 if (OnlyReadsMemory) addAttribute(~0, Attribute::ReadOnly); 1307 else removeAttribute(~0, Attribute::ReadOnly | Attribute::ReadNone); 1308 } 1309 1310 /// @brief Determine if the call cannot return. 1311 bool doesNotReturn() const { return paramHasAttr(~0, Attribute::NoReturn); } 1312 void setDoesNotReturn(bool DoesNotReturn = true) { 1313 if (DoesNotReturn) addAttribute(~0, Attribute::NoReturn); 1314 else removeAttribute(~0, Attribute::NoReturn); 1315 } 1316 1317 /// @brief Determine if the call cannot unwind. 1318 bool doesNotThrow() const { return paramHasAttr(~0, Attribute::NoUnwind); } 1319 void setDoesNotThrow(bool DoesNotThrow = true) { 1320 if (DoesNotThrow) addAttribute(~0, Attribute::NoUnwind); 1321 else removeAttribute(~0, Attribute::NoUnwind); 1322 } 1323 1324 /// @brief Determine if the call returns a structure through first 1325 /// pointer argument. 1326 bool hasStructRetAttr() const { 1327 // Be friendly and also check the callee. 1328 return paramHasAttr(1, Attribute::StructRet); 1329 } 1330 1331 /// @brief Determine if any call argument is an aggregate passed by value. 1332 bool hasByValArgument() const { 1333 return AttributeList.hasAttrSomewhere(Attribute::ByVal); 1334 } 1335 1336 /// getCalledFunction - Return the function called, or null if this is an 1337 /// indirect function invocation. 1338 /// 1339 Function *getCalledFunction() const { 1340 return dyn_cast<Function>(Op<-1>()); 1341 } 1342 1343 /// getCalledValue - Get a pointer to the function that is invoked by this 1344 /// instruction. 1345 const Value *getCalledValue() const { return Op<-1>(); } 1346 Value *getCalledValue() { return Op<-1>(); } 1347 1348 /// setCalledFunction - Set the function called. 1349 void setCalledFunction(Value* Fn) { 1350 Op<-1>() = Fn; 1351 } 1352 1353 /// isInlineAsm - Check if this call is an inline asm statement. 1354 bool isInlineAsm() const { 1355 return isa<InlineAsm>(Op<-1>()); 1356 } 1357 1358 // Methods for support type inquiry through isa, cast, and dyn_cast: 1359 static inline bool classof(const CallInst *) { return true; } 1360 static inline bool classof(const Instruction *I) { 1361 return I->getOpcode() == Instruction::Call; 1362 } 1363 static inline bool classof(const Value *V) { 1364 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 1365 } 1366 private: 1367 // Shadow Instruction::setInstructionSubclassData with a private forwarding 1368 // method so that subclasses cannot accidentally use it. 1369 void setInstructionSubclassData(unsigned short D) { 1370 Instruction::setInstructionSubclassData(D); 1371 } 1372 }; 1373 1374 template <> 1375 struct OperandTraits<CallInst> : public VariadicOperandTraits<CallInst, 1> { 1376 }; 1377 1378 CallInst::CallInst(Value *Func, ArrayRef<Value *> Args, 1379 const Twine &NameStr, BasicBlock *InsertAtEnd) 1380 : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType()) 1381 ->getElementType())->getReturnType(), 1382 Instruction::Call, 1383 OperandTraits<CallInst>::op_end(this) - (Args.size() + 1), 1384 unsigned(Args.size() + 1), InsertAtEnd) { 1385 init(Func, Args, NameStr); 1386 } 1387 1388 CallInst::CallInst(Value *Func, ArrayRef<Value *> Args, 1389 const Twine &NameStr, Instruction *InsertBefore) 1390 : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType()) 1391 ->getElementType())->getReturnType(), 1392 Instruction::Call, 1393 OperandTraits<CallInst>::op_end(this) - (Args.size() + 1), 1394 unsigned(Args.size() + 1), InsertBefore) { 1395 init(Func, Args, NameStr); 1396 } 1397 1398 1399 // Note: if you get compile errors about private methods then 1400 // please update your code to use the high-level operand 1401 // interfaces. See line 943 above. 1402 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CallInst, Value) 1403 1404 //===----------------------------------------------------------------------===// 1405 // SelectInst Class 1406 //===----------------------------------------------------------------------===// 1407 1408 /// SelectInst - This class represents the LLVM 'select' instruction. 1409 /// 1410 class SelectInst : public Instruction { 1411 void init(Value *C, Value *S1, Value *S2) { 1412 assert(!areInvalidOperands(C, S1, S2) && "Invalid operands for select"); 1413 Op<0>() = C; 1414 Op<1>() = S1; 1415 Op<2>() = S2; 1416 } 1417 1418 SelectInst(Value *C, Value *S1, Value *S2, const Twine &NameStr, 1419 Instruction *InsertBefore) 1420 : Instruction(S1->getType(), Instruction::Select, 1421 &Op<0>(), 3, InsertBefore) { 1422 init(C, S1, S2); 1423 setName(NameStr); 1424 } 1425 SelectInst(Value *C, Value *S1, Value *S2, const Twine &NameStr, 1426 BasicBlock *InsertAtEnd) 1427 : Instruction(S1->getType(), Instruction::Select, 1428 &Op<0>(), 3, InsertAtEnd) { 1429 init(C, S1, S2); 1430 setName(NameStr); 1431 } 1432 protected: 1433 virtual SelectInst *clone_impl() const; 1434 public: 1435 static SelectInst *Create(Value *C, Value *S1, Value *S2, 1436 const Twine &NameStr = "", 1437 Instruction *InsertBefore = 0) { 1438 return new(3) SelectInst(C, S1, S2, NameStr, InsertBefore); 1439 } 1440 static SelectInst *Create(Value *C, Value *S1, Value *S2, 1441 const Twine &NameStr, 1442 BasicBlock *InsertAtEnd) { 1443 return new(3) SelectInst(C, S1, S2, NameStr, InsertAtEnd); 1444 } 1445 1446 const Value *getCondition() const { return Op<0>(); } 1447 const Value *getTrueValue() const { return Op<1>(); } 1448 const Value *getFalseValue() const { return Op<2>(); } 1449 Value *getCondition() { return Op<0>(); } 1450 Value *getTrueValue() { return Op<1>(); } 1451 Value *getFalseValue() { return Op<2>(); } 1452 1453 /// areInvalidOperands - Return a string if the specified operands are invalid 1454 /// for a select operation, otherwise return null. 1455 static const char *areInvalidOperands(Value *Cond, Value *True, Value *False); 1456 1457 /// Transparently provide more efficient getOperand methods. 1458 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 1459 1460 OtherOps getOpcode() const { 1461 return static_cast<OtherOps>(Instruction::getOpcode()); 1462 } 1463 1464 // Methods for support type inquiry through isa, cast, and dyn_cast: 1465 static inline bool classof(const SelectInst *) { return true; } 1466 static inline bool classof(const Instruction *I) { 1467 return I->getOpcode() == Instruction::Select; 1468 } 1469 static inline bool classof(const Value *V) { 1470 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 1471 } 1472 }; 1473 1474 template <> 1475 struct OperandTraits<SelectInst> : public FixedNumOperandTraits<SelectInst, 3> { 1476 }; 1477 1478 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(SelectInst, Value) 1479 1480 //===----------------------------------------------------------------------===// 1481 // VAArgInst Class 1482 //===----------------------------------------------------------------------===// 1483 1484 /// VAArgInst - This class represents the va_arg llvm instruction, which returns 1485 /// an argument of the specified type given a va_list and increments that list 1486 /// 1487 class VAArgInst : public UnaryInstruction { 1488 protected: 1489 virtual VAArgInst *clone_impl() const; 1490 1491 public: 1492 VAArgInst(Value *List, Type *Ty, const Twine &NameStr = "", 1493 Instruction *InsertBefore = 0) 1494 : UnaryInstruction(Ty, VAArg, List, InsertBefore) { 1495 setName(NameStr); 1496 } 1497 VAArgInst(Value *List, Type *Ty, const Twine &NameStr, 1498 BasicBlock *InsertAtEnd) 1499 : UnaryInstruction(Ty, VAArg, List, InsertAtEnd) { 1500 setName(NameStr); 1501 } 1502 1503 Value *getPointerOperand() { return getOperand(0); } 1504 const Value *getPointerOperand() const { return getOperand(0); } 1505 static unsigned getPointerOperandIndex() { return 0U; } 1506 1507 // Methods for support type inquiry through isa, cast, and dyn_cast: 1508 static inline bool classof(const VAArgInst *) { return true; } 1509 static inline bool classof(const Instruction *I) { 1510 return I->getOpcode() == VAArg; 1511 } 1512 static inline bool classof(const Value *V) { 1513 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 1514 } 1515 }; 1516 1517 //===----------------------------------------------------------------------===// 1518 // ExtractElementInst Class 1519 //===----------------------------------------------------------------------===// 1520 1521 /// ExtractElementInst - This instruction extracts a single (scalar) 1522 /// element from a VectorType value 1523 /// 1524 class ExtractElementInst : public Instruction { 1525 ExtractElementInst(Value *Vec, Value *Idx, const Twine &NameStr = "", 1526 Instruction *InsertBefore = 0); 1527 ExtractElementInst(Value *Vec, Value *Idx, const Twine &NameStr, 1528 BasicBlock *InsertAtEnd); 1529 protected: 1530 virtual ExtractElementInst *clone_impl() const; 1531 1532 public: 1533 static ExtractElementInst *Create(Value *Vec, Value *Idx, 1534 const Twine &NameStr = "", 1535 Instruction *InsertBefore = 0) { 1536 return new(2) ExtractElementInst(Vec, Idx, NameStr, InsertBefore); 1537 } 1538 static ExtractElementInst *Create(Value *Vec, Value *Idx, 1539 const Twine &NameStr, 1540 BasicBlock *InsertAtEnd) { 1541 return new(2) ExtractElementInst(Vec, Idx, NameStr, InsertAtEnd); 1542 } 1543 1544 /// isValidOperands - Return true if an extractelement instruction can be 1545 /// formed with the specified operands. 1546 static bool isValidOperands(const Value *Vec, const Value *Idx); 1547 1548 Value *getVectorOperand() { return Op<0>(); } 1549 Value *getIndexOperand() { return Op<1>(); } 1550 const Value *getVectorOperand() const { return Op<0>(); } 1551 const Value *getIndexOperand() const { return Op<1>(); } 1552 1553 VectorType *getVectorOperandType() const { 1554 return reinterpret_cast<VectorType*>(getVectorOperand()->getType()); 1555 } 1556 1557 1558 /// Transparently provide more efficient getOperand methods. 1559 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 1560 1561 // Methods for support type inquiry through isa, cast, and dyn_cast: 1562 static inline bool classof(const ExtractElementInst *) { return true; } 1563 static inline bool classof(const Instruction *I) { 1564 return I->getOpcode() == Instruction::ExtractElement; 1565 } 1566 static inline bool classof(const Value *V) { 1567 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 1568 } 1569 }; 1570 1571 template <> 1572 struct OperandTraits<ExtractElementInst> : 1573 public FixedNumOperandTraits<ExtractElementInst, 2> { 1574 }; 1575 1576 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ExtractElementInst, Value) 1577 1578 //===----------------------------------------------------------------------===// 1579 // InsertElementInst Class 1580 //===----------------------------------------------------------------------===// 1581 1582 /// InsertElementInst - This instruction inserts a single (scalar) 1583 /// element into a VectorType value 1584 /// 1585 class InsertElementInst : public Instruction { 1586 InsertElementInst(Value *Vec, Value *NewElt, Value *Idx, 1587 const Twine &NameStr = "", 1588 Instruction *InsertBefore = 0); 1589 InsertElementInst(Value *Vec, Value *NewElt, Value *Idx, 1590 const Twine &NameStr, BasicBlock *InsertAtEnd); 1591 protected: 1592 virtual InsertElementInst *clone_impl() const; 1593 1594 public: 1595 static InsertElementInst *Create(Value *Vec, Value *NewElt, Value *Idx, 1596 const Twine &NameStr = "", 1597 Instruction *InsertBefore = 0) { 1598 return new(3) InsertElementInst(Vec, NewElt, Idx, NameStr, InsertBefore); 1599 } 1600 static InsertElementInst *Create(Value *Vec, Value *NewElt, Value *Idx, 1601 const Twine &NameStr, 1602 BasicBlock *InsertAtEnd) { 1603 return new(3) InsertElementInst(Vec, NewElt, Idx, NameStr, InsertAtEnd); 1604 } 1605 1606 /// isValidOperands - Return true if an insertelement instruction can be 1607 /// formed with the specified operands. 1608 static bool isValidOperands(const Value *Vec, const Value *NewElt, 1609 const Value *Idx); 1610 1611 /// getType - Overload to return most specific vector type. 1612 /// 1613 VectorType *getType() const { 1614 return reinterpret_cast<VectorType*>(Instruction::getType()); 1615 } 1616 1617 /// Transparently provide more efficient getOperand methods. 1618 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 1619 1620 // Methods for support type inquiry through isa, cast, and dyn_cast: 1621 static inline bool classof(const InsertElementInst *) { return true; } 1622 static inline bool classof(const Instruction *I) { 1623 return I->getOpcode() == Instruction::InsertElement; 1624 } 1625 static inline bool classof(const Value *V) { 1626 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 1627 } 1628 }; 1629 1630 template <> 1631 struct OperandTraits<InsertElementInst> : 1632 public FixedNumOperandTraits<InsertElementInst, 3> { 1633 }; 1634 1635 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertElementInst, Value) 1636 1637 //===----------------------------------------------------------------------===// 1638 // ShuffleVectorInst Class 1639 //===----------------------------------------------------------------------===// 1640 1641 /// ShuffleVectorInst - This instruction constructs a fixed permutation of two 1642 /// input vectors. 1643 /// 1644 class ShuffleVectorInst : public Instruction { 1645 protected: 1646 virtual ShuffleVectorInst *clone_impl() const; 1647 1648 public: 1649 // allocate space for exactly three operands 1650 void *operator new(size_t s) { 1651 return User::operator new(s, 3); 1652 } 1653 ShuffleVectorInst(Value *V1, Value *V2, Value *Mask, 1654 const Twine &NameStr = "", 1655 Instruction *InsertBefor = 0); 1656 ShuffleVectorInst(Value *V1, Value *V2, Value *Mask, 1657 const Twine &NameStr, BasicBlock *InsertAtEnd); 1658 1659 /// isValidOperands - Return true if a shufflevector instruction can be 1660 /// formed with the specified operands. 1661 static bool isValidOperands(const Value *V1, const Value *V2, 1662 const Value *Mask); 1663 1664 /// getType - Overload to return most specific vector type. 1665 /// 1666 VectorType *getType() const { 1667 return reinterpret_cast<VectorType*>(Instruction::getType()); 1668 } 1669 1670 /// Transparently provide more efficient getOperand methods. 1671 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 1672 1673 Constant *getMask() const { 1674 return reinterpret_cast<Constant*>(getOperand(2)); 1675 } 1676 1677 /// getMaskValue - Return the index from the shuffle mask for the specified 1678 /// output result. This is either -1 if the element is undef or a number less 1679 /// than 2*numelements. 1680 static int getMaskValue(Constant *Mask, unsigned i); 1681 1682 int getMaskValue(unsigned i) const { 1683 return getMaskValue(getMask(), i); 1684 } 1685 1686 /// getShuffleMask - Return the full mask for this instruction, where each 1687 /// element is the element number and undef's are returned as -1. 1688 static void getShuffleMask(Constant *Mask, SmallVectorImpl<int> &Result); 1689 1690 void getShuffleMask(SmallVectorImpl<int> &Result) const { 1691 return getShuffleMask(getMask(), Result); 1692 } 1693 1694 SmallVector<int, 16> getShuffleMask() const { 1695 SmallVector<int, 16> Mask; 1696 getShuffleMask(Mask); 1697 return Mask; 1698 } 1699 1700 1701 // Methods for support type inquiry through isa, cast, and dyn_cast: 1702 static inline bool classof(const ShuffleVectorInst *) { return true; } 1703 static inline bool classof(const Instruction *I) { 1704 return I->getOpcode() == Instruction::ShuffleVector; 1705 } 1706 static inline bool classof(const Value *V) { 1707 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 1708 } 1709 }; 1710 1711 template <> 1712 struct OperandTraits<ShuffleVectorInst> : 1713 public FixedNumOperandTraits<ShuffleVectorInst, 3> { 1714 }; 1715 1716 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ShuffleVectorInst, Value) 1717 1718 //===----------------------------------------------------------------------===// 1719 // ExtractValueInst Class 1720 //===----------------------------------------------------------------------===// 1721 1722 /// ExtractValueInst - This instruction extracts a struct member or array 1723 /// element value from an aggregate value. 1724 /// 1725 class ExtractValueInst : public UnaryInstruction { 1726 SmallVector<unsigned, 4> Indices; 1727 1728 ExtractValueInst(const ExtractValueInst &EVI); 1729 void init(ArrayRef<unsigned> Idxs, const Twine &NameStr); 1730 1731 /// Constructors - Create a extractvalue instruction with a base aggregate 1732 /// value and a list of indices. The first ctor can optionally insert before 1733 /// an existing instruction, the second appends the new instruction to the 1734 /// specified BasicBlock. 1735 inline ExtractValueInst(Value *Agg, 1736 ArrayRef<unsigned> Idxs, 1737 const Twine &NameStr, 1738 Instruction *InsertBefore); 1739 inline ExtractValueInst(Value *Agg, 1740 ArrayRef<unsigned> Idxs, 1741 const Twine &NameStr, BasicBlock *InsertAtEnd); 1742 1743 // allocate space for exactly one operand 1744 void *operator new(size_t s) { 1745 return User::operator new(s, 1); 1746 } 1747 protected: 1748 virtual ExtractValueInst *clone_impl() const; 1749 1750 public: 1751 static ExtractValueInst *Create(Value *Agg, 1752 ArrayRef<unsigned> Idxs, 1753 const Twine &NameStr = "", 1754 Instruction *InsertBefore = 0) { 1755 return new 1756 ExtractValueInst(Agg, Idxs, NameStr, InsertBefore); 1757 } 1758 static ExtractValueInst *Create(Value *Agg, 1759 ArrayRef<unsigned> Idxs, 1760 const Twine &NameStr, 1761 BasicBlock *InsertAtEnd) { 1762 return new ExtractValueInst(Agg, Idxs, NameStr, InsertAtEnd); 1763 } 1764 1765 /// getIndexedType - Returns the type of the element that would be extracted 1766 /// with an extractvalue instruction with the specified parameters. 1767 /// 1768 /// Null is returned if the indices are invalid for the specified type. 1769 static Type *getIndexedType(Type *Agg, ArrayRef<unsigned> Idxs); 1770 1771 typedef const unsigned* idx_iterator; 1772 inline idx_iterator idx_begin() const { return Indices.begin(); } 1773 inline idx_iterator idx_end() const { return Indices.end(); } 1774 1775 Value *getAggregateOperand() { 1776 return getOperand(0); 1777 } 1778 const Value *getAggregateOperand() const { 1779 return getOperand(0); 1780 } 1781 static unsigned getAggregateOperandIndex() { 1782 return 0U; // get index for modifying correct operand 1783 } 1784 1785 ArrayRef<unsigned> getIndices() const { 1786 return Indices; 1787 } 1788 1789 unsigned getNumIndices() const { 1790 return (unsigned)Indices.size(); 1791 } 1792 1793 bool hasIndices() const { 1794 return true; 1795 } 1796 1797 // Methods for support type inquiry through isa, cast, and dyn_cast: 1798 static inline bool classof(const ExtractValueInst *) { return true; } 1799 static inline bool classof(const Instruction *I) { 1800 return I->getOpcode() == Instruction::ExtractValue; 1801 } 1802 static inline bool classof(const Value *V) { 1803 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 1804 } 1805 }; 1806 1807 ExtractValueInst::ExtractValueInst(Value *Agg, 1808 ArrayRef<unsigned> Idxs, 1809 const Twine &NameStr, 1810 Instruction *InsertBefore) 1811 : UnaryInstruction(checkGEPType(getIndexedType(Agg->getType(), Idxs)), 1812 ExtractValue, Agg, InsertBefore) { 1813 init(Idxs, NameStr); 1814 } 1815 ExtractValueInst::ExtractValueInst(Value *Agg, 1816 ArrayRef<unsigned> Idxs, 1817 const Twine &NameStr, 1818 BasicBlock *InsertAtEnd) 1819 : UnaryInstruction(checkGEPType(getIndexedType(Agg->getType(), Idxs)), 1820 ExtractValue, Agg, InsertAtEnd) { 1821 init(Idxs, NameStr); 1822 } 1823 1824 1825 //===----------------------------------------------------------------------===// 1826 // InsertValueInst Class 1827 //===----------------------------------------------------------------------===// 1828 1829 /// InsertValueInst - This instruction inserts a struct field of array element 1830 /// value into an aggregate value. 1831 /// 1832 class InsertValueInst : public Instruction { 1833 SmallVector<unsigned, 4> Indices; 1834 1835 void *operator new(size_t, unsigned); // Do not implement 1836 InsertValueInst(const InsertValueInst &IVI); 1837 void init(Value *Agg, Value *Val, ArrayRef<unsigned> Idxs, 1838 const Twine &NameStr); 1839 1840 /// Constructors - Create a insertvalue instruction with a base aggregate 1841 /// value, a value to insert, and a list of indices. The first ctor can 1842 /// optionally insert before an existing instruction, the second appends 1843 /// the new instruction to the specified BasicBlock. 1844 inline InsertValueInst(Value *Agg, Value *Val, 1845 ArrayRef<unsigned> Idxs, 1846 const Twine &NameStr, 1847 Instruction *InsertBefore); 1848 inline InsertValueInst(Value *Agg, Value *Val, 1849 ArrayRef<unsigned> Idxs, 1850 const Twine &NameStr, BasicBlock *InsertAtEnd); 1851 1852 /// Constructors - These two constructors are convenience methods because one 1853 /// and two index insertvalue instructions are so common. 1854 InsertValueInst(Value *Agg, Value *Val, 1855 unsigned Idx, const Twine &NameStr = "", 1856 Instruction *InsertBefore = 0); 1857 InsertValueInst(Value *Agg, Value *Val, unsigned Idx, 1858 const Twine &NameStr, BasicBlock *InsertAtEnd); 1859 protected: 1860 virtual InsertValueInst *clone_impl() const; 1861 public: 1862 // allocate space for exactly two operands 1863 void *operator new(size_t s) { 1864 return User::operator new(s, 2); 1865 } 1866 1867 static InsertValueInst *Create(Value *Agg, Value *Val, 1868 ArrayRef<unsigned> Idxs, 1869 const Twine &NameStr = "", 1870 Instruction *InsertBefore = 0) { 1871 return new InsertValueInst(Agg, Val, Idxs, NameStr, InsertBefore); 1872 } 1873 static InsertValueInst *Create(Value *Agg, Value *Val, 1874 ArrayRef<unsigned> Idxs, 1875 const Twine &NameStr, 1876 BasicBlock *InsertAtEnd) { 1877 return new InsertValueInst(Agg, Val, Idxs, NameStr, InsertAtEnd); 1878 } 1879 1880 /// Transparently provide more efficient getOperand methods. 1881 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 1882 1883 typedef const unsigned* idx_iterator; 1884 inline idx_iterator idx_begin() const { return Indices.begin(); } 1885 inline idx_iterator idx_end() const { return Indices.end(); } 1886 1887 Value *getAggregateOperand() { 1888 return getOperand(0); 1889 } 1890 const Value *getAggregateOperand() const { 1891 return getOperand(0); 1892 } 1893 static unsigned getAggregateOperandIndex() { 1894 return 0U; // get index for modifying correct operand 1895 } 1896 1897 Value *getInsertedValueOperand() { 1898 return getOperand(1); 1899 } 1900 const Value *getInsertedValueOperand() const { 1901 return getOperand(1); 1902 } 1903 static unsigned getInsertedValueOperandIndex() { 1904 return 1U; // get index for modifying correct operand 1905 } 1906 1907 ArrayRef<unsigned> getIndices() const { 1908 return Indices; 1909 } 1910 1911 unsigned getNumIndices() const { 1912 return (unsigned)Indices.size(); 1913 } 1914 1915 bool hasIndices() const { 1916 return true; 1917 } 1918 1919 // Methods for support type inquiry through isa, cast, and dyn_cast: 1920 static inline bool classof(const InsertValueInst *) { return true; } 1921 static inline bool classof(const Instruction *I) { 1922 return I->getOpcode() == Instruction::InsertValue; 1923 } 1924 static inline bool classof(const Value *V) { 1925 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 1926 } 1927 }; 1928 1929 template <> 1930 struct OperandTraits<InsertValueInst> : 1931 public FixedNumOperandTraits<InsertValueInst, 2> { 1932 }; 1933 1934 InsertValueInst::InsertValueInst(Value *Agg, 1935 Value *Val, 1936 ArrayRef<unsigned> Idxs, 1937 const Twine &NameStr, 1938 Instruction *InsertBefore) 1939 : Instruction(Agg->getType(), InsertValue, 1940 OperandTraits<InsertValueInst>::op_begin(this), 1941 2, InsertBefore) { 1942 init(Agg, Val, Idxs, NameStr); 1943 } 1944 InsertValueInst::InsertValueInst(Value *Agg, 1945 Value *Val, 1946 ArrayRef<unsigned> Idxs, 1947 const Twine &NameStr, 1948 BasicBlock *InsertAtEnd) 1949 : Instruction(Agg->getType(), InsertValue, 1950 OperandTraits<InsertValueInst>::op_begin(this), 1951 2, InsertAtEnd) { 1952 init(Agg, Val, Idxs, NameStr); 1953 } 1954 1955 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertValueInst, Value) 1956 1957 //===----------------------------------------------------------------------===// 1958 // PHINode Class 1959 //===----------------------------------------------------------------------===// 1960 1961 // PHINode - The PHINode class is used to represent the magical mystical PHI 1962 // node, that can not exist in nature, but can be synthesized in a computer 1963 // scientist's overactive imagination. 1964 // 1965 class PHINode : public Instruction { 1966 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 1967 /// ReservedSpace - The number of operands actually allocated. NumOperands is 1968 /// the number actually in use. 1969 unsigned ReservedSpace; 1970 PHINode(const PHINode &PN); 1971 // allocate space for exactly zero operands 1972 void *operator new(size_t s) { 1973 return User::operator new(s, 0); 1974 } 1975 explicit PHINode(Type *Ty, unsigned NumReservedValues, 1976 const Twine &NameStr = "", Instruction *InsertBefore = 0) 1977 : Instruction(Ty, Instruction::PHI, 0, 0, InsertBefore), 1978 ReservedSpace(NumReservedValues) { 1979 setName(NameStr); 1980 OperandList = allocHungoffUses(ReservedSpace); 1981 } 1982 1983 PHINode(Type *Ty, unsigned NumReservedValues, const Twine &NameStr, 1984 BasicBlock *InsertAtEnd) 1985 : Instruction(Ty, Instruction::PHI, 0, 0, InsertAtEnd), 1986 ReservedSpace(NumReservedValues) { 1987 setName(NameStr); 1988 OperandList = allocHungoffUses(ReservedSpace); 1989 } 1990 protected: 1991 // allocHungoffUses - this is more complicated than the generic 1992 // User::allocHungoffUses, because we have to allocate Uses for the incoming 1993 // values and pointers to the incoming blocks, all in one allocation. 1994 Use *allocHungoffUses(unsigned) const; 1995 1996 virtual PHINode *clone_impl() const; 1997 public: 1998 /// Constructors - NumReservedValues is a hint for the number of incoming 1999 /// edges that this phi node will have (use 0 if you really have no idea). 2000 static PHINode *Create(Type *Ty, unsigned NumReservedValues, 2001 const Twine &NameStr = "", 2002 Instruction *InsertBefore = 0) { 2003 return new PHINode(Ty, NumReservedValues, NameStr, InsertBefore); 2004 } 2005 static PHINode *Create(Type *Ty, unsigned NumReservedValues, 2006 const Twine &NameStr, BasicBlock *InsertAtEnd) { 2007 return new PHINode(Ty, NumReservedValues, NameStr, InsertAtEnd); 2008 } 2009 ~PHINode(); 2010 2011 /// Provide fast operand accessors 2012 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 2013 2014 // Block iterator interface. This provides access to the list of incoming 2015 // basic blocks, which parallels the list of incoming values. 2016 2017 typedef BasicBlock **block_iterator; 2018 typedef BasicBlock * const *const_block_iterator; 2019 2020 block_iterator block_begin() { 2021 Use::UserRef *ref = 2022 reinterpret_cast<Use::UserRef*>(op_begin() + ReservedSpace); 2023 return reinterpret_cast<block_iterator>(ref + 1); 2024 } 2025 2026 const_block_iterator block_begin() const { 2027 const Use::UserRef *ref = 2028 reinterpret_cast<const Use::UserRef*>(op_begin() + ReservedSpace); 2029 return reinterpret_cast<const_block_iterator>(ref + 1); 2030 } 2031 2032 block_iterator block_end() { 2033 return block_begin() + getNumOperands(); 2034 } 2035 2036 const_block_iterator block_end() const { 2037 return block_begin() + getNumOperands(); 2038 } 2039 2040 /// getNumIncomingValues - Return the number of incoming edges 2041 /// 2042 unsigned getNumIncomingValues() const { return getNumOperands(); } 2043 2044 /// getIncomingValue - Return incoming value number x 2045 /// 2046 Value *getIncomingValue(unsigned i) const { 2047 return getOperand(i); 2048 } 2049 void setIncomingValue(unsigned i, Value *V) { 2050 setOperand(i, V); 2051 } 2052 static unsigned getOperandNumForIncomingValue(unsigned i) { 2053 return i; 2054 } 2055 static unsigned getIncomingValueNumForOperand(unsigned i) { 2056 return i; 2057 } 2058 2059 /// getIncomingBlock - Return incoming basic block number @p i. 2060 /// 2061 BasicBlock *getIncomingBlock(unsigned i) const { 2062 return block_begin()[i]; 2063 } 2064 2065 /// getIncomingBlock - Return incoming basic block corresponding 2066 /// to an operand of the PHI. 2067 /// 2068 BasicBlock *getIncomingBlock(const Use &U) const { 2069 assert(this == U.getUser() && "Iterator doesn't point to PHI's Uses?"); 2070 return getIncomingBlock(unsigned(&U - op_begin())); 2071 } 2072 2073 /// getIncomingBlock - Return incoming basic block corresponding 2074 /// to value use iterator. 2075 /// 2076 template <typename U> 2077 BasicBlock *getIncomingBlock(value_use_iterator<U> I) const { 2078 return getIncomingBlock(I.getUse()); 2079 } 2080 2081 void setIncomingBlock(unsigned i, BasicBlock *BB) { 2082 block_begin()[i] = BB; 2083 } 2084 2085 /// addIncoming - Add an incoming value to the end of the PHI list 2086 /// 2087 void addIncoming(Value *V, BasicBlock *BB) { 2088 assert(V && "PHI node got a null value!"); 2089 assert(BB && "PHI node got a null basic block!"); 2090 assert(getType() == V->getType() && 2091 "All operands to PHI node must be the same type as the PHI node!"); 2092 if (NumOperands == ReservedSpace) 2093 growOperands(); // Get more space! 2094 // Initialize some new operands. 2095 ++NumOperands; 2096 setIncomingValue(NumOperands - 1, V); 2097 setIncomingBlock(NumOperands - 1, BB); 2098 } 2099 2100 /// removeIncomingValue - Remove an incoming value. This is useful if a 2101 /// predecessor basic block is deleted. The value removed is returned. 2102 /// 2103 /// If the last incoming value for a PHI node is removed (and DeletePHIIfEmpty 2104 /// is true), the PHI node is destroyed and any uses of it are replaced with 2105 /// dummy values. The only time there should be zero incoming values to a PHI 2106 /// node is when the block is dead, so this strategy is sound. 2107 /// 2108 Value *removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty = true); 2109 2110 Value *removeIncomingValue(const BasicBlock *BB, bool DeletePHIIfEmpty=true) { 2111 int Idx = getBasicBlockIndex(BB); 2112 assert(Idx >= 0 && "Invalid basic block argument to remove!"); 2113 return removeIncomingValue(Idx, DeletePHIIfEmpty); 2114 } 2115 2116 /// getBasicBlockIndex - Return the first index of the specified basic 2117 /// block in the value list for this PHI. Returns -1 if no instance. 2118 /// 2119 int getBasicBlockIndex(const BasicBlock *BB) const { 2120 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) 2121 if (block_begin()[i] == BB) 2122 return i; 2123 return -1; 2124 } 2125 2126 Value *getIncomingValueForBlock(const BasicBlock *BB) const { 2127 int Idx = getBasicBlockIndex(BB); 2128 assert(Idx >= 0 && "Invalid basic block argument!"); 2129 return getIncomingValue(Idx); 2130 } 2131 2132 /// hasConstantValue - If the specified PHI node always merges together the 2133 /// same value, return the value, otherwise return null. 2134 Value *hasConstantValue() const; 2135 2136 /// Methods for support type inquiry through isa, cast, and dyn_cast: 2137 static inline bool classof(const PHINode *) { return true; } 2138 static inline bool classof(const Instruction *I) { 2139 return I->getOpcode() == Instruction::PHI; 2140 } 2141 static inline bool classof(const Value *V) { 2142 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 2143 } 2144 private: 2145 void growOperands(); 2146 }; 2147 2148 template <> 2149 struct OperandTraits<PHINode> : public HungoffOperandTraits<2> { 2150 }; 2151 2152 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(PHINode, Value) 2153 2154 //===----------------------------------------------------------------------===// 2155 // LandingPadInst Class 2156 //===----------------------------------------------------------------------===// 2157 2158 //===--------------------------------------------------------------------------- 2159 /// LandingPadInst - The landingpad instruction holds all of the information 2160 /// necessary to generate correct exception handling. The landingpad instruction 2161 /// cannot be moved from the top of a landing pad block, which itself is 2162 /// accessible only from the 'unwind' edge of an invoke. This uses the 2163 /// SubclassData field in Value to store whether or not the landingpad is a 2164 /// cleanup. 2165 /// 2166 class LandingPadInst : public Instruction { 2167 /// ReservedSpace - The number of operands actually allocated. NumOperands is 2168 /// the number actually in use. 2169 unsigned ReservedSpace; 2170 LandingPadInst(const LandingPadInst &LP); 2171 public: 2172 enum ClauseType { Catch, Filter }; 2173 private: 2174 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 2175 // Allocate space for exactly zero operands. 2176 void *operator new(size_t s) { 2177 return User::operator new(s, 0); 2178 } 2179 void growOperands(unsigned Size); 2180 void init(Value *PersFn, unsigned NumReservedValues, const Twine &NameStr); 2181 2182 explicit LandingPadInst(Type *RetTy, Value *PersonalityFn, 2183 unsigned NumReservedValues, const Twine &NameStr, 2184 Instruction *InsertBefore); 2185 explicit LandingPadInst(Type *RetTy, Value *PersonalityFn, 2186 unsigned NumReservedValues, const Twine &NameStr, 2187 BasicBlock *InsertAtEnd); 2188 protected: 2189 virtual LandingPadInst *clone_impl() const; 2190 public: 2191 /// Constructors - NumReservedClauses is a hint for the number of incoming 2192 /// clauses that this landingpad will have (use 0 if you really have no idea). 2193 static LandingPadInst *Create(Type *RetTy, Value *PersonalityFn, 2194 unsigned NumReservedClauses, 2195 const Twine &NameStr = "", 2196 Instruction *InsertBefore = 0); 2197 static LandingPadInst *Create(Type *RetTy, Value *PersonalityFn, 2198 unsigned NumReservedClauses, 2199 const Twine &NameStr, BasicBlock *InsertAtEnd); 2200 ~LandingPadInst(); 2201 2202 /// Provide fast operand accessors 2203 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 2204 2205 /// getPersonalityFn - Get the personality function associated with this 2206 /// landing pad. 2207 Value *getPersonalityFn() const { return getOperand(0); } 2208 2209 /// isCleanup - Return 'true' if this landingpad instruction is a 2210 /// cleanup. I.e., it should be run when unwinding even if its landing pad 2211 /// doesn't catch the exception. 2212 bool isCleanup() const { return getSubclassDataFromInstruction() & 1; } 2213 2214 /// setCleanup - Indicate that this landingpad instruction is a cleanup. 2215 void setCleanup(bool V) { 2216 setInstructionSubclassData((getSubclassDataFromInstruction() & ~1) | 2217 (V ? 1 : 0)); 2218 } 2219 2220 /// addClause - Add a catch or filter clause to the landing pad. 2221 void addClause(Value *ClauseVal); 2222 2223 /// getClause - Get the value of the clause at index Idx. Use isCatch/isFilter 2224 /// to determine what type of clause this is. 2225 Value *getClause(unsigned Idx) const { return OperandList[Idx + 1]; } 2226 2227 /// isCatch - Return 'true' if the clause and index Idx is a catch clause. 2228 bool isCatch(unsigned Idx) const { 2229 return !isa<ArrayType>(OperandList[Idx + 1]->getType()); 2230 } 2231 2232 /// isFilter - Return 'true' if the clause and index Idx is a filter clause. 2233 bool isFilter(unsigned Idx) const { 2234 return isa<ArrayType>(OperandList[Idx + 1]->getType()); 2235 } 2236 2237 /// getNumClauses - Get the number of clauses for this landing pad. 2238 unsigned getNumClauses() const { return getNumOperands() - 1; } 2239 2240 /// reserveClauses - Grow the size of the operand list to accomodate the new 2241 /// number of clauses. 2242 void reserveClauses(unsigned Size) { growOperands(Size); } 2243 2244 // Methods for support type inquiry through isa, cast, and dyn_cast: 2245 static inline bool classof(const LandingPadInst *) { return true; } 2246 static inline bool classof(const Instruction *I) { 2247 return I->getOpcode() == Instruction::LandingPad; 2248 } 2249 static inline bool classof(const Value *V) { 2250 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 2251 } 2252 }; 2253 2254 template <> 2255 struct OperandTraits<LandingPadInst> : public HungoffOperandTraits<2> { 2256 }; 2257 2258 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(LandingPadInst, Value) 2259 2260 //===----------------------------------------------------------------------===// 2261 // ReturnInst Class 2262 //===----------------------------------------------------------------------===// 2263 2264 //===--------------------------------------------------------------------------- 2265 /// ReturnInst - Return a value (possibly void), from a function. Execution 2266 /// does not continue in this function any longer. 2267 /// 2268 class ReturnInst : public TerminatorInst { 2269 ReturnInst(const ReturnInst &RI); 2270 2271 private: 2272 // ReturnInst constructors: 2273 // ReturnInst() - 'ret void' instruction 2274 // ReturnInst( null) - 'ret void' instruction 2275 // ReturnInst(Value* X) - 'ret X' instruction 2276 // ReturnInst( null, Inst *I) - 'ret void' instruction, insert before I 2277 // ReturnInst(Value* X, Inst *I) - 'ret X' instruction, insert before I 2278 // ReturnInst( null, BB *B) - 'ret void' instruction, insert @ end of B 2279 // ReturnInst(Value* X, BB *B) - 'ret X' instruction, insert @ end of B 2280 // 2281 // NOTE: If the Value* passed is of type void then the constructor behaves as 2282 // if it was passed NULL. 2283 explicit ReturnInst(LLVMContext &C, Value *retVal = 0, 2284 Instruction *InsertBefore = 0); 2285 ReturnInst(LLVMContext &C, Value *retVal, BasicBlock *InsertAtEnd); 2286 explicit ReturnInst(LLVMContext &C, BasicBlock *InsertAtEnd); 2287 protected: 2288 virtual ReturnInst *clone_impl() const; 2289 public: 2290 static ReturnInst* Create(LLVMContext &C, Value *retVal = 0, 2291 Instruction *InsertBefore = 0) { 2292 return new(!!retVal) ReturnInst(C, retVal, InsertBefore); 2293 } 2294 static ReturnInst* Create(LLVMContext &C, Value *retVal, 2295 BasicBlock *InsertAtEnd) { 2296 return new(!!retVal) ReturnInst(C, retVal, InsertAtEnd); 2297 } 2298 static ReturnInst* Create(LLVMContext &C, BasicBlock *InsertAtEnd) { 2299 return new(0) ReturnInst(C, InsertAtEnd); 2300 } 2301 virtual ~ReturnInst(); 2302 2303 /// Provide fast operand accessors 2304 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 2305 2306 /// Convenience accessor. Returns null if there is no return value. 2307 Value *getReturnValue() const { 2308 return getNumOperands() != 0 ? getOperand(0) : 0; 2309 } 2310 2311 unsigned getNumSuccessors() const { return 0; } 2312 2313 // Methods for support type inquiry through isa, cast, and dyn_cast: 2314 static inline bool classof(const ReturnInst *) { return true; } 2315 static inline bool classof(const Instruction *I) { 2316 return (I->getOpcode() == Instruction::Ret); 2317 } 2318 static inline bool classof(const Value *V) { 2319 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 2320 } 2321 private: 2322 virtual BasicBlock *getSuccessorV(unsigned idx) const; 2323 virtual unsigned getNumSuccessorsV() const; 2324 virtual void setSuccessorV(unsigned idx, BasicBlock *B); 2325 }; 2326 2327 template <> 2328 struct OperandTraits<ReturnInst> : public VariadicOperandTraits<ReturnInst> { 2329 }; 2330 2331 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ReturnInst, Value) 2332 2333 //===----------------------------------------------------------------------===// 2334 // BranchInst Class 2335 //===----------------------------------------------------------------------===// 2336 2337 //===--------------------------------------------------------------------------- 2338 /// BranchInst - Conditional or Unconditional Branch instruction. 2339 /// 2340 class BranchInst : public TerminatorInst { 2341 /// Ops list - Branches are strange. The operands are ordered: 2342 /// [Cond, FalseDest,] TrueDest. This makes some accessors faster because 2343 /// they don't have to check for cond/uncond branchness. These are mostly 2344 /// accessed relative from op_end(). 2345 BranchInst(const BranchInst &BI); 2346 void AssertOK(); 2347 // BranchInst constructors (where {B, T, F} are blocks, and C is a condition): 2348 // BranchInst(BB *B) - 'br B' 2349 // BranchInst(BB* T, BB *F, Value *C) - 'br C, T, F' 2350 // BranchInst(BB* B, Inst *I) - 'br B' insert before I 2351 // BranchInst(BB* T, BB *F, Value *C, Inst *I) - 'br C, T, F', insert before I 2352 // BranchInst(BB* B, BB *I) - 'br B' insert at end 2353 // BranchInst(BB* T, BB *F, Value *C, BB *I) - 'br C, T, F', insert at end 2354 explicit BranchInst(BasicBlock *IfTrue, Instruction *InsertBefore = 0); 2355 BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *Cond, 2356 Instruction *InsertBefore = 0); 2357 BranchInst(BasicBlock *IfTrue, BasicBlock *InsertAtEnd); 2358 BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *Cond, 2359 BasicBlock *InsertAtEnd); 2360 protected: 2361 virtual BranchInst *clone_impl() const; 2362 public: 2363 static BranchInst *Create(BasicBlock *IfTrue, Instruction *InsertBefore = 0) { 2364 return new(1) BranchInst(IfTrue, InsertBefore); 2365 } 2366 static BranchInst *Create(BasicBlock *IfTrue, BasicBlock *IfFalse, 2367 Value *Cond, Instruction *InsertBefore = 0) { 2368 return new(3) BranchInst(IfTrue, IfFalse, Cond, InsertBefore); 2369 } 2370 static BranchInst *Create(BasicBlock *IfTrue, BasicBlock *InsertAtEnd) { 2371 return new(1) BranchInst(IfTrue, InsertAtEnd); 2372 } 2373 static BranchInst *Create(BasicBlock *IfTrue, BasicBlock *IfFalse, 2374 Value *Cond, BasicBlock *InsertAtEnd) { 2375 return new(3) BranchInst(IfTrue, IfFalse, Cond, InsertAtEnd); 2376 } 2377 2378 /// Transparently provide more efficient getOperand methods. 2379 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 2380 2381 bool isUnconditional() const { return getNumOperands() == 1; } 2382 bool isConditional() const { return getNumOperands() == 3; } 2383 2384 Value *getCondition() const { 2385 assert(isConditional() && "Cannot get condition of an uncond branch!"); 2386 return Op<-3>(); 2387 } 2388 2389 void setCondition(Value *V) { 2390 assert(isConditional() && "Cannot set condition of unconditional branch!"); 2391 Op<-3>() = V; 2392 } 2393 2394 unsigned getNumSuccessors() const { return 1+isConditional(); } 2395 2396 BasicBlock *getSuccessor(unsigned i) const { 2397 assert(i < getNumSuccessors() && "Successor # out of range for Branch!"); 2398 return cast_or_null<BasicBlock>((&Op<-1>() - i)->get()); 2399 } 2400 2401 void setSuccessor(unsigned idx, BasicBlock *NewSucc) { 2402 assert(idx < getNumSuccessors() && "Successor # out of range for Branch!"); 2403 *(&Op<-1>() - idx) = (Value*)NewSucc; 2404 } 2405 2406 /// \brief Swap the successors of this branch instruction. 2407 /// 2408 /// Swaps the successors of the branch instruction. This also swaps any 2409 /// branch weight metadata associated with the instruction so that it 2410 /// continues to map correctly to each operand. 2411 void swapSuccessors(); 2412 2413 // Methods for support type inquiry through isa, cast, and dyn_cast: 2414 static inline bool classof(const BranchInst *) { return true; } 2415 static inline bool classof(const Instruction *I) { 2416 return (I->getOpcode() == Instruction::Br); 2417 } 2418 static inline bool classof(const Value *V) { 2419 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 2420 } 2421 private: 2422 virtual BasicBlock *getSuccessorV(unsigned idx) const; 2423 virtual unsigned getNumSuccessorsV() const; 2424 virtual void setSuccessorV(unsigned idx, BasicBlock *B); 2425 }; 2426 2427 template <> 2428 struct OperandTraits<BranchInst> : public VariadicOperandTraits<BranchInst, 1> { 2429 }; 2430 2431 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(BranchInst, Value) 2432 2433 //===----------------------------------------------------------------------===// 2434 // SwitchInst Class 2435 //===----------------------------------------------------------------------===// 2436 2437 //===--------------------------------------------------------------------------- 2438 /// SwitchInst - Multiway switch 2439 /// 2440 class SwitchInst : public TerminatorInst { 2441 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 2442 unsigned ReservedSpace; 2443 // Operand[0] = Value to switch on 2444 // Operand[1] = Default basic block destination 2445 // Operand[2n ] = Value to match 2446 // Operand[2n+1] = BasicBlock to go to on match 2447 SwitchInst(const SwitchInst &SI); 2448 void init(Value *Value, BasicBlock *Default, unsigned NumReserved); 2449 void growOperands(); 2450 // allocate space for exactly zero operands 2451 void *operator new(size_t s) { 2452 return User::operator new(s, 0); 2453 } 2454 /// SwitchInst ctor - Create a new switch instruction, specifying a value to 2455 /// switch on and a default destination. The number of additional cases can 2456 /// be specified here to make memory allocation more efficient. This 2457 /// constructor can also autoinsert before another instruction. 2458 SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases, 2459 Instruction *InsertBefore); 2460 2461 /// SwitchInst ctor - Create a new switch instruction, specifying a value to 2462 /// switch on and a default destination. The number of additional cases can 2463 /// be specified here to make memory allocation more efficient. This 2464 /// constructor also autoinserts at the end of the specified BasicBlock. 2465 SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases, 2466 BasicBlock *InsertAtEnd); 2467 protected: 2468 virtual SwitchInst *clone_impl() const; 2469 public: 2470 2471 // -2 2472 static const unsigned DefaultPseudoIndex = static_cast<unsigned>(~0L-1); 2473 2474 template <class SwitchInstTy, class ConstantIntTy, class BasicBlockTy> 2475 class CaseIteratorT { 2476 protected: 2477 2478 SwitchInstTy *SI; 2479 unsigned Index; 2480 2481 public: 2482 2483 typedef CaseIteratorT<SwitchInstTy, ConstantIntTy, BasicBlockTy> Self; 2484 2485 /// Initializes case iterator for given SwitchInst and for given 2486 /// case number. 2487 CaseIteratorT(SwitchInstTy *SI, unsigned CaseNum) { 2488 this->SI = SI; 2489 Index = CaseNum; 2490 } 2491 2492 /// Initializes case iterator for given SwitchInst and for given 2493 /// TerminatorInst's successor index. 2494 static Self fromSuccessorIndex(SwitchInstTy *SI, unsigned SuccessorIndex) { 2495 assert(SuccessorIndex < SI->getNumSuccessors() && 2496 "Successor index # out of range!"); 2497 return SuccessorIndex != 0 ? 2498 Self(SI, SuccessorIndex - 1) : 2499 Self(SI, DefaultPseudoIndex); 2500 } 2501 2502 /// Resolves case value for current case. 2503 ConstantIntTy *getCaseValue() { 2504 assert(Index < SI->getNumCases() && "Index out the number of cases."); 2505 return reinterpret_cast<ConstantIntTy*>(SI->getOperand(2 + Index*2)); 2506 } 2507 2508 /// Resolves successor for current case. 2509 BasicBlockTy *getCaseSuccessor() { 2510 assert((Index < SI->getNumCases() || 2511 Index == DefaultPseudoIndex) && 2512 "Index out the number of cases."); 2513 return SI->getSuccessor(getSuccessorIndex()); 2514 } 2515 2516 /// Returns number of current case. 2517 unsigned getCaseIndex() const { return Index; } 2518 2519 /// Returns TerminatorInst's successor index for current case successor. 2520 unsigned getSuccessorIndex() const { 2521 assert((Index == DefaultPseudoIndex || Index < SI->getNumCases()) && 2522 "Index out the number of cases."); 2523 return Index != DefaultPseudoIndex ? Index + 1 : 0; 2524 } 2525 2526 Self operator++() { 2527 // Check index correctness after increment. 2528 // Note: Index == getNumCases() means end(). 2529 assert(Index+1 <= SI->getNumCases() && "Index out the number of cases."); 2530 ++Index; 2531 return *this; 2532 } 2533 Self operator++(int) { 2534 Self tmp = *this; 2535 ++(*this); 2536 return tmp; 2537 } 2538 Self operator--() { 2539 // Check index correctness after decrement. 2540 // Note: Index == getNumCases() means end(). 2541 // Also allow "-1" iterator here. That will became valid after ++. 2542 assert((Index == 0 || Index-1 <= SI->getNumCases()) && 2543 "Index out the number of cases."); 2544 --Index; 2545 return *this; 2546 } 2547 Self operator--(int) { 2548 Self tmp = *this; 2549 --(*this); 2550 return tmp; 2551 } 2552 bool operator==(const Self& RHS) const { 2553 assert(RHS.SI == SI && "Incompatible operators."); 2554 return RHS.Index == Index; 2555 } 2556 bool operator!=(const Self& RHS) const { 2557 assert(RHS.SI == SI && "Incompatible operators."); 2558 return RHS.Index != Index; 2559 } 2560 }; 2561 2562 typedef CaseIteratorT<const SwitchInst, const ConstantInt, const BasicBlock> 2563 ConstCaseIt; 2564 2565 class CaseIt : public CaseIteratorT<SwitchInst, ConstantInt, BasicBlock> { 2566 2567 typedef CaseIteratorT<SwitchInst, ConstantInt, BasicBlock> ParentTy; 2568 2569 public: 2570 2571 CaseIt(const ParentTy& Src) : ParentTy(Src) {} 2572 CaseIt(SwitchInst *SI, unsigned CaseNum) : ParentTy(SI, CaseNum) {} 2573 2574 /// Sets the new value for current case. 2575 void setValue(ConstantInt *V) { 2576 assert(Index < SI->getNumCases() && "Index out the number of cases."); 2577 SI->setOperand(2 + Index*2, reinterpret_cast<Value*>(V)); 2578 } 2579 2580 /// Sets the new successor for current case. 2581 void setSuccessor(BasicBlock *S) { 2582 SI->setSuccessor(getSuccessorIndex(), S); 2583 } 2584 }; 2585 2586 static SwitchInst *Create(Value *Value, BasicBlock *Default, 2587 unsigned NumCases, Instruction *InsertBefore = 0) { 2588 return new SwitchInst(Value, Default, NumCases, InsertBefore); 2589 } 2590 static SwitchInst *Create(Value *Value, BasicBlock *Default, 2591 unsigned NumCases, BasicBlock *InsertAtEnd) { 2592 return new SwitchInst(Value, Default, NumCases, InsertAtEnd); 2593 } 2594 2595 ~SwitchInst(); 2596 2597 /// Provide fast operand accessors 2598 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 2599 2600 // Accessor Methods for Switch stmt 2601 Value *getCondition() const { return getOperand(0); } 2602 void setCondition(Value *V) { setOperand(0, V); } 2603 2604 BasicBlock *getDefaultDest() const { 2605 return cast<BasicBlock>(getOperand(1)); 2606 } 2607 2608 void setDefaultDest(BasicBlock *DefaultCase) { 2609 setOperand(1, reinterpret_cast<Value*>(DefaultCase)); 2610 } 2611 2612 /// getNumCases - return the number of 'cases' in this switch instruction, 2613 /// except the default case 2614 unsigned getNumCases() const { 2615 return getNumOperands()/2 - 1; 2616 } 2617 2618 /// Returns a read/write iterator that points to the first 2619 /// case in SwitchInst. 2620 CaseIt case_begin() { 2621 return CaseIt(this, 0); 2622 } 2623 /// Returns a read-only iterator that points to the first 2624 /// case in the SwitchInst. 2625 ConstCaseIt case_begin() const { 2626 return ConstCaseIt(this, 0); 2627 } 2628 2629 /// Returns a read/write iterator that points one past the last 2630 /// in the SwitchInst. 2631 CaseIt case_end() { 2632 return CaseIt(this, getNumCases()); 2633 } 2634 /// Returns a read-only iterator that points one past the last 2635 /// in the SwitchInst. 2636 ConstCaseIt case_end() const { 2637 return ConstCaseIt(this, getNumCases()); 2638 } 2639 /// Returns an iterator that points to the default case. 2640 /// Note: this iterator allows to resolve successor only. Attempt 2641 /// to resolve case value causes an assertion. 2642 /// Also note, that increment and decrement also causes an assertion and 2643 /// makes iterator invalid. 2644 CaseIt case_default() { 2645 return CaseIt(this, DefaultPseudoIndex); 2646 } 2647 ConstCaseIt case_default() const { 2648 return ConstCaseIt(this, DefaultPseudoIndex); 2649 } 2650 2651 /// findCaseValue - Search all of the case values for the specified constant. 2652 /// If it is explicitly handled, return the case iterator of it, otherwise 2653 /// return default case iterator to indicate 2654 /// that it is handled by the default handler. 2655 CaseIt findCaseValue(const ConstantInt *C) { 2656 for (CaseIt i = case_begin(), e = case_end(); i != e; ++i) 2657 if (i.getCaseValue() == C) 2658 return i; 2659 return case_default(); 2660 } 2661 ConstCaseIt findCaseValue(const ConstantInt *C) const { 2662 for (ConstCaseIt i = case_begin(), e = case_end(); i != e; ++i) 2663 if (i.getCaseValue() == C) 2664 return i; 2665 return case_default(); 2666 } 2667 2668 /// findCaseDest - Finds the unique case value for a given successor. Returns 2669 /// null if the successor is not found, not unique, or is the default case. 2670 ConstantInt *findCaseDest(BasicBlock *BB) { 2671 if (BB == getDefaultDest()) return NULL; 2672 2673 ConstantInt *CI = NULL; 2674 for (CaseIt i = case_begin(), e = case_end(); i != e; ++i) { 2675 if (i.getCaseSuccessor() == BB) { 2676 if (CI) return NULL; // Multiple cases lead to BB. 2677 else CI = i.getCaseValue(); 2678 } 2679 } 2680 return CI; 2681 } 2682 2683 /// addCase - Add an entry to the switch instruction... 2684 /// Note: 2685 /// This action invalidates case_end(). Old case_end() iterator will 2686 /// point to the added case. 2687 void addCase(ConstantInt *OnVal, BasicBlock *Dest); 2688 2689 /// removeCase - This method removes the specified case and its successor 2690 /// from the switch instruction. Note that this operation may reorder the 2691 /// remaining cases at index idx and above. 2692 /// Note: 2693 /// This action invalidates iterators for all cases following the one removed, 2694 /// including the case_end() iterator. 2695 void removeCase(CaseIt i); 2696 2697 unsigned getNumSuccessors() const { return getNumOperands()/2; } 2698 BasicBlock *getSuccessor(unsigned idx) const { 2699 assert(idx < getNumSuccessors() &&"Successor idx out of range for switch!"); 2700 return cast<BasicBlock>(getOperand(idx*2+1)); 2701 } 2702 void setSuccessor(unsigned idx, BasicBlock *NewSucc) { 2703 assert(idx < getNumSuccessors() && "Successor # out of range for switch!"); 2704 setOperand(idx*2+1, (Value*)NewSucc); 2705 } 2706 2707 // Methods for support type inquiry through isa, cast, and dyn_cast: 2708 static inline bool classof(const SwitchInst *) { return true; } 2709 static inline bool classof(const Instruction *I) { 2710 return I->getOpcode() == Instruction::Switch; 2711 } 2712 static inline bool classof(const Value *V) { 2713 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 2714 } 2715 private: 2716 virtual BasicBlock *getSuccessorV(unsigned idx) const; 2717 virtual unsigned getNumSuccessorsV() const; 2718 virtual void setSuccessorV(unsigned idx, BasicBlock *B); 2719 }; 2720 2721 template <> 2722 struct OperandTraits<SwitchInst> : public HungoffOperandTraits<2> { 2723 }; 2724 2725 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(SwitchInst, Value) 2726 2727 2728 //===----------------------------------------------------------------------===// 2729 // IndirectBrInst Class 2730 //===----------------------------------------------------------------------===// 2731 2732 //===--------------------------------------------------------------------------- 2733 /// IndirectBrInst - Indirect Branch Instruction. 2734 /// 2735 class IndirectBrInst : public TerminatorInst { 2736 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 2737 unsigned ReservedSpace; 2738 // Operand[0] = Value to switch on 2739 // Operand[1] = Default basic block destination 2740 // Operand[2n ] = Value to match 2741 // Operand[2n+1] = BasicBlock to go to on match 2742 IndirectBrInst(const IndirectBrInst &IBI); 2743 void init(Value *Address, unsigned NumDests); 2744 void growOperands(); 2745 // allocate space for exactly zero operands 2746 void *operator new(size_t s) { 2747 return User::operator new(s, 0); 2748 } 2749 /// IndirectBrInst ctor - Create a new indirectbr instruction, specifying an 2750 /// Address to jump to. The number of expected destinations can be specified 2751 /// here to make memory allocation more efficient. This constructor can also 2752 /// autoinsert before another instruction. 2753 IndirectBrInst(Value *Address, unsigned NumDests, Instruction *InsertBefore); 2754 2755 /// IndirectBrInst ctor - Create a new indirectbr instruction, specifying an 2756 /// Address to jump to. The number of expected destinations can be specified 2757 /// here to make memory allocation more efficient. This constructor also 2758 /// autoinserts at the end of the specified BasicBlock. 2759 IndirectBrInst(Value *Address, unsigned NumDests, BasicBlock *InsertAtEnd); 2760 protected: 2761 virtual IndirectBrInst *clone_impl() const; 2762 public: 2763 static IndirectBrInst *Create(Value *Address, unsigned NumDests, 2764 Instruction *InsertBefore = 0) { 2765 return new IndirectBrInst(Address, NumDests, InsertBefore); 2766 } 2767 static IndirectBrInst *Create(Value *Address, unsigned NumDests, 2768 BasicBlock *InsertAtEnd) { 2769 return new IndirectBrInst(Address, NumDests, InsertAtEnd); 2770 } 2771 ~IndirectBrInst(); 2772 2773 /// Provide fast operand accessors. 2774 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 2775 2776 // Accessor Methods for IndirectBrInst instruction. 2777 Value *getAddress() { return getOperand(0); } 2778 const Value *getAddress() const { return getOperand(0); } 2779 void setAddress(Value *V) { setOperand(0, V); } 2780 2781 2782 /// getNumDestinations - return the number of possible destinations in this 2783 /// indirectbr instruction. 2784 unsigned getNumDestinations() const { return getNumOperands()-1; } 2785 2786 /// getDestination - Return the specified destination. 2787 BasicBlock *getDestination(unsigned i) { return getSuccessor(i); } 2788 const BasicBlock *getDestination(unsigned i) const { return getSuccessor(i); } 2789 2790 /// addDestination - Add a destination. 2791 /// 2792 void addDestination(BasicBlock *Dest); 2793 2794 /// removeDestination - This method removes the specified successor from the 2795 /// indirectbr instruction. 2796 void removeDestination(unsigned i); 2797 2798 unsigned getNumSuccessors() const { return getNumOperands()-1; } 2799 BasicBlock *getSuccessor(unsigned i) const { 2800 return cast<BasicBlock>(getOperand(i+1)); 2801 } 2802 void setSuccessor(unsigned i, BasicBlock *NewSucc) { 2803 setOperand(i+1, (Value*)NewSucc); 2804 } 2805 2806 // Methods for support type inquiry through isa, cast, and dyn_cast: 2807 static inline bool classof(const IndirectBrInst *) { return true; } 2808 static inline bool classof(const Instruction *I) { 2809 return I->getOpcode() == Instruction::IndirectBr; 2810 } 2811 static inline bool classof(const Value *V) { 2812 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 2813 } 2814 private: 2815 virtual BasicBlock *getSuccessorV(unsigned idx) const; 2816 virtual unsigned getNumSuccessorsV() const; 2817 virtual void setSuccessorV(unsigned idx, BasicBlock *B); 2818 }; 2819 2820 template <> 2821 struct OperandTraits<IndirectBrInst> : public HungoffOperandTraits<1> { 2822 }; 2823 2824 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(IndirectBrInst, Value) 2825 2826 2827 //===----------------------------------------------------------------------===// 2828 // InvokeInst Class 2829 //===----------------------------------------------------------------------===// 2830 2831 /// InvokeInst - Invoke instruction. The SubclassData field is used to hold the 2832 /// calling convention of the call. 2833 /// 2834 class InvokeInst : public TerminatorInst { 2835 AttrListPtr AttributeList; 2836 InvokeInst(const InvokeInst &BI); 2837 void init(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, 2838 ArrayRef<Value *> Args, const Twine &NameStr); 2839 2840 /// Construct an InvokeInst given a range of arguments. 2841 /// 2842 /// @brief Construct an InvokeInst from a range of arguments 2843 inline InvokeInst(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, 2844 ArrayRef<Value *> Args, unsigned Values, 2845 const Twine &NameStr, Instruction *InsertBefore); 2846 2847 /// Construct an InvokeInst given a range of arguments. 2848 /// 2849 /// @brief Construct an InvokeInst from a range of arguments 2850 inline InvokeInst(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, 2851 ArrayRef<Value *> Args, unsigned Values, 2852 const Twine &NameStr, BasicBlock *InsertAtEnd); 2853 protected: 2854 virtual InvokeInst *clone_impl() const; 2855 public: 2856 static InvokeInst *Create(Value *Func, 2857 BasicBlock *IfNormal, BasicBlock *IfException, 2858 ArrayRef<Value *> Args, const Twine &NameStr = "", 2859 Instruction *InsertBefore = 0) { 2860 unsigned Values = unsigned(Args.size()) + 3; 2861 return new(Values) InvokeInst(Func, IfNormal, IfException, Args, 2862 Values, NameStr, InsertBefore); 2863 } 2864 static InvokeInst *Create(Value *Func, 2865 BasicBlock *IfNormal, BasicBlock *IfException, 2866 ArrayRef<Value *> Args, const Twine &NameStr, 2867 BasicBlock *InsertAtEnd) { 2868 unsigned Values = unsigned(Args.size()) + 3; 2869 return new(Values) InvokeInst(Func, IfNormal, IfException, Args, 2870 Values, NameStr, InsertAtEnd); 2871 } 2872 2873 /// Provide fast operand accessors 2874 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 2875 2876 /// getNumArgOperands - Return the number of invoke arguments. 2877 /// 2878 unsigned getNumArgOperands() const { return getNumOperands() - 3; } 2879 2880 /// getArgOperand/setArgOperand - Return/set the i-th invoke argument. 2881 /// 2882 Value *getArgOperand(unsigned i) const { return getOperand(i); } 2883 void setArgOperand(unsigned i, Value *v) { setOperand(i, v); } 2884 2885 /// getCallingConv/setCallingConv - Get or set the calling convention of this 2886 /// function call. 2887 CallingConv::ID getCallingConv() const { 2888 return static_cast<CallingConv::ID>(getSubclassDataFromInstruction()); 2889 } 2890 void setCallingConv(CallingConv::ID CC) { 2891 setInstructionSubclassData(static_cast<unsigned>(CC)); 2892 } 2893 2894 /// getAttributes - Return the parameter attributes for this invoke. 2895 /// 2896 const AttrListPtr &getAttributes() const { return AttributeList; } 2897 2898 /// setAttributes - Set the parameter attributes for this invoke. 2899 /// 2900 void setAttributes(const AttrListPtr &Attrs) { AttributeList = Attrs; } 2901 2902 /// addAttribute - adds the attribute to the list of attributes. 2903 void addAttribute(unsigned i, Attributes attr); 2904 2905 /// removeAttribute - removes the attribute from the list of attributes. 2906 void removeAttribute(unsigned i, Attributes attr); 2907 2908 /// @brief Determine whether the call or the callee has the given attribute. 2909 bool paramHasAttr(unsigned i, Attributes attr) const; 2910 2911 /// @brief Extract the alignment for a call or parameter (0=unknown). 2912 unsigned getParamAlignment(unsigned i) const { 2913 return AttributeList.getParamAlignment(i); 2914 } 2915 2916 /// @brief Return true if the call should not be inlined. 2917 bool isNoInline() const { return paramHasAttr(~0, Attribute::NoInline); } 2918 void setIsNoInline(bool Value = true) { 2919 if (Value) addAttribute(~0, Attribute::NoInline); 2920 else removeAttribute(~0, Attribute::NoInline); 2921 } 2922 2923 /// @brief Determine if the call does not access memory. 2924 bool doesNotAccessMemory() const { 2925 return paramHasAttr(~0, Attribute::ReadNone); 2926 } 2927 void setDoesNotAccessMemory(bool NotAccessMemory = true) { 2928 if (NotAccessMemory) addAttribute(~0, Attribute::ReadNone); 2929 else removeAttribute(~0, Attribute::ReadNone); 2930 } 2931 2932 /// @brief Determine if the call does not access or only reads memory. 2933 bool onlyReadsMemory() const { 2934 return doesNotAccessMemory() || paramHasAttr(~0, Attribute::ReadOnly); 2935 } 2936 void setOnlyReadsMemory(bool OnlyReadsMemory = true) { 2937 if (OnlyReadsMemory) addAttribute(~0, Attribute::ReadOnly); 2938 else removeAttribute(~0, Attribute::ReadOnly | Attribute::ReadNone); 2939 } 2940 2941 /// @brief Determine if the call cannot return. 2942 bool doesNotReturn() const { return paramHasAttr(~0, Attribute::NoReturn); } 2943 void setDoesNotReturn(bool DoesNotReturn = true) { 2944 if (DoesNotReturn) addAttribute(~0, Attribute::NoReturn); 2945 else removeAttribute(~0, Attribute::NoReturn); 2946 } 2947 2948 /// @brief Determine if the call cannot unwind. 2949 bool doesNotThrow() const { return paramHasAttr(~0, Attribute::NoUnwind); } 2950 void setDoesNotThrow(bool DoesNotThrow = true) { 2951 if (DoesNotThrow) addAttribute(~0, Attribute::NoUnwind); 2952 else removeAttribute(~0, Attribute::NoUnwind); 2953 } 2954 2955 /// @brief Determine if the call returns a structure through first 2956 /// pointer argument. 2957 bool hasStructRetAttr() const { 2958 // Be friendly and also check the callee. 2959 return paramHasAttr(1, Attribute::StructRet); 2960 } 2961 2962 /// @brief Determine if any call argument is an aggregate passed by value. 2963 bool hasByValArgument() const { 2964 return AttributeList.hasAttrSomewhere(Attribute::ByVal); 2965 } 2966 2967 /// getCalledFunction - Return the function called, or null if this is an 2968 /// indirect function invocation. 2969 /// 2970 Function *getCalledFunction() const { 2971 return dyn_cast<Function>(Op<-3>()); 2972 } 2973 2974 /// getCalledValue - Get a pointer to the function that is invoked by this 2975 /// instruction 2976 const Value *getCalledValue() const { return Op<-3>(); } 2977 Value *getCalledValue() { return Op<-3>(); } 2978 2979 /// setCalledFunction - Set the function called. 2980 void setCalledFunction(Value* Fn) { 2981 Op<-3>() = Fn; 2982 } 2983 2984 // get*Dest - Return the destination basic blocks... 2985 BasicBlock *getNormalDest() const { 2986 return cast<BasicBlock>(Op<-2>()); 2987 } 2988 BasicBlock *getUnwindDest() const { 2989 return cast<BasicBlock>(Op<-1>()); 2990 } 2991 void setNormalDest(BasicBlock *B) { 2992 Op<-2>() = reinterpret_cast<Value*>(B); 2993 } 2994 void setUnwindDest(BasicBlock *B) { 2995 Op<-1>() = reinterpret_cast<Value*>(B); 2996 } 2997 2998 /// getLandingPadInst - Get the landingpad instruction from the landing pad 2999 /// block (the unwind destination). 3000 LandingPadInst *getLandingPadInst() const; 3001 3002 BasicBlock *getSuccessor(unsigned i) const { 3003 assert(i < 2 && "Successor # out of range for invoke!"); 3004 return i == 0 ? getNormalDest() : getUnwindDest(); 3005 } 3006 3007 void setSuccessor(unsigned idx, BasicBlock *NewSucc) { 3008 assert(idx < 2 && "Successor # out of range for invoke!"); 3009 *(&Op<-2>() + idx) = reinterpret_cast<Value*>(NewSucc); 3010 } 3011 3012 unsigned getNumSuccessors() const { return 2; } 3013 3014 // Methods for support type inquiry through isa, cast, and dyn_cast: 3015 static inline bool classof(const InvokeInst *) { return true; } 3016 static inline bool classof(const Instruction *I) { 3017 return (I->getOpcode() == Instruction::Invoke); 3018 } 3019 static inline bool classof(const Value *V) { 3020 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3021 } 3022 3023 private: 3024 virtual BasicBlock *getSuccessorV(unsigned idx) const; 3025 virtual unsigned getNumSuccessorsV() const; 3026 virtual void setSuccessorV(unsigned idx, BasicBlock *B); 3027 3028 // Shadow Instruction::setInstructionSubclassData with a private forwarding 3029 // method so that subclasses cannot accidentally use it. 3030 void setInstructionSubclassData(unsigned short D) { 3031 Instruction::setInstructionSubclassData(D); 3032 } 3033 }; 3034 3035 template <> 3036 struct OperandTraits<InvokeInst> : public VariadicOperandTraits<InvokeInst, 3> { 3037 }; 3038 3039 InvokeInst::InvokeInst(Value *Func, 3040 BasicBlock *IfNormal, BasicBlock *IfException, 3041 ArrayRef<Value *> Args, unsigned Values, 3042 const Twine &NameStr, Instruction *InsertBefore) 3043 : TerminatorInst(cast<FunctionType>(cast<PointerType>(Func->getType()) 3044 ->getElementType())->getReturnType(), 3045 Instruction::Invoke, 3046 OperandTraits<InvokeInst>::op_end(this) - Values, 3047 Values, InsertBefore) { 3048 init(Func, IfNormal, IfException, Args, NameStr); 3049 } 3050 InvokeInst::InvokeInst(Value *Func, 3051 BasicBlock *IfNormal, BasicBlock *IfException, 3052 ArrayRef<Value *> Args, unsigned Values, 3053 const Twine &NameStr, BasicBlock *InsertAtEnd) 3054 : TerminatorInst(cast<FunctionType>(cast<PointerType>(Func->getType()) 3055 ->getElementType())->getReturnType(), 3056 Instruction::Invoke, 3057 OperandTraits<InvokeInst>::op_end(this) - Values, 3058 Values, InsertAtEnd) { 3059 init(Func, IfNormal, IfException, Args, NameStr); 3060 } 3061 3062 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InvokeInst, Value) 3063 3064 //===----------------------------------------------------------------------===// 3065 // ResumeInst Class 3066 //===----------------------------------------------------------------------===// 3067 3068 //===--------------------------------------------------------------------------- 3069 /// ResumeInst - Resume the propagation of an exception. 3070 /// 3071 class ResumeInst : public TerminatorInst { 3072 ResumeInst(const ResumeInst &RI); 3073 3074 explicit ResumeInst(Value *Exn, Instruction *InsertBefore=0); 3075 ResumeInst(Value *Exn, BasicBlock *InsertAtEnd); 3076 protected: 3077 virtual ResumeInst *clone_impl() const; 3078 public: 3079 static ResumeInst *Create(Value *Exn, Instruction *InsertBefore = 0) { 3080 return new(1) ResumeInst(Exn, InsertBefore); 3081 } 3082 static ResumeInst *Create(Value *Exn, BasicBlock *InsertAtEnd) { 3083 return new(1) ResumeInst(Exn, InsertAtEnd); 3084 } 3085 3086 /// Provide fast operand accessors 3087 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 3088 3089 /// Convenience accessor. 3090 Value *getValue() const { return Op<0>(); } 3091 3092 unsigned getNumSuccessors() const { return 0; } 3093 3094 // Methods for support type inquiry through isa, cast, and dyn_cast: 3095 static inline bool classof(const ResumeInst *) { return true; } 3096 static inline bool classof(const Instruction *I) { 3097 return I->getOpcode() == Instruction::Resume; 3098 } 3099 static inline bool classof(const Value *V) { 3100 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3101 } 3102 private: 3103 virtual BasicBlock *getSuccessorV(unsigned idx) const; 3104 virtual unsigned getNumSuccessorsV() const; 3105 virtual void setSuccessorV(unsigned idx, BasicBlock *B); 3106 }; 3107 3108 template <> 3109 struct OperandTraits<ResumeInst> : 3110 public FixedNumOperandTraits<ResumeInst, 1> { 3111 }; 3112 3113 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ResumeInst, Value) 3114 3115 //===----------------------------------------------------------------------===// 3116 // UnreachableInst Class 3117 //===----------------------------------------------------------------------===// 3118 3119 //===--------------------------------------------------------------------------- 3120 /// UnreachableInst - This function has undefined behavior. In particular, the 3121 /// presence of this instruction indicates some higher level knowledge that the 3122 /// end of the block cannot be reached. 3123 /// 3124 class UnreachableInst : public TerminatorInst { 3125 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 3126 protected: 3127 virtual UnreachableInst *clone_impl() const; 3128 3129 public: 3130 // allocate space for exactly zero operands 3131 void *operator new(size_t s) { 3132 return User::operator new(s, 0); 3133 } 3134 explicit UnreachableInst(LLVMContext &C, Instruction *InsertBefore = 0); 3135 explicit UnreachableInst(LLVMContext &C, BasicBlock *InsertAtEnd); 3136 3137 unsigned getNumSuccessors() const { return 0; } 3138 3139 // Methods for support type inquiry through isa, cast, and dyn_cast: 3140 static inline bool classof(const UnreachableInst *) { return true; } 3141 static inline bool classof(const Instruction *I) { 3142 return I->getOpcode() == Instruction::Unreachable; 3143 } 3144 static inline bool classof(const Value *V) { 3145 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3146 } 3147 private: 3148 virtual BasicBlock *getSuccessorV(unsigned idx) const; 3149 virtual unsigned getNumSuccessorsV() const; 3150 virtual void setSuccessorV(unsigned idx, BasicBlock *B); 3151 }; 3152 3153 //===----------------------------------------------------------------------===// 3154 // TruncInst Class 3155 //===----------------------------------------------------------------------===// 3156 3157 /// @brief This class represents a truncation of integer types. 3158 class TruncInst : public CastInst { 3159 protected: 3160 /// @brief Clone an identical TruncInst 3161 virtual TruncInst *clone_impl() const; 3162 3163 public: 3164 /// @brief Constructor with insert-before-instruction semantics 3165 TruncInst( 3166 Value *S, ///< The value to be truncated 3167 Type *Ty, ///< The (smaller) type to truncate to 3168 const Twine &NameStr = "", ///< A name for the new instruction 3169 Instruction *InsertBefore = 0 ///< Where to insert the new instruction 3170 ); 3171 3172 /// @brief Constructor with insert-at-end-of-block semantics 3173 TruncInst( 3174 Value *S, ///< The value to be truncated 3175 Type *Ty, ///< The (smaller) type to truncate to 3176 const Twine &NameStr, ///< A name for the new instruction 3177 BasicBlock *InsertAtEnd ///< The block to insert the instruction into 3178 ); 3179 3180 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: 3181 static inline bool classof(const TruncInst *) { return true; } 3182 static inline bool classof(const Instruction *I) { 3183 return I->getOpcode() == Trunc; 3184 } 3185 static inline bool classof(const Value *V) { 3186 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3187 } 3188 }; 3189 3190 //===----------------------------------------------------------------------===// 3191 // ZExtInst Class 3192 //===----------------------------------------------------------------------===// 3193 3194 /// @brief This class represents zero extension of integer types. 3195 class ZExtInst : public CastInst { 3196 protected: 3197 /// @brief Clone an identical ZExtInst 3198 virtual ZExtInst *clone_impl() const; 3199 3200 public: 3201 /// @brief Constructor with insert-before-instruction semantics 3202 ZExtInst( 3203 Value *S, ///< The value to be zero extended 3204 Type *Ty, ///< The type to zero extend to 3205 const Twine &NameStr = "", ///< A name for the new instruction 3206 Instruction *InsertBefore = 0 ///< Where to insert the new instruction 3207 ); 3208 3209 /// @brief Constructor with insert-at-end semantics. 3210 ZExtInst( 3211 Value *S, ///< The value to be zero extended 3212 Type *Ty, ///< The type to zero extend to 3213 const Twine &NameStr, ///< A name for the new instruction 3214 BasicBlock *InsertAtEnd ///< The block to insert the instruction into 3215 ); 3216 3217 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: 3218 static inline bool classof(const ZExtInst *) { return true; } 3219 static inline bool classof(const Instruction *I) { 3220 return I->getOpcode() == ZExt; 3221 } 3222 static inline bool classof(const Value *V) { 3223 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3224 } 3225 }; 3226 3227 //===----------------------------------------------------------------------===// 3228 // SExtInst Class 3229 //===----------------------------------------------------------------------===// 3230 3231 /// @brief This class represents a sign extension of integer types. 3232 class SExtInst : public CastInst { 3233 protected: 3234 /// @brief Clone an identical SExtInst 3235 virtual SExtInst *clone_impl() const; 3236 3237 public: 3238 /// @brief Constructor with insert-before-instruction semantics 3239 SExtInst( 3240 Value *S, ///< The value to be sign extended 3241 Type *Ty, ///< The type to sign extend to 3242 const Twine &NameStr = "", ///< A name for the new instruction 3243 Instruction *InsertBefore = 0 ///< Where to insert the new instruction 3244 ); 3245 3246 /// @brief Constructor with insert-at-end-of-block semantics 3247 SExtInst( 3248 Value *S, ///< The value to be sign extended 3249 Type *Ty, ///< The type to sign extend to 3250 const Twine &NameStr, ///< A name for the new instruction 3251 BasicBlock *InsertAtEnd ///< The block to insert the instruction into 3252 ); 3253 3254 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: 3255 static inline bool classof(const SExtInst *) { return true; } 3256 static inline bool classof(const Instruction *I) { 3257 return I->getOpcode() == SExt; 3258 } 3259 static inline bool classof(const Value *V) { 3260 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3261 } 3262 }; 3263 3264 //===----------------------------------------------------------------------===// 3265 // FPTruncInst Class 3266 //===----------------------------------------------------------------------===// 3267 3268 /// @brief This class represents a truncation of floating point types. 3269 class FPTruncInst : public CastInst { 3270 protected: 3271 /// @brief Clone an identical FPTruncInst 3272 virtual FPTruncInst *clone_impl() const; 3273 3274 public: 3275 /// @brief Constructor with insert-before-instruction semantics 3276 FPTruncInst( 3277 Value *S, ///< The value to be truncated 3278 Type *Ty, ///< The type to truncate to 3279 const Twine &NameStr = "", ///< A name for the new instruction 3280 Instruction *InsertBefore = 0 ///< Where to insert the new instruction 3281 ); 3282 3283 /// @brief Constructor with insert-before-instruction semantics 3284 FPTruncInst( 3285 Value *S, ///< The value to be truncated 3286 Type *Ty, ///< The type to truncate to 3287 const Twine &NameStr, ///< A name for the new instruction 3288 BasicBlock *InsertAtEnd ///< The block to insert the instruction into 3289 ); 3290 3291 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: 3292 static inline bool classof(const FPTruncInst *) { return true; } 3293 static inline bool classof(const Instruction *I) { 3294 return I->getOpcode() == FPTrunc; 3295 } 3296 static inline bool classof(const Value *V) { 3297 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3298 } 3299 }; 3300 3301 //===----------------------------------------------------------------------===// 3302 // FPExtInst Class 3303 //===----------------------------------------------------------------------===// 3304 3305 /// @brief This class represents an extension of floating point types. 3306 class FPExtInst : public CastInst { 3307 protected: 3308 /// @brief Clone an identical FPExtInst 3309 virtual FPExtInst *clone_impl() const; 3310 3311 public: 3312 /// @brief Constructor with insert-before-instruction semantics 3313 FPExtInst( 3314 Value *S, ///< The value to be extended 3315 Type *Ty, ///< The type to extend to 3316 const Twine &NameStr = "", ///< A name for the new instruction 3317 Instruction *InsertBefore = 0 ///< Where to insert the new instruction 3318 ); 3319 3320 /// @brief Constructor with insert-at-end-of-block semantics 3321 FPExtInst( 3322 Value *S, ///< The value to be extended 3323 Type *Ty, ///< The type to extend to 3324 const Twine &NameStr, ///< A name for the new instruction 3325 BasicBlock *InsertAtEnd ///< The block to insert the instruction into 3326 ); 3327 3328 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: 3329 static inline bool classof(const FPExtInst *) { return true; } 3330 static inline bool classof(const Instruction *I) { 3331 return I->getOpcode() == FPExt; 3332 } 3333 static inline bool classof(const Value *V) { 3334 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3335 } 3336 }; 3337 3338 //===----------------------------------------------------------------------===// 3339 // UIToFPInst Class 3340 //===----------------------------------------------------------------------===// 3341 3342 /// @brief This class represents a cast unsigned integer to floating point. 3343 class UIToFPInst : public CastInst { 3344 protected: 3345 /// @brief Clone an identical UIToFPInst 3346 virtual UIToFPInst *clone_impl() const; 3347 3348 public: 3349 /// @brief Constructor with insert-before-instruction semantics 3350 UIToFPInst( 3351 Value *S, ///< The value to be converted 3352 Type *Ty, ///< The type to convert to 3353 const Twine &NameStr = "", ///< A name for the new instruction 3354 Instruction *InsertBefore = 0 ///< Where to insert the new instruction 3355 ); 3356 3357 /// @brief Constructor with insert-at-end-of-block semantics 3358 UIToFPInst( 3359 Value *S, ///< The value to be converted 3360 Type *Ty, ///< The type to convert to 3361 const Twine &NameStr, ///< A name for the new instruction 3362 BasicBlock *InsertAtEnd ///< The block to insert the instruction into 3363 ); 3364 3365 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: 3366 static inline bool classof(const UIToFPInst *) { return true; } 3367 static inline bool classof(const Instruction *I) { 3368 return I->getOpcode() == UIToFP; 3369 } 3370 static inline bool classof(const Value *V) { 3371 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3372 } 3373 }; 3374 3375 //===----------------------------------------------------------------------===// 3376 // SIToFPInst Class 3377 //===----------------------------------------------------------------------===// 3378 3379 /// @brief This class represents a cast from signed integer to floating point. 3380 class SIToFPInst : public CastInst { 3381 protected: 3382 /// @brief Clone an identical SIToFPInst 3383 virtual SIToFPInst *clone_impl() const; 3384 3385 public: 3386 /// @brief Constructor with insert-before-instruction semantics 3387 SIToFPInst( 3388 Value *S, ///< The value to be converted 3389 Type *Ty, ///< The type to convert to 3390 const Twine &NameStr = "", ///< A name for the new instruction 3391 Instruction *InsertBefore = 0 ///< Where to insert the new instruction 3392 ); 3393 3394 /// @brief Constructor with insert-at-end-of-block semantics 3395 SIToFPInst( 3396 Value *S, ///< The value to be converted 3397 Type *Ty, ///< The type to convert to 3398 const Twine &NameStr, ///< A name for the new instruction 3399 BasicBlock *InsertAtEnd ///< The block to insert the instruction into 3400 ); 3401 3402 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: 3403 static inline bool classof(const SIToFPInst *) { return true; } 3404 static inline bool classof(const Instruction *I) { 3405 return I->getOpcode() == SIToFP; 3406 } 3407 static inline bool classof(const Value *V) { 3408 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3409 } 3410 }; 3411 3412 //===----------------------------------------------------------------------===// 3413 // FPToUIInst Class 3414 //===----------------------------------------------------------------------===// 3415 3416 /// @brief This class represents a cast from floating point to unsigned integer 3417 class FPToUIInst : public CastInst { 3418 protected: 3419 /// @brief Clone an identical FPToUIInst 3420 virtual FPToUIInst *clone_impl() const; 3421 3422 public: 3423 /// @brief Constructor with insert-before-instruction semantics 3424 FPToUIInst( 3425 Value *S, ///< The value to be converted 3426 Type *Ty, ///< The type to convert to 3427 const Twine &NameStr = "", ///< A name for the new instruction 3428 Instruction *InsertBefore = 0 ///< Where to insert the new instruction 3429 ); 3430 3431 /// @brief Constructor with insert-at-end-of-block semantics 3432 FPToUIInst( 3433 Value *S, ///< The value to be converted 3434 Type *Ty, ///< The type to convert to 3435 const Twine &NameStr, ///< A name for the new instruction 3436 BasicBlock *InsertAtEnd ///< Where to insert the new instruction 3437 ); 3438 3439 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: 3440 static inline bool classof(const FPToUIInst *) { return true; } 3441 static inline bool classof(const Instruction *I) { 3442 return I->getOpcode() == FPToUI; 3443 } 3444 static inline bool classof(const Value *V) { 3445 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3446 } 3447 }; 3448 3449 //===----------------------------------------------------------------------===// 3450 // FPToSIInst Class 3451 //===----------------------------------------------------------------------===// 3452 3453 /// @brief This class represents a cast from floating point to signed integer. 3454 class FPToSIInst : public CastInst { 3455 protected: 3456 /// @brief Clone an identical FPToSIInst 3457 virtual FPToSIInst *clone_impl() const; 3458 3459 public: 3460 /// @brief Constructor with insert-before-instruction semantics 3461 FPToSIInst( 3462 Value *S, ///< The value to be converted 3463 Type *Ty, ///< The type to convert to 3464 const Twine &NameStr = "", ///< A name for the new instruction 3465 Instruction *InsertBefore = 0 ///< Where to insert the new instruction 3466 ); 3467 3468 /// @brief Constructor with insert-at-end-of-block semantics 3469 FPToSIInst( 3470 Value *S, ///< The value to be converted 3471 Type *Ty, ///< The type to convert to 3472 const Twine &NameStr, ///< A name for the new instruction 3473 BasicBlock *InsertAtEnd ///< The block to insert the instruction into 3474 ); 3475 3476 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: 3477 static inline bool classof(const FPToSIInst *) { return true; } 3478 static inline bool classof(const Instruction *I) { 3479 return I->getOpcode() == FPToSI; 3480 } 3481 static inline bool classof(const Value *V) { 3482 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3483 } 3484 }; 3485 3486 //===----------------------------------------------------------------------===// 3487 // IntToPtrInst Class 3488 //===----------------------------------------------------------------------===// 3489 3490 /// @brief This class represents a cast from an integer to a pointer. 3491 class IntToPtrInst : public CastInst { 3492 public: 3493 /// @brief Constructor with insert-before-instruction semantics 3494 IntToPtrInst( 3495 Value *S, ///< The value to be converted 3496 Type *Ty, ///< The type to convert to 3497 const Twine &NameStr = "", ///< A name for the new instruction 3498 Instruction *InsertBefore = 0 ///< Where to insert the new instruction 3499 ); 3500 3501 /// @brief Constructor with insert-at-end-of-block semantics 3502 IntToPtrInst( 3503 Value *S, ///< The value to be converted 3504 Type *Ty, ///< The type to convert to 3505 const Twine &NameStr, ///< A name for the new instruction 3506 BasicBlock *InsertAtEnd ///< The block to insert the instruction into 3507 ); 3508 3509 /// @brief Clone an identical IntToPtrInst 3510 virtual IntToPtrInst *clone_impl() const; 3511 3512 // Methods for support type inquiry through isa, cast, and dyn_cast: 3513 static inline bool classof(const IntToPtrInst *) { return true; } 3514 static inline bool classof(const Instruction *I) { 3515 return I->getOpcode() == IntToPtr; 3516 } 3517 static inline bool classof(const Value *V) { 3518 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3519 } 3520 }; 3521 3522 //===----------------------------------------------------------------------===// 3523 // PtrToIntInst Class 3524 //===----------------------------------------------------------------------===// 3525 3526 /// @brief This class represents a cast from a pointer to an integer 3527 class PtrToIntInst : public CastInst { 3528 protected: 3529 /// @brief Clone an identical PtrToIntInst 3530 virtual PtrToIntInst *clone_impl() const; 3531 3532 public: 3533 /// @brief Constructor with insert-before-instruction semantics 3534 PtrToIntInst( 3535 Value *S, ///< The value to be converted 3536 Type *Ty, ///< The type to convert to 3537 const Twine &NameStr = "", ///< A name for the new instruction 3538 Instruction *InsertBefore = 0 ///< Where to insert the new instruction 3539 ); 3540 3541 /// @brief Constructor with insert-at-end-of-block semantics 3542 PtrToIntInst( 3543 Value *S, ///< The value to be converted 3544 Type *Ty, ///< The type to convert to 3545 const Twine &NameStr, ///< A name for the new instruction 3546 BasicBlock *InsertAtEnd ///< The block to insert the instruction into 3547 ); 3548 3549 // Methods for support type inquiry through isa, cast, and dyn_cast: 3550 static inline bool classof(const PtrToIntInst *) { return true; } 3551 static inline bool classof(const Instruction *I) { 3552 return I->getOpcode() == PtrToInt; 3553 } 3554 static inline bool classof(const Value *V) { 3555 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3556 } 3557 }; 3558 3559 //===----------------------------------------------------------------------===// 3560 // BitCastInst Class 3561 //===----------------------------------------------------------------------===// 3562 3563 /// @brief This class represents a no-op cast from one type to another. 3564 class BitCastInst : public CastInst { 3565 protected: 3566 /// @brief Clone an identical BitCastInst 3567 virtual BitCastInst *clone_impl() const; 3568 3569 public: 3570 /// @brief Constructor with insert-before-instruction semantics 3571 BitCastInst( 3572 Value *S, ///< The value to be casted 3573 Type *Ty, ///< The type to casted to 3574 const Twine &NameStr = "", ///< A name for the new instruction 3575 Instruction *InsertBefore = 0 ///< Where to insert the new instruction 3576 ); 3577 3578 /// @brief Constructor with insert-at-end-of-block semantics 3579 BitCastInst( 3580 Value *S, ///< The value to be casted 3581 Type *Ty, ///< The type to casted to 3582 const Twine &NameStr, ///< A name for the new instruction 3583 BasicBlock *InsertAtEnd ///< The block to insert the instruction into 3584 ); 3585 3586 // Methods for support type inquiry through isa, cast, and dyn_cast: 3587 static inline bool classof(const BitCastInst *) { return true; } 3588 static inline bool classof(const Instruction *I) { 3589 return I->getOpcode() == BitCast; 3590 } 3591 static inline bool classof(const Value *V) { 3592 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 3593 } 3594 }; 3595 3596 } // End llvm namespace 3597 3598 #endif 3599