Changes to support making the shift instructions be true BinaryOperators.
[oota-llvm.git] / include / llvm / Instructions.h
1 //===-- llvm/Instructions.h - Instruction subclass definitions --*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source 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
21 namespace llvm {
22
23 class BasicBlock;
24 class ConstantInt;
25 class PointerType;
26 class PackedType;
27
28 //===----------------------------------------------------------------------===//
29 //                             AllocationInst Class
30 //===----------------------------------------------------------------------===//
31
32 /// AllocationInst - This class is the common base class of MallocInst and
33 /// AllocaInst.
34 ///
35 class AllocationInst : public UnaryInstruction {
36   unsigned Alignment;
37 protected:
38   AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, unsigned Align,
39                  const std::string &Name = "", Instruction *InsertBefore = 0);
40   AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, unsigned Align,
41                  const std::string &Name, BasicBlock *InsertAtEnd);
42 public:
43   // Out of line virtual method, so the vtable, etc has a home.
44   virtual ~AllocationInst();
45
46   /// isArrayAllocation - Return true if there is an allocation size parameter
47   /// to the allocation instruction that is not 1.
48   ///
49   bool isArrayAllocation() const;
50
51   /// getArraySize - Get the number of element allocated, for a simple
52   /// allocation of a single element, this will return a constant 1 value.
53   ///
54   inline const Value *getArraySize() const { return getOperand(0); }
55   inline Value *getArraySize() { return getOperand(0); }
56
57   /// getType - Overload to return most specific pointer type
58   ///
59   inline const PointerType *getType() const {
60     return reinterpret_cast<const PointerType*>(Instruction::getType());
61   }
62
63   /// getAllocatedType - Return the type that is being allocated by the
64   /// instruction.
65   ///
66   const Type *getAllocatedType() const;
67
68   /// getAlignment - Return the alignment of the memory that is being allocated
69   /// by the instruction.
70   ///
71   unsigned getAlignment() const { return Alignment; }
72   void setAlignment(unsigned Align) {
73     assert((Align & (Align-1)) == 0 && "Alignment is not a power of 2!");
74     Alignment = Align;
75   }
76
77   virtual Instruction *clone() const = 0;
78
79   // Methods for support type inquiry through isa, cast, and dyn_cast:
80   static inline bool classof(const AllocationInst *) { return true; }
81   static inline bool classof(const Instruction *I) {
82     return I->getOpcode() == Instruction::Alloca ||
83            I->getOpcode() == Instruction::Malloc;
84   }
85   static inline bool classof(const Value *V) {
86     return isa<Instruction>(V) && classof(cast<Instruction>(V));
87   }
88 };
89
90
91 //===----------------------------------------------------------------------===//
92 //                                MallocInst Class
93 //===----------------------------------------------------------------------===//
94
95 /// MallocInst - an instruction to allocated memory on the heap
96 ///
97 class MallocInst : public AllocationInst {
98   MallocInst(const MallocInst &MI);
99 public:
100   explicit MallocInst(const Type *Ty, Value *ArraySize = 0,
101                       const std::string &Name = "",
102                       Instruction *InsertBefore = 0)
103     : AllocationInst(Ty, ArraySize, Malloc, 0, Name, InsertBefore) {}
104   MallocInst(const Type *Ty, Value *ArraySize, const std::string &Name,
105              BasicBlock *InsertAtEnd)
106     : AllocationInst(Ty, ArraySize, Malloc, 0, Name, InsertAtEnd) {}
107
108   MallocInst(const Type *Ty, const std::string &Name,
109              Instruction *InsertBefore = 0)
110     : AllocationInst(Ty, 0, Malloc, 0, Name, InsertBefore) {}
111   MallocInst(const Type *Ty, const std::string &Name, BasicBlock *InsertAtEnd)
112     : AllocationInst(Ty, 0, Malloc, 0, Name, InsertAtEnd) {}
113
114   MallocInst(const Type *Ty, Value *ArraySize, unsigned Align,
115              const std::string &Name, BasicBlock *InsertAtEnd)
116     : AllocationInst(Ty, ArraySize, Malloc, Align, Name, InsertAtEnd) {}
117   MallocInst(const Type *Ty, Value *ArraySize, unsigned Align,
118                       const std::string &Name = "",
119                       Instruction *InsertBefore = 0)
120     : AllocationInst(Ty, ArraySize, Malloc, Align, Name, InsertBefore) {}
121
122   virtual MallocInst *clone() const;
123
124   // Methods for support type inquiry through isa, cast, and dyn_cast:
125   static inline bool classof(const MallocInst *) { return true; }
126   static inline bool classof(const Instruction *I) {
127     return (I->getOpcode() == Instruction::Malloc);
128   }
129   static inline bool classof(const Value *V) {
130     return isa<Instruction>(V) && classof(cast<Instruction>(V));
131   }
132 };
133
134
135 //===----------------------------------------------------------------------===//
136 //                                AllocaInst Class
137 //===----------------------------------------------------------------------===//
138
139 /// AllocaInst - an instruction to allocate memory on the stack
140 ///
141 class AllocaInst : public AllocationInst {
142   AllocaInst(const AllocaInst &);
143 public:
144   explicit AllocaInst(const Type *Ty, Value *ArraySize = 0,
145                       const std::string &Name = "",
146                       Instruction *InsertBefore = 0)
147     : AllocationInst(Ty, ArraySize, Alloca, 0, Name, InsertBefore) {}
148   AllocaInst(const Type *Ty, Value *ArraySize, const std::string &Name,
149              BasicBlock *InsertAtEnd)
150     : AllocationInst(Ty, ArraySize, Alloca, 0, Name, InsertAtEnd) {}
151
152   AllocaInst(const Type *Ty, const std::string &Name,
153              Instruction *InsertBefore = 0)
154     : AllocationInst(Ty, 0, Alloca, 0, Name, InsertBefore) {}
155   AllocaInst(const Type *Ty, const std::string &Name, BasicBlock *InsertAtEnd)
156     : AllocationInst(Ty, 0, Alloca, 0, Name, InsertAtEnd) {}
157
158   AllocaInst(const Type *Ty, Value *ArraySize, unsigned Align,
159              const std::string &Name = "", Instruction *InsertBefore = 0)
160     : AllocationInst(Ty, ArraySize, Alloca, Align, Name, InsertBefore) {}
161   AllocaInst(const Type *Ty, Value *ArraySize, unsigned Align,
162              const std::string &Name, BasicBlock *InsertAtEnd)
163     : AllocationInst(Ty, ArraySize, Alloca, Align, Name, InsertAtEnd) {}
164
165   virtual AllocaInst *clone() const;
166
167   // Methods for support type inquiry through isa, cast, and dyn_cast:
168   static inline bool classof(const AllocaInst *) { return true; }
169   static inline bool classof(const Instruction *I) {
170     return (I->getOpcode() == Instruction::Alloca);
171   }
172   static inline bool classof(const Value *V) {
173     return isa<Instruction>(V) && classof(cast<Instruction>(V));
174   }
175 };
176
177
178 //===----------------------------------------------------------------------===//
179 //                                 FreeInst Class
180 //===----------------------------------------------------------------------===//
181
182 /// FreeInst - an instruction to deallocate memory
183 ///
184 class FreeInst : public UnaryInstruction {
185   void AssertOK();
186 public:
187   explicit FreeInst(Value *Ptr, Instruction *InsertBefore = 0);
188   FreeInst(Value *Ptr, BasicBlock *InsertAfter);
189
190   virtual FreeInst *clone() const;
191
192   virtual bool mayWriteToMemory() const { return true; }
193
194   // Methods for support type inquiry through isa, cast, and dyn_cast:
195   static inline bool classof(const FreeInst *) { return true; }
196   static inline bool classof(const Instruction *I) {
197     return (I->getOpcode() == Instruction::Free);
198   }
199   static inline bool classof(const Value *V) {
200     return isa<Instruction>(V) && classof(cast<Instruction>(V));
201   }
202 };
203
204
205 //===----------------------------------------------------------------------===//
206 //                                LoadInst Class
207 //===----------------------------------------------------------------------===//
208
209 /// LoadInst - an instruction for reading from memory.  This uses the
210 /// SubclassData field in Value to store whether or not the load is volatile.
211 ///
212 class LoadInst : public UnaryInstruction {
213   LoadInst(const LoadInst &LI)
214     : UnaryInstruction(LI.getType(), Load, LI.getOperand(0)) {
215     setVolatile(LI.isVolatile());
216
217 #ifndef NDEBUG
218     AssertOK();
219 #endif
220   }
221   void AssertOK();
222 public:
223   LoadInst(Value *Ptr, const std::string &Name, Instruction *InsertBefore);
224   LoadInst(Value *Ptr, const std::string &Name, BasicBlock *InsertAtEnd);
225   explicit LoadInst(Value *Ptr, const std::string &Name = "",
226                     bool isVolatile = false, Instruction *InsertBefore = 0);
227   LoadInst(Value *Ptr, const std::string &Name, bool isVolatile,
228            BasicBlock *InsertAtEnd);
229
230   /// isVolatile - Return true if this is a load from a volatile memory
231   /// location.
232   ///
233   bool isVolatile() const { return SubclassData; }
234
235   /// setVolatile - Specify whether this is a volatile load or not.
236   ///
237   void setVolatile(bool V) { SubclassData = V; }
238
239   virtual LoadInst *clone() const;
240
241   virtual bool mayWriteToMemory() const { return isVolatile(); }
242
243   Value *getPointerOperand() { return getOperand(0); }
244   const Value *getPointerOperand() const { return getOperand(0); }
245   static unsigned getPointerOperandIndex() { return 0U; }
246
247   // Methods for support type inquiry through isa, cast, and dyn_cast:
248   static inline bool classof(const LoadInst *) { return true; }
249   static inline bool classof(const Instruction *I) {
250     return I->getOpcode() == Instruction::Load;
251   }
252   static inline bool classof(const Value *V) {
253     return isa<Instruction>(V) && classof(cast<Instruction>(V));
254   }
255 };
256
257
258 //===----------------------------------------------------------------------===//
259 //                                StoreInst Class
260 //===----------------------------------------------------------------------===//
261
262 /// StoreInst - an instruction for storing to memory
263 ///
264 class StoreInst : public Instruction {
265   Use Ops[2];
266   StoreInst(const StoreInst &SI) : Instruction(SI.getType(), Store, Ops, 2) {
267     Ops[0].init(SI.Ops[0], this);
268     Ops[1].init(SI.Ops[1], this);
269     setVolatile(SI.isVolatile());
270 #ifndef NDEBUG
271     AssertOK();
272 #endif
273   }
274   void AssertOK();
275 public:
276   StoreInst(Value *Val, Value *Ptr, Instruction *InsertBefore);
277   StoreInst(Value *Val, Value *Ptr, BasicBlock *InsertAtEnd);
278   StoreInst(Value *Val, Value *Ptr, bool isVolatile = false,
279             Instruction *InsertBefore = 0);
280   StoreInst(Value *Val, Value *Ptr, bool isVolatile, BasicBlock *InsertAtEnd);
281
282
283   /// isVolatile - Return true if this is a load from a volatile memory
284   /// location.
285   ///
286   bool isVolatile() const { return SubclassData; }
287
288   /// setVolatile - Specify whether this is a volatile load or not.
289   ///
290   void setVolatile(bool V) { SubclassData = V; }
291
292   /// Transparently provide more efficient getOperand methods.
293   Value *getOperand(unsigned i) const {
294     assert(i < 2 && "getOperand() out of range!");
295     return Ops[i];
296   }
297   void setOperand(unsigned i, Value *Val) {
298     assert(i < 2 && "setOperand() out of range!");
299     Ops[i] = Val;
300   }
301   unsigned getNumOperands() const { return 2; }
302
303
304   virtual StoreInst *clone() const;
305
306   virtual bool mayWriteToMemory() const { return true; }
307
308   Value *getPointerOperand() { return getOperand(1); }
309   const Value *getPointerOperand() const { return getOperand(1); }
310   static unsigned getPointerOperandIndex() { return 1U; }
311
312   // Methods for support type inquiry through isa, cast, and dyn_cast:
313   static inline bool classof(const StoreInst *) { return true; }
314   static inline bool classof(const Instruction *I) {
315     return I->getOpcode() == Instruction::Store;
316   }
317   static inline bool classof(const Value *V) {
318     return isa<Instruction>(V) && classof(cast<Instruction>(V));
319   }
320 };
321
322
323 //===----------------------------------------------------------------------===//
324 //                             GetElementPtrInst Class
325 //===----------------------------------------------------------------------===//
326
327 /// GetElementPtrInst - an instruction for type-safe pointer arithmetic to
328 /// access elements of arrays and structs
329 ///
330 class GetElementPtrInst : public Instruction {
331   GetElementPtrInst(const GetElementPtrInst &GEPI)
332     : Instruction(reinterpret_cast<const Type*>(GEPI.getType()), GetElementPtr,
333                   0, GEPI.getNumOperands()) {
334     Use *OL = OperandList = new Use[NumOperands];
335     Use *GEPIOL = GEPI.OperandList;
336     for (unsigned i = 0, E = NumOperands; i != E; ++i)
337       OL[i].init(GEPIOL[i], this);
338   }
339   void init(Value *Ptr, Value* const *Idx, unsigned NumIdx);
340   void init(Value *Ptr, Value *Idx0, Value *Idx1);
341   void init(Value *Ptr, Value *Idx);
342 public:
343   /// Constructors - Create a getelementptr instruction with a base pointer an
344   /// list of indices.  The first ctor can optionally insert before an existing
345   /// instruction, the second appends the new instruction to the specified
346   /// BasicBlock.
347   GetElementPtrInst(Value *Ptr, const std::vector<Value*> &Idx,
348                     const std::string &Name = "", Instruction *InsertBefore =0);
349   GetElementPtrInst(Value *Ptr, const std::vector<Value*> &Idx,
350                     const std::string &Name, BasicBlock *InsertAtEnd);
351   GetElementPtrInst(Value *Ptr, Value* const *Idx, unsigned NumIdx,
352                     const std::string &Name = "", Instruction *InsertBefore =0);
353   GetElementPtrInst(Value *Ptr, Value* const *Idx, unsigned NumIdx,
354                     const std::string &Name, BasicBlock *InsertAtEnd);
355   
356   /// Constructors - These two constructors are convenience methods because one
357   /// and two index getelementptr instructions are so common.
358   GetElementPtrInst(Value *Ptr, Value *Idx,
359                     const std::string &Name = "", Instruction *InsertBefore =0);
360   GetElementPtrInst(Value *Ptr, Value *Idx,
361                     const std::string &Name, BasicBlock *InsertAtEnd);
362   GetElementPtrInst(Value *Ptr, Value *Idx0, Value *Idx1,
363                     const std::string &Name = "", Instruction *InsertBefore =0);
364   GetElementPtrInst(Value *Ptr, Value *Idx0, Value *Idx1,
365                     const std::string &Name, BasicBlock *InsertAtEnd);
366   ~GetElementPtrInst();
367
368   virtual GetElementPtrInst *clone() const;
369
370   // getType - Overload to return most specific pointer type...
371   inline const PointerType *getType() const {
372     return reinterpret_cast<const PointerType*>(Instruction::getType());
373   }
374
375   /// getIndexedType - Returns the type of the element that would be loaded with
376   /// a load instruction with the specified parameters.
377   ///
378   /// A null type is returned if the indices are invalid for the specified
379   /// pointer type.
380   ///
381   static const Type *getIndexedType(const Type *Ptr,
382                                     Value* const *Idx, unsigned NumIdx,
383                                     bool AllowStructLeaf = false);
384   
385   static const Type *getIndexedType(const Type *Ptr,
386                                     const std::vector<Value*> &Indices,
387                                     bool AllowStructLeaf = false) {
388     return getIndexedType(Ptr, &Indices[0], Indices.size(), AllowStructLeaf);
389   }
390   static const Type *getIndexedType(const Type *Ptr, Value *Idx0, Value *Idx1,
391                                     bool AllowStructLeaf = false);
392   static const Type *getIndexedType(const Type *Ptr, Value *Idx);
393
394   inline op_iterator       idx_begin()       { return op_begin()+1; }
395   inline const_op_iterator idx_begin() const { return op_begin()+1; }
396   inline op_iterator       idx_end()         { return op_end(); }
397   inline const_op_iterator idx_end()   const { return op_end(); }
398
399   Value *getPointerOperand() {
400     return getOperand(0);
401   }
402   const Value *getPointerOperand() const {
403     return getOperand(0);
404   }
405   static unsigned getPointerOperandIndex() {
406     return 0U;                      // get index for modifying correct operand
407   }
408
409   inline unsigned getNumIndices() const {  // Note: always non-negative
410     return getNumOperands() - 1;
411   }
412
413   inline bool hasIndices() const {
414     return getNumOperands() > 1;
415   }
416
417   // Methods for support type inquiry through isa, cast, and dyn_cast:
418   static inline bool classof(const GetElementPtrInst *) { return true; }
419   static inline bool classof(const Instruction *I) {
420     return (I->getOpcode() == Instruction::GetElementPtr);
421   }
422   static inline bool classof(const Value *V) {
423     return isa<Instruction>(V) && classof(cast<Instruction>(V));
424   }
425 };
426
427 //===----------------------------------------------------------------------===//
428 //                               ICmpInst Class
429 //===----------------------------------------------------------------------===//
430
431 /// This instruction compares its operands according to the predicate given
432 /// to the constructor. It only operates on integers, pointers, or packed 
433 /// vectors of integrals. The two operands must be the same type.
434 /// @brief Represent an integer comparison operator.
435 class ICmpInst: public CmpInst {
436 public:
437   /// This enumeration lists the possible predicates for the ICmpInst. The
438   /// values in the range 0-31 are reserved for FCmpInst while values in the
439   /// range 32-64 are reserved for ICmpInst. This is necessary to ensure the
440   /// predicate values are not overlapping between the classes.
441   enum Predicate {
442     ICMP_EQ  = 32,    ///< equal
443     ICMP_NE  = 33,    ///< not equal
444     ICMP_UGT = 34,    ///< unsigned greater than
445     ICMP_UGE = 35,    ///< unsigned greater or equal
446     ICMP_ULT = 36,    ///< unsigned less than
447     ICMP_ULE = 37,    ///< unsigned less or equal
448     ICMP_SGT = 38,    ///< signed greater than
449     ICMP_SGE = 39,    ///< signed greater or equal
450     ICMP_SLT = 40,    ///< signed less than
451     ICMP_SLE = 41,    ///< signed less or equal
452     FIRST_ICMP_PREDICATE = ICMP_EQ,
453     LAST_ICMP_PREDICATE = ICMP_SLE,
454     BAD_ICMP_PREDICATE = ICMP_SLE + 1
455   };
456
457   /// @brief Constructor with insert-before-instruction semantics.
458   ICmpInst(
459     Predicate pred,  ///< The predicate to use for the comparison
460     Value *LHS,      ///< The left-hand-side of the expression
461     Value *RHS,      ///< The right-hand-side of the expression
462     const std::string &Name = "",  ///< Name of the instruction
463     Instruction *InsertBefore = 0  ///< Where to insert
464   ) : CmpInst(Instruction::ICmp, pred, LHS, RHS, Name, InsertBefore) {
465   }
466
467   /// @brief Constructor with insert-at-block-end semantics.
468   ICmpInst(
469     Predicate pred, ///< The predicate to use for the comparison
470     Value *LHS,     ///< The left-hand-side of the expression
471     Value *RHS,     ///< The right-hand-side of the expression
472     const std::string &Name,  ///< Name of the instruction
473     BasicBlock *InsertAtEnd   ///< Block to insert into.
474   ) : CmpInst(Instruction::ICmp, pred, LHS, RHS, Name, InsertAtEnd) {
475   }
476
477   /// @brief Return the predicate for this instruction.
478   Predicate getPredicate() const { return Predicate(SubclassData); }
479
480   /// @brief Set the predicate for this instruction to the specified value.
481   void setPredicate(Predicate P) { SubclassData = P; }
482   
483   /// For example, EQ -> NE, UGT -> ULE, SLT -> SGE, etc.
484   /// @returns the inverse predicate for the instruction's current predicate. 
485   /// @brief Return the inverse of the instruction's predicate.
486   Predicate getInversePredicate() const {
487     return getInversePredicate(getPredicate());
488   }
489
490   /// For example, EQ -> NE, UGT -> ULE, SLT -> SGE, etc.
491   /// @returns the inverse predicate for predicate provided in \p pred. 
492   /// @brief Return the inverse of a given predicate
493   static Predicate getInversePredicate(Predicate pred);
494
495   /// For example, EQ->EQ, SLE->SGE, ULT->UGT, etc.
496   /// @returns the predicate that would be the result of exchanging the two 
497   /// operands of the ICmpInst instruction without changing the result 
498   /// produced.  
499   /// @brief Return the predicate as if the operands were swapped
500   Predicate getSwappedPredicate() const {
501     return getSwappedPredicate(getPredicate());
502   }
503
504   /// This is a static version that you can use without an instruction 
505   /// available.
506   /// @brief Return the predicate as if the operands were swapped.
507   static Predicate getSwappedPredicate(Predicate pred);
508
509   /// For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
510   /// @returns the predicate that would be the result if the operand were
511   /// regarded as signed.
512   /// @brief Return the signed version of the predicate
513   Predicate getSignedPredicate() const {
514     return getSignedPredicate(getPredicate());
515   }
516
517   /// This is a static version that you can use without an instruction.
518   /// @brief Return the signed version of the predicate.
519   static Predicate getSignedPredicate(Predicate pred);
520
521   /// This also tests for commutativity. If isEquality() returns true then
522   /// the predicate is also commutative. 
523   /// @returns true if the predicate of this instruction is EQ or NE.
524   /// @brief Determine if this is an equality predicate.
525   bool isEquality() const {
526     return SubclassData == ICMP_EQ || SubclassData == ICMP_NE;
527   }
528
529   /// @returns true if the predicate of this ICmpInst is commutative
530   /// @brief Determine if this relation is commutative.
531   bool isCommutative() const { return isEquality(); }
532
533   /// @returns true if the predicate is relational (not EQ or NE). 
534   /// @brief Determine if this a relational predicate.
535   bool isRelational() const {
536     return !isEquality();
537   }
538
539   /// @returns true if the predicate of this ICmpInst is signed, false otherwise
540   /// @brief Determine if this instruction's predicate is signed.
541   bool isSignedPredicate() { return isSignedPredicate(getPredicate()); }
542
543   /// @returns true if the predicate provided is signed, false otherwise
544   /// @brief Determine if the predicate is signed.
545   static bool isSignedPredicate(Predicate pred);
546
547   /// Exchange the two operands to this instruction in such a way that it does
548   /// not modify the semantics of the instruction. The predicate value may be
549   /// changed to retain the same result if the predicate is order dependent
550   /// (e.g. ult). 
551   /// @brief Swap operands and adjust predicate.
552   void swapOperands() {
553     SubclassData = getSwappedPredicate();
554     std::swap(Ops[0], Ops[1]);
555   }
556
557   // Methods for support type inquiry through isa, cast, and dyn_cast:
558   static inline bool classof(const ICmpInst *) { return true; }
559   static inline bool classof(const Instruction *I) {
560     return I->getOpcode() == Instruction::ICmp;
561   }
562   static inline bool classof(const Value *V) {
563     return isa<Instruction>(V) && classof(cast<Instruction>(V));
564   }
565 };
566
567 //===----------------------------------------------------------------------===//
568 //                               FCmpInst Class
569 //===----------------------------------------------------------------------===//
570
571 /// This instruction compares its operands according to the predicate given
572 /// to the constructor. It only operates on floating point values or packed     
573 /// vectors of floating point values. The operands must be identical types.
574 /// @brief Represents a floating point comparison operator.
575 class FCmpInst: public CmpInst {
576 public:
577   /// This enumeration lists the possible predicates for the FCmpInst. Values
578   /// in the range 0-31 are reserved for FCmpInst.
579   enum Predicate {
580     // Opcode        U L G E    Intuitive operation
581     FCMP_FALSE = 0, ///<  0 0 0 0    Always false (always folded)
582     FCMP_OEQ   = 1, ///<  0 0 0 1    True if ordered and equal
583     FCMP_OGT   = 2, ///<  0 0 1 0    True if ordered and greater than
584     FCMP_OGE   = 3, ///<  0 0 1 1    True if ordered and greater than or equal
585     FCMP_OLT   = 4, ///<  0 1 0 0    True if ordered and less than
586     FCMP_OLE   = 5, ///<  0 1 0 1    True if ordered and less than or equal
587     FCMP_ONE   = 6, ///<  0 1 1 0    True if ordered and operands are unequal
588     FCMP_ORD   = 7, ///<  0 1 1 1    True if ordered (no nans)
589     FCMP_UNO   = 8, ///<  1 0 0 0    True if unordered: isnan(X) | isnan(Y)
590     FCMP_UEQ   = 9, ///<  1 0 0 1    True if unordered or equal
591     FCMP_UGT   =10, ///<  1 0 1 0    True if unordered or greater than
592     FCMP_UGE   =11, ///<  1 0 1 1    True if unordered, greater than, or equal
593     FCMP_ULT   =12, ///<  1 1 0 0    True if unordered or less than
594     FCMP_ULE   =13, ///<  1 1 0 1    True if unordered, less than, or equal
595     FCMP_UNE   =14, ///<  1 1 1 0    True if unordered or not equal
596     FCMP_TRUE  =15, ///<  1 1 1 1    Always true (always folded)
597     FIRST_FCMP_PREDICATE = FCMP_FALSE,
598     LAST_FCMP_PREDICATE = FCMP_TRUE,
599     BAD_FCMP_PREDICATE = FCMP_TRUE + 1
600   };
601
602   /// @brief Constructor with insert-before-instruction semantics.
603   FCmpInst(
604     Predicate pred,  ///< The predicate to use for the comparison
605     Value *LHS,      ///< The left-hand-side of the expression
606     Value *RHS,      ///< The right-hand-side of the expression
607     const std::string &Name = "",  ///< Name of the instruction
608     Instruction *InsertBefore = 0  ///< Where to insert
609   ) : CmpInst(Instruction::FCmp, pred, LHS, RHS, Name, InsertBefore) {
610   }
611
612   /// @brief Constructor with insert-at-block-end semantics.
613   FCmpInst(
614     Predicate pred, ///< The predicate to use for the comparison
615     Value *LHS,     ///< The left-hand-side of the expression
616     Value *RHS,     ///< The right-hand-side of the expression
617     const std::string &Name,  ///< Name of the instruction
618     BasicBlock *InsertAtEnd   ///< Block to insert into.
619   ) : CmpInst(Instruction::FCmp, pred, LHS, RHS, Name, InsertAtEnd) {
620   }
621
622   /// @brief Return the predicate for this instruction.
623   Predicate getPredicate() const { return Predicate(SubclassData); }
624
625   /// @brief Set the predicate for this instruction to the specified value.
626   void setPredicate(Predicate P) { SubclassData = P; }
627
628   /// For example, OEQ -> UNE, UGT -> OLE, OLT -> UGE, etc.
629   /// @returns the inverse predicate for the instructions current predicate. 
630   /// @brief Return the inverse of the predicate
631   Predicate getInversePredicate() const {
632     return getInversePredicate(getPredicate());
633   }
634
635   /// For example, OEQ -> UNE, UGT -> OLE, OLT -> UGE, etc.
636   /// @returns the inverse predicate for \p pred.
637   /// @brief Return the inverse of a given predicate
638   static Predicate getInversePredicate(Predicate pred);
639
640   /// For example, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
641   /// @returns the predicate that would be the result of exchanging the two 
642   /// operands of the ICmpInst instruction without changing the result 
643   /// produced.  
644   /// @brief Return the predicate as if the operands were swapped
645   Predicate getSwappedPredicate() const {
646     return getSwappedPredicate(getPredicate());
647   }
648
649   /// This is a static version that you can use without an instruction 
650   /// available.
651   /// @brief Return the predicate as if the operands were swapped.
652   static Predicate getSwappedPredicate(Predicate Opcode);
653
654   /// This also tests for commutativity. If isEquality() returns true then
655   /// the predicate is also commutative. Only the equality predicates are
656   /// commutative.
657   /// @returns true if the predicate of this instruction is EQ or NE.
658   /// @brief Determine if this is an equality predicate.
659   bool isEquality() const {
660     return SubclassData == FCMP_OEQ || SubclassData == FCMP_ONE ||
661            SubclassData == FCMP_UEQ || SubclassData == FCMP_UNE;
662   }
663   bool isCommutative() const { return isEquality(); }
664
665   /// @returns true if the predicate is relational (not EQ or NE). 
666   /// @brief Determine if this a relational predicate.
667   bool isRelational() const { return !isEquality(); }
668
669   /// Exchange the two operands to this instruction in such a way that it does
670   /// not modify the semantics of the instruction. The predicate value may be
671   /// changed to retain the same result if the predicate is order dependent
672   /// (e.g. ult). 
673   /// @brief Swap operands and adjust predicate.
674   void swapOperands() {
675     SubclassData = getSwappedPredicate();
676     std::swap(Ops[0], Ops[1]);
677   }
678
679   /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
680   static inline bool classof(const FCmpInst *) { return true; }
681   static inline bool classof(const Instruction *I) {
682     return I->getOpcode() == Instruction::FCmp;
683   }
684   static inline bool classof(const Value *V) {
685     return isa<Instruction>(V) && classof(cast<Instruction>(V));
686   }
687 };
688
689 //===----------------------------------------------------------------------===//
690 //                                 CallInst Class
691 //===----------------------------------------------------------------------===//
692
693 /// CallInst - This class represents a function call, abstracting a target
694 /// machine's calling convention.  This class uses low bit of the SubClassData
695 /// field to indicate whether or not this is a tail call.  The rest of the bits
696 /// hold the calling convention of the call.
697 ///
698 class CallInst : public Instruction {
699   CallInst(const CallInst &CI);
700   void init(Value *Func, const std::vector<Value*> &Params);
701   void init(Value *Func, Value *Actual1, Value *Actual2);
702   void init(Value *Func, Value *Actual);
703   void init(Value *Func);
704
705 public:
706   CallInst(Value *F, const std::vector<Value*> &Par,
707            const std::string &Name = "", Instruction *InsertBefore = 0);
708   CallInst(Value *F, const std::vector<Value*> &Par,
709            const std::string &Name, BasicBlock *InsertAtEnd);
710
711   // Alternate CallInst ctors w/ two actuals, w/ one actual and no
712   // actuals, respectively.
713   CallInst(Value *F, Value *Actual1, Value *Actual2,
714            const std::string& Name = "", Instruction *InsertBefore = 0);
715   CallInst(Value *F, Value *Actual1, Value *Actual2,
716            const std::string& Name, BasicBlock *InsertAtEnd);
717   CallInst(Value *F, Value *Actual, const std::string& Name = "",
718            Instruction *InsertBefore = 0);
719   CallInst(Value *F, Value *Actual, const std::string& Name,
720            BasicBlock *InsertAtEnd);
721   explicit CallInst(Value *F, const std::string &Name = "",
722                     Instruction *InsertBefore = 0);
723   CallInst(Value *F, const std::string &Name, BasicBlock *InsertAtEnd);
724   ~CallInst();
725
726   virtual CallInst *clone() const;
727   bool mayWriteToMemory() const { return true; }
728
729   bool isTailCall() const           { return SubclassData & 1; }
730   void setTailCall(bool isTailCall = true) {
731     SubclassData = (SubclassData & ~1) | unsigned(isTailCall);
732   }
733
734   /// getCallingConv/setCallingConv - Get or set the calling convention of this
735   /// function call.
736   unsigned getCallingConv() const { return SubclassData >> 1; }
737   void setCallingConv(unsigned CC) {
738     SubclassData = (SubclassData & 1) | (CC << 1);
739   }
740
741   /// getCalledFunction - Return the function being called by this instruction
742   /// if it is a direct call.  If it is a call through a function pointer,
743   /// return null.
744   Function *getCalledFunction() const {
745     return static_cast<Function*>(dyn_cast<Function>(getOperand(0)));
746   }
747
748   /// getCalledValue - Get a pointer to the function that is invoked by this 
749   /// instruction
750   inline const Value *getCalledValue() const { return getOperand(0); }
751   inline       Value *getCalledValue()       { return getOperand(0); }
752
753   // Methods for support type inquiry through isa, cast, and dyn_cast:
754   static inline bool classof(const CallInst *) { return true; }
755   static inline bool classof(const Instruction *I) {
756     return I->getOpcode() == Instruction::Call;
757   }
758   static inline bool classof(const Value *V) {
759     return isa<Instruction>(V) && classof(cast<Instruction>(V));
760   }
761 };
762
763 //===----------------------------------------------------------------------===//
764 //                               SelectInst Class
765 //===----------------------------------------------------------------------===//
766
767 /// SelectInst - This class represents the LLVM 'select' instruction.
768 ///
769 class SelectInst : public Instruction {
770   Use Ops[3];
771
772   void init(Value *C, Value *S1, Value *S2) {
773     Ops[0].init(C, this);
774     Ops[1].init(S1, this);
775     Ops[2].init(S2, this);
776   }
777
778   SelectInst(const SelectInst &SI)
779     : Instruction(SI.getType(), SI.getOpcode(), Ops, 3) {
780     init(SI.Ops[0], SI.Ops[1], SI.Ops[2]);
781   }
782 public:
783   SelectInst(Value *C, Value *S1, Value *S2, const std::string &Name = "",
784              Instruction *InsertBefore = 0)
785     : Instruction(S1->getType(), Instruction::Select, Ops, 3,
786                   Name, InsertBefore) {
787     init(C, S1, S2);
788   }
789   SelectInst(Value *C, Value *S1, Value *S2, const std::string &Name,
790              BasicBlock *InsertAtEnd)
791     : Instruction(S1->getType(), Instruction::Select, Ops, 3,
792                   Name, InsertAtEnd) {
793     init(C, S1, S2);
794   }
795
796   Value *getCondition() const { return Ops[0]; }
797   Value *getTrueValue() const { return Ops[1]; }
798   Value *getFalseValue() const { return Ops[2]; }
799
800   /// Transparently provide more efficient getOperand methods.
801   Value *getOperand(unsigned i) const {
802     assert(i < 3 && "getOperand() out of range!");
803     return Ops[i];
804   }
805   void setOperand(unsigned i, Value *Val) {
806     assert(i < 3 && "setOperand() out of range!");
807     Ops[i] = Val;
808   }
809   unsigned getNumOperands() const { return 3; }
810
811   OtherOps getOpcode() const {
812     return static_cast<OtherOps>(Instruction::getOpcode());
813   }
814
815   virtual SelectInst *clone() const;
816
817   // Methods for support type inquiry through isa, cast, and dyn_cast:
818   static inline bool classof(const SelectInst *) { return true; }
819   static inline bool classof(const Instruction *I) {
820     return I->getOpcode() == Instruction::Select;
821   }
822   static inline bool classof(const Value *V) {
823     return isa<Instruction>(V) && classof(cast<Instruction>(V));
824   }
825 };
826
827 //===----------------------------------------------------------------------===//
828 //                                VAArgInst Class
829 //===----------------------------------------------------------------------===//
830
831 /// VAArgInst - This class represents the va_arg llvm instruction, which returns
832 /// an argument of the specified type given a va_list and increments that list
833 ///
834 class VAArgInst : public UnaryInstruction {
835   VAArgInst(const VAArgInst &VAA)
836     : UnaryInstruction(VAA.getType(), VAArg, VAA.getOperand(0)) {}
837 public:
838   VAArgInst(Value *List, const Type *Ty, const std::string &Name = "",
839              Instruction *InsertBefore = 0)
840     : UnaryInstruction(Ty, VAArg, List, Name, InsertBefore) {
841   }
842   VAArgInst(Value *List, const Type *Ty, const std::string &Name,
843             BasicBlock *InsertAtEnd)
844     : UnaryInstruction(Ty, VAArg, List, Name, InsertAtEnd) {
845   }
846
847   virtual VAArgInst *clone() const;
848   bool mayWriteToMemory() const { return true; }
849
850   // Methods for support type inquiry through isa, cast, and dyn_cast:
851   static inline bool classof(const VAArgInst *) { return true; }
852   static inline bool classof(const Instruction *I) {
853     return I->getOpcode() == VAArg;
854   }
855   static inline bool classof(const Value *V) {
856     return isa<Instruction>(V) && classof(cast<Instruction>(V));
857   }
858 };
859
860 //===----------------------------------------------------------------------===//
861 //                                ExtractElementInst Class
862 //===----------------------------------------------------------------------===//
863
864 /// ExtractElementInst - This instruction extracts a single (scalar)
865 /// element from a PackedType value
866 ///
867 class ExtractElementInst : public Instruction {
868   Use Ops[2];
869   ExtractElementInst(const ExtractElementInst &EE) :
870     Instruction(EE.getType(), ExtractElement, Ops, 2) {
871     Ops[0].init(EE.Ops[0], this);
872     Ops[1].init(EE.Ops[1], this);
873   }
874
875 public:
876   ExtractElementInst(Value *Vec, Value *Idx, const std::string &Name = "",
877                      Instruction *InsertBefore = 0);
878   ExtractElementInst(Value *Vec, unsigned Idx, const std::string &Name = "",
879                      Instruction *InsertBefore = 0);
880   ExtractElementInst(Value *Vec, Value *Idx, const std::string &Name,
881                      BasicBlock *InsertAtEnd);
882   ExtractElementInst(Value *Vec, unsigned Idx, const std::string &Name,
883                      BasicBlock *InsertAtEnd);
884
885   /// isValidOperands - Return true if an extractelement instruction can be
886   /// formed with the specified operands.
887   static bool isValidOperands(const Value *Vec, const Value *Idx);
888
889   virtual ExtractElementInst *clone() const;
890
891   virtual bool mayWriteToMemory() const { return false; }
892
893   /// Transparently provide more efficient getOperand methods.
894   Value *getOperand(unsigned i) const {
895     assert(i < 2 && "getOperand() out of range!");
896     return Ops[i];
897   }
898   void setOperand(unsigned i, Value *Val) {
899     assert(i < 2 && "setOperand() out of range!");
900     Ops[i] = Val;
901   }
902   unsigned getNumOperands() const { return 2; }
903
904   // Methods for support type inquiry through isa, cast, and dyn_cast:
905   static inline bool classof(const ExtractElementInst *) { return true; }
906   static inline bool classof(const Instruction *I) {
907     return I->getOpcode() == Instruction::ExtractElement;
908   }
909   static inline bool classof(const Value *V) {
910     return isa<Instruction>(V) && classof(cast<Instruction>(V));
911   }
912 };
913
914 //===----------------------------------------------------------------------===//
915 //                                InsertElementInst Class
916 //===----------------------------------------------------------------------===//
917
918 /// InsertElementInst - This instruction inserts a single (scalar)
919 /// element into a PackedType value
920 ///
921 class InsertElementInst : public Instruction {
922   Use Ops[3];
923   InsertElementInst(const InsertElementInst &IE);
924 public:
925   InsertElementInst(Value *Vec, Value *NewElt, Value *Idx,
926                     const std::string &Name = "",Instruction *InsertBefore = 0);
927   InsertElementInst(Value *Vec, Value *NewElt, unsigned Idx,
928                     const std::string &Name = "",Instruction *InsertBefore = 0);
929   InsertElementInst(Value *Vec, Value *NewElt, Value *Idx,
930                     const std::string &Name, BasicBlock *InsertAtEnd);
931   InsertElementInst(Value *Vec, Value *NewElt, unsigned Idx,
932                     const std::string &Name, BasicBlock *InsertAtEnd);
933
934   /// isValidOperands - Return true if an insertelement instruction can be
935   /// formed with the specified operands.
936   static bool isValidOperands(const Value *Vec, const Value *NewElt,
937                               const Value *Idx);
938
939   virtual InsertElementInst *clone() const;
940
941   virtual bool mayWriteToMemory() const { return false; }
942
943   /// getType - Overload to return most specific packed type.
944   ///
945   inline const PackedType *getType() const {
946     return reinterpret_cast<const PackedType*>(Instruction::getType());
947   }
948
949   /// Transparently provide more efficient getOperand methods.
950   Value *getOperand(unsigned i) const {
951     assert(i < 3 && "getOperand() out of range!");
952     return Ops[i];
953   }
954   void setOperand(unsigned i, Value *Val) {
955     assert(i < 3 && "setOperand() out of range!");
956     Ops[i] = Val;
957   }
958   unsigned getNumOperands() const { return 3; }
959
960   // Methods for support type inquiry through isa, cast, and dyn_cast:
961   static inline bool classof(const InsertElementInst *) { return true; }
962   static inline bool classof(const Instruction *I) {
963     return I->getOpcode() == Instruction::InsertElement;
964   }
965   static inline bool classof(const Value *V) {
966     return isa<Instruction>(V) && classof(cast<Instruction>(V));
967   }
968 };
969
970 //===----------------------------------------------------------------------===//
971 //                           ShuffleVectorInst Class
972 //===----------------------------------------------------------------------===//
973
974 /// ShuffleVectorInst - This instruction constructs a fixed permutation of two
975 /// input vectors.
976 ///
977 class ShuffleVectorInst : public Instruction {
978   Use Ops[3];
979   ShuffleVectorInst(const ShuffleVectorInst &IE);
980 public:
981   ShuffleVectorInst(Value *V1, Value *V2, Value *Mask,
982                     const std::string &Name = "", Instruction *InsertBefor = 0);
983   ShuffleVectorInst(Value *V1, Value *V2, Value *Mask,
984                     const std::string &Name, BasicBlock *InsertAtEnd);
985
986   /// isValidOperands - Return true if a shufflevector instruction can be
987   /// formed with the specified operands.
988   static bool isValidOperands(const Value *V1, const Value *V2,
989                               const Value *Mask);
990
991   virtual ShuffleVectorInst *clone() const;
992
993   virtual bool mayWriteToMemory() const { return false; }
994
995   /// getType - Overload to return most specific packed type.
996   ///
997   inline const PackedType *getType() const {
998     return reinterpret_cast<const PackedType*>(Instruction::getType());
999   }
1000
1001   /// Transparently provide more efficient getOperand methods.
1002   Value *getOperand(unsigned i) const {
1003     assert(i < 3 && "getOperand() out of range!");
1004     return Ops[i];
1005   }
1006   void setOperand(unsigned i, Value *Val) {
1007     assert(i < 3 && "setOperand() out of range!");
1008     Ops[i] = Val;
1009   }
1010   unsigned getNumOperands() const { return 3; }
1011
1012   // Methods for support type inquiry through isa, cast, and dyn_cast:
1013   static inline bool classof(const ShuffleVectorInst *) { return true; }
1014   static inline bool classof(const Instruction *I) {
1015     return I->getOpcode() == Instruction::ShuffleVector;
1016   }
1017   static inline bool classof(const Value *V) {
1018     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1019   }
1020 };
1021
1022
1023 //===----------------------------------------------------------------------===//
1024 //                               PHINode Class
1025 //===----------------------------------------------------------------------===//
1026
1027 // PHINode - The PHINode class is used to represent the magical mystical PHI
1028 // node, that can not exist in nature, but can be synthesized in a computer
1029 // scientist's overactive imagination.
1030 //
1031 class PHINode : public Instruction {
1032   /// ReservedSpace - The number of operands actually allocated.  NumOperands is
1033   /// the number actually in use.
1034   unsigned ReservedSpace;
1035   PHINode(const PHINode &PN);
1036 public:
1037   explicit PHINode(const Type *Ty, const std::string &Name = "",
1038                    Instruction *InsertBefore = 0)
1039     : Instruction(Ty, Instruction::PHI, 0, 0, Name, InsertBefore),
1040       ReservedSpace(0) {
1041   }
1042
1043   PHINode(const Type *Ty, const std::string &Name, BasicBlock *InsertAtEnd)
1044     : Instruction(Ty, Instruction::PHI, 0, 0, Name, InsertAtEnd),
1045       ReservedSpace(0) {
1046   }
1047
1048   ~PHINode();
1049
1050   /// reserveOperandSpace - This method can be used to avoid repeated
1051   /// reallocation of PHI operand lists by reserving space for the correct
1052   /// number of operands before adding them.  Unlike normal vector reserves,
1053   /// this method can also be used to trim the operand space.
1054   void reserveOperandSpace(unsigned NumValues) {
1055     resizeOperands(NumValues*2);
1056   }
1057
1058   virtual PHINode *clone() const;
1059
1060   /// getNumIncomingValues - Return the number of incoming edges
1061   ///
1062   unsigned getNumIncomingValues() const { return getNumOperands()/2; }
1063
1064   /// getIncomingValue - Return incoming value number x
1065   ///
1066   Value *getIncomingValue(unsigned i) const {
1067     assert(i*2 < getNumOperands() && "Invalid value number!");
1068     return getOperand(i*2);
1069   }
1070   void setIncomingValue(unsigned i, Value *V) {
1071     assert(i*2 < getNumOperands() && "Invalid value number!");
1072     setOperand(i*2, V);
1073   }
1074   unsigned getOperandNumForIncomingValue(unsigned i) {
1075     return i*2;
1076   }
1077
1078   /// getIncomingBlock - Return incoming basic block number x
1079   ///
1080   BasicBlock *getIncomingBlock(unsigned i) const {
1081     return reinterpret_cast<BasicBlock*>(getOperand(i*2+1));
1082   }
1083   void setIncomingBlock(unsigned i, BasicBlock *BB) {
1084     setOperand(i*2+1, reinterpret_cast<Value*>(BB));
1085   }
1086   unsigned getOperandNumForIncomingBlock(unsigned i) {
1087     return i*2+1;
1088   }
1089
1090   /// addIncoming - Add an incoming value to the end of the PHI list
1091   ///
1092   void addIncoming(Value *V, BasicBlock *BB) {
1093     assert(getType() == V->getType() &&
1094            "All operands to PHI node must be the same type as the PHI node!");
1095     unsigned OpNo = NumOperands;
1096     if (OpNo+2 > ReservedSpace)
1097       resizeOperands(0);  // Get more space!
1098     // Initialize some new operands.
1099     NumOperands = OpNo+2;
1100     OperandList[OpNo].init(V, this);
1101     OperandList[OpNo+1].init(reinterpret_cast<Value*>(BB), this);
1102   }
1103
1104   /// removeIncomingValue - Remove an incoming value.  This is useful if a
1105   /// predecessor basic block is deleted.  The value removed is returned.
1106   ///
1107   /// If the last incoming value for a PHI node is removed (and DeletePHIIfEmpty
1108   /// is true), the PHI node is destroyed and any uses of it are replaced with
1109   /// dummy values.  The only time there should be zero incoming values to a PHI
1110   /// node is when the block is dead, so this strategy is sound.
1111   ///
1112   Value *removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty = true);
1113
1114   Value *removeIncomingValue(const BasicBlock *BB, bool DeletePHIIfEmpty =true){
1115     int Idx = getBasicBlockIndex(BB);
1116     assert(Idx >= 0 && "Invalid basic block argument to remove!");
1117     return removeIncomingValue(Idx, DeletePHIIfEmpty);
1118   }
1119
1120   /// getBasicBlockIndex - Return the first index of the specified basic
1121   /// block in the value list for this PHI.  Returns -1 if no instance.
1122   ///
1123   int getBasicBlockIndex(const BasicBlock *BB) const {
1124     Use *OL = OperandList;
1125     for (unsigned i = 0, e = getNumOperands(); i != e; i += 2)
1126       if (OL[i+1] == reinterpret_cast<const Value*>(BB)) return i/2;
1127     return -1;
1128   }
1129
1130   Value *getIncomingValueForBlock(const BasicBlock *BB) const {
1131     return getIncomingValue(getBasicBlockIndex(BB));
1132   }
1133
1134   /// hasConstantValue - If the specified PHI node always merges together the
1135   /// same value, return the value, otherwise return null.
1136   ///
1137   Value *hasConstantValue(bool AllowNonDominatingInstruction = false) const;
1138
1139   /// Methods for support type inquiry through isa, cast, and dyn_cast:
1140   static inline bool classof(const PHINode *) { return true; }
1141   static inline bool classof(const Instruction *I) {
1142     return I->getOpcode() == Instruction::PHI;
1143   }
1144   static inline bool classof(const Value *V) {
1145     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1146   }
1147  private:
1148   void resizeOperands(unsigned NumOperands);
1149 };
1150
1151 //===----------------------------------------------------------------------===//
1152 //                               ReturnInst Class
1153 //===----------------------------------------------------------------------===//
1154
1155 //===---------------------------------------------------------------------------
1156 /// ReturnInst - Return a value (possibly void), from a function.  Execution
1157 /// does not continue in this function any longer.
1158 ///
1159 class ReturnInst : public TerminatorInst {
1160   Use RetVal;  // Possibly null retval.
1161   ReturnInst(const ReturnInst &RI) : TerminatorInst(Instruction::Ret, &RetVal,
1162                                                     RI.getNumOperands()) {
1163     if (RI.getNumOperands())
1164       RetVal.init(RI.RetVal, this);
1165   }
1166
1167   void init(Value *RetVal);
1168
1169 public:
1170   // ReturnInst constructors:
1171   // ReturnInst()                  - 'ret void' instruction
1172   // ReturnInst(    null)          - 'ret void' instruction
1173   // ReturnInst(Value* X)          - 'ret X'    instruction
1174   // ReturnInst(    null, Inst *)  - 'ret void' instruction, insert before I
1175   // ReturnInst(Value* X, Inst *I) - 'ret X'    instruction, insert before I
1176   // ReturnInst(    null, BB *B)   - 'ret void' instruction, insert @ end of BB
1177   // ReturnInst(Value* X, BB *B)   - 'ret X'    instruction, insert @ end of BB
1178   //
1179   // NOTE: If the Value* passed is of type void then the constructor behaves as
1180   // if it was passed NULL.
1181   explicit ReturnInst(Value *retVal = 0, Instruction *InsertBefore = 0)
1182     : TerminatorInst(Instruction::Ret, &RetVal, 0, InsertBefore) {
1183     init(retVal);
1184   }
1185   ReturnInst(Value *retVal, BasicBlock *InsertAtEnd)
1186     : TerminatorInst(Instruction::Ret, &RetVal, 0, InsertAtEnd) {
1187     init(retVal);
1188   }
1189   explicit ReturnInst(BasicBlock *InsertAtEnd)
1190     : TerminatorInst(Instruction::Ret, &RetVal, 0, InsertAtEnd) {
1191   }
1192
1193   virtual ReturnInst *clone() const;
1194
1195   // Transparently provide more efficient getOperand methods.
1196   Value *getOperand(unsigned i) const {
1197     assert(i < getNumOperands() && "getOperand() out of range!");
1198     return RetVal;
1199   }
1200   void setOperand(unsigned i, Value *Val) {
1201     assert(i < getNumOperands() && "setOperand() out of range!");
1202     RetVal = Val;
1203   }
1204
1205   Value *getReturnValue() const { return RetVal; }
1206
1207   unsigned getNumSuccessors() const { return 0; }
1208
1209   // Methods for support type inquiry through isa, cast, and dyn_cast:
1210   static inline bool classof(const ReturnInst *) { return true; }
1211   static inline bool classof(const Instruction *I) {
1212     return (I->getOpcode() == Instruction::Ret);
1213   }
1214   static inline bool classof(const Value *V) {
1215     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1216   }
1217  private:
1218   virtual BasicBlock *getSuccessorV(unsigned idx) const;
1219   virtual unsigned getNumSuccessorsV() const;
1220   virtual void setSuccessorV(unsigned idx, BasicBlock *B);
1221 };
1222
1223 //===----------------------------------------------------------------------===//
1224 //                               BranchInst Class
1225 //===----------------------------------------------------------------------===//
1226
1227 //===---------------------------------------------------------------------------
1228 /// BranchInst - Conditional or Unconditional Branch instruction.
1229 ///
1230 class BranchInst : public TerminatorInst {
1231   /// Ops list - Branches are strange.  The operands are ordered:
1232   ///  TrueDest, FalseDest, Cond.  This makes some accessors faster because
1233   /// they don't have to check for cond/uncond branchness.
1234   Use Ops[3];
1235   BranchInst(const BranchInst &BI);
1236   void AssertOK();
1237 public:
1238   // BranchInst constructors (where {B, T, F} are blocks, and C is a condition):
1239   // BranchInst(BB *B)                           - 'br B'
1240   // BranchInst(BB* T, BB *F, Value *C)          - 'br C, T, F'
1241   // BranchInst(BB* B, Inst *I)                  - 'br B'        insert before I
1242   // BranchInst(BB* T, BB *F, Value *C, Inst *I) - 'br C, T, F', insert before I
1243   // BranchInst(BB* B, BB *I)                    - 'br B'        insert at end
1244   // BranchInst(BB* T, BB *F, Value *C, BB *I)   - 'br C, T, F', insert at end
1245   explicit BranchInst(BasicBlock *IfTrue, Instruction *InsertBefore = 0)
1246     : TerminatorInst(Instruction::Br, Ops, 1, InsertBefore) {
1247     assert(IfTrue != 0 && "Branch destination may not be null!");
1248     Ops[0].init(reinterpret_cast<Value*>(IfTrue), this);
1249   }
1250   BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *Cond,
1251              Instruction *InsertBefore = 0)
1252     : TerminatorInst(Instruction::Br, Ops, 3, InsertBefore) {
1253     Ops[0].init(reinterpret_cast<Value*>(IfTrue), this);
1254     Ops[1].init(reinterpret_cast<Value*>(IfFalse), this);
1255     Ops[2].init(Cond, this);
1256 #ifndef NDEBUG
1257     AssertOK();
1258 #endif
1259   }
1260
1261   BranchInst(BasicBlock *IfTrue, BasicBlock *InsertAtEnd)
1262     : TerminatorInst(Instruction::Br, Ops, 1, InsertAtEnd) {
1263     assert(IfTrue != 0 && "Branch destination may not be null!");
1264     Ops[0].init(reinterpret_cast<Value*>(IfTrue), this);
1265   }
1266
1267   BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *Cond,
1268              BasicBlock *InsertAtEnd)
1269     : TerminatorInst(Instruction::Br, Ops, 3, InsertAtEnd) {
1270     Ops[0].init(reinterpret_cast<Value*>(IfTrue), this);
1271     Ops[1].init(reinterpret_cast<Value*>(IfFalse), this);
1272     Ops[2].init(Cond, this);
1273 #ifndef NDEBUG
1274     AssertOK();
1275 #endif
1276   }
1277
1278
1279   /// Transparently provide more efficient getOperand methods.
1280   Value *getOperand(unsigned i) const {
1281     assert(i < getNumOperands() && "getOperand() out of range!");
1282     return Ops[i];
1283   }
1284   void setOperand(unsigned i, Value *Val) {
1285     assert(i < getNumOperands() && "setOperand() out of range!");
1286     Ops[i] = Val;
1287   }
1288
1289   virtual BranchInst *clone() const;
1290
1291   inline bool isUnconditional() const { return getNumOperands() == 1; }
1292   inline bool isConditional()   const { return getNumOperands() == 3; }
1293
1294   inline Value *getCondition() const {
1295     assert(isConditional() && "Cannot get condition of an uncond branch!");
1296     return getOperand(2);
1297   }
1298
1299   void setCondition(Value *V) {
1300     assert(isConditional() && "Cannot set condition of unconditional branch!");
1301     setOperand(2, V);
1302   }
1303
1304   // setUnconditionalDest - Change the current branch to an unconditional branch
1305   // targeting the specified block.
1306   // FIXME: Eliminate this ugly method.
1307   void setUnconditionalDest(BasicBlock *Dest) {
1308     if (isConditional()) {  // Convert this to an uncond branch.
1309       NumOperands = 1;
1310       Ops[1].set(0);
1311       Ops[2].set(0);
1312     }
1313     setOperand(0, reinterpret_cast<Value*>(Dest));
1314   }
1315
1316   unsigned getNumSuccessors() const { return 1+isConditional(); }
1317
1318   BasicBlock *getSuccessor(unsigned i) const {
1319     assert(i < getNumSuccessors() && "Successor # out of range for Branch!");
1320     return (i == 0) ? cast<BasicBlock>(getOperand(0)) :
1321                       cast<BasicBlock>(getOperand(1));
1322   }
1323
1324   void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
1325     assert(idx < getNumSuccessors() && "Successor # out of range for Branch!");
1326     setOperand(idx, reinterpret_cast<Value*>(NewSucc));
1327   }
1328
1329   // Methods for support type inquiry through isa, cast, and dyn_cast:
1330   static inline bool classof(const BranchInst *) { return true; }
1331   static inline bool classof(const Instruction *I) {
1332     return (I->getOpcode() == Instruction::Br);
1333   }
1334   static inline bool classof(const Value *V) {
1335     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1336   }
1337 private:
1338   virtual BasicBlock *getSuccessorV(unsigned idx) const;
1339   virtual unsigned getNumSuccessorsV() const;
1340   virtual void setSuccessorV(unsigned idx, BasicBlock *B);
1341 };
1342
1343 //===----------------------------------------------------------------------===//
1344 //                               SwitchInst Class
1345 //===----------------------------------------------------------------------===//
1346
1347 //===---------------------------------------------------------------------------
1348 /// SwitchInst - Multiway switch
1349 ///
1350 class SwitchInst : public TerminatorInst {
1351   unsigned ReservedSpace;
1352   // Operand[0]    = Value to switch on
1353   // Operand[1]    = Default basic block destination
1354   // Operand[2n  ] = Value to match
1355   // Operand[2n+1] = BasicBlock to go to on match
1356   SwitchInst(const SwitchInst &RI);
1357   void init(Value *Value, BasicBlock *Default, unsigned NumCases);
1358   void resizeOperands(unsigned No);
1359 public:
1360   /// SwitchInst ctor - Create a new switch instruction, specifying a value to
1361   /// switch on and a default destination.  The number of additional cases can
1362   /// be specified here to make memory allocation more efficient.  This
1363   /// constructor can also autoinsert before another instruction.
1364   SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases,
1365              Instruction *InsertBefore = 0)
1366     : TerminatorInst(Instruction::Switch, 0, 0, InsertBefore) {
1367     init(Value, Default, NumCases);
1368   }
1369
1370   /// SwitchInst ctor - Create a new switch instruction, specifying a value to
1371   /// switch on and a default destination.  The number of additional cases can
1372   /// be specified here to make memory allocation more efficient.  This
1373   /// constructor also autoinserts at the end of the specified BasicBlock.
1374   SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases,
1375              BasicBlock *InsertAtEnd)
1376     : TerminatorInst(Instruction::Switch, 0, 0, InsertAtEnd) {
1377     init(Value, Default, NumCases);
1378   }
1379   ~SwitchInst();
1380
1381
1382   // Accessor Methods for Switch stmt
1383   inline Value *getCondition() const { return getOperand(0); }
1384   void setCondition(Value *V) { setOperand(0, V); }
1385
1386   inline BasicBlock *getDefaultDest() const {
1387     return cast<BasicBlock>(getOperand(1));
1388   }
1389
1390   /// getNumCases - return the number of 'cases' in this switch instruction.
1391   /// Note that case #0 is always the default case.
1392   unsigned getNumCases() const {
1393     return getNumOperands()/2;
1394   }
1395
1396   /// getCaseValue - Return the specified case value.  Note that case #0, the
1397   /// default destination, does not have a case value.
1398   ConstantInt *getCaseValue(unsigned i) {
1399     assert(i && i < getNumCases() && "Illegal case value to get!");
1400     return getSuccessorValue(i);
1401   }
1402
1403   /// getCaseValue - Return the specified case value.  Note that case #0, the
1404   /// default destination, does not have a case value.
1405   const ConstantInt *getCaseValue(unsigned i) const {
1406     assert(i && i < getNumCases() && "Illegal case value to get!");
1407     return getSuccessorValue(i);
1408   }
1409
1410   /// findCaseValue - Search all of the case values for the specified constant.
1411   /// If it is explicitly handled, return the case number of it, otherwise
1412   /// return 0 to indicate that it is handled by the default handler.
1413   unsigned findCaseValue(const ConstantInt *C) const {
1414     for (unsigned i = 1, e = getNumCases(); i != e; ++i)
1415       if (getCaseValue(i) == C)
1416         return i;
1417     return 0;
1418   }
1419
1420   /// findCaseDest - Finds the unique case value for a given successor. Returns
1421   /// null if the successor is not found, not unique, or is the default case.
1422   ConstantInt *findCaseDest(BasicBlock *BB) {
1423     if (BB == getDefaultDest()) return NULL;
1424
1425     ConstantInt *CI = NULL;
1426     for (unsigned i = 1, e = getNumCases(); i != e; ++i) {
1427       if (getSuccessor(i) == BB) {
1428         if (CI) return NULL;   // Multiple cases lead to BB.
1429         else CI = getCaseValue(i);
1430       }
1431     }
1432     return CI;
1433   }
1434
1435   /// addCase - Add an entry to the switch instruction...
1436   ///
1437   void addCase(ConstantInt *OnVal, BasicBlock *Dest);
1438
1439   /// removeCase - This method removes the specified successor from the switch
1440   /// instruction.  Note that this cannot be used to remove the default
1441   /// destination (successor #0).
1442   ///
1443   void removeCase(unsigned idx);
1444
1445   virtual SwitchInst *clone() const;
1446
1447   unsigned getNumSuccessors() const { return getNumOperands()/2; }
1448   BasicBlock *getSuccessor(unsigned idx) const {
1449     assert(idx < getNumSuccessors() &&"Successor idx out of range for switch!");
1450     return cast<BasicBlock>(getOperand(idx*2+1));
1451   }
1452   void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
1453     assert(idx < getNumSuccessors() && "Successor # out of range for switch!");
1454     setOperand(idx*2+1, reinterpret_cast<Value*>(NewSucc));
1455   }
1456
1457   // getSuccessorValue - Return the value associated with the specified
1458   // successor.
1459   inline ConstantInt *getSuccessorValue(unsigned idx) const {
1460     assert(idx < getNumSuccessors() && "Successor # out of range!");
1461     return reinterpret_cast<ConstantInt*>(getOperand(idx*2));
1462   }
1463
1464   // Methods for support type inquiry through isa, cast, and dyn_cast:
1465   static inline bool classof(const SwitchInst *) { return true; }
1466   static inline bool classof(const Instruction *I) {
1467     return I->getOpcode() == Instruction::Switch;
1468   }
1469   static inline bool classof(const Value *V) {
1470     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1471   }
1472 private:
1473   virtual BasicBlock *getSuccessorV(unsigned idx) const;
1474   virtual unsigned getNumSuccessorsV() const;
1475   virtual void setSuccessorV(unsigned idx, BasicBlock *B);
1476 };
1477
1478 //===----------------------------------------------------------------------===//
1479 //                               InvokeInst Class
1480 //===----------------------------------------------------------------------===//
1481
1482 //===---------------------------------------------------------------------------
1483
1484 /// InvokeInst - Invoke instruction.  The SubclassData field is used to hold the
1485 /// calling convention of the call.
1486 ///
1487 class InvokeInst : public TerminatorInst {
1488   InvokeInst(const InvokeInst &BI);
1489   void init(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
1490             const std::vector<Value*> &Params);
1491 public:
1492   InvokeInst(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
1493              const std::vector<Value*> &Params, const std::string &Name = "",
1494              Instruction *InsertBefore = 0);
1495   InvokeInst(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
1496              const std::vector<Value*> &Params, const std::string &Name,
1497              BasicBlock *InsertAtEnd);
1498   ~InvokeInst();
1499
1500   virtual InvokeInst *clone() const;
1501
1502   bool mayWriteToMemory() const { return true; }
1503
1504   /// getCallingConv/setCallingConv - Get or set the calling convention of this
1505   /// function call.
1506   unsigned getCallingConv() const { return SubclassData; }
1507   void setCallingConv(unsigned CC) {
1508     SubclassData = CC;
1509   }
1510
1511   /// getCalledFunction - Return the function called, or null if this is an
1512   /// indirect function invocation.
1513   ///
1514   Function *getCalledFunction() const {
1515     return dyn_cast<Function>(getOperand(0));
1516   }
1517
1518   // getCalledValue - Get a pointer to a function that is invoked by this inst.
1519   inline Value *getCalledValue() const { return getOperand(0); }
1520
1521   // get*Dest - Return the destination basic blocks...
1522   BasicBlock *getNormalDest() const {
1523     return cast<BasicBlock>(getOperand(1));
1524   }
1525   BasicBlock *getUnwindDest() const {
1526     return cast<BasicBlock>(getOperand(2));
1527   }
1528   void setNormalDest(BasicBlock *B) {
1529     setOperand(1, reinterpret_cast<Value*>(B));
1530   }
1531
1532   void setUnwindDest(BasicBlock *B) {
1533     setOperand(2, reinterpret_cast<Value*>(B));
1534   }
1535
1536   inline BasicBlock *getSuccessor(unsigned i) const {
1537     assert(i < 2 && "Successor # out of range for invoke!");
1538     return i == 0 ? getNormalDest() : getUnwindDest();
1539   }
1540
1541   void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
1542     assert(idx < 2 && "Successor # out of range for invoke!");
1543     setOperand(idx+1, reinterpret_cast<Value*>(NewSucc));
1544   }
1545
1546   unsigned getNumSuccessors() const { return 2; }
1547
1548   // Methods for support type inquiry through isa, cast, and dyn_cast:
1549   static inline bool classof(const InvokeInst *) { return true; }
1550   static inline bool classof(const Instruction *I) {
1551     return (I->getOpcode() == Instruction::Invoke);
1552   }
1553   static inline bool classof(const Value *V) {
1554     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1555   }
1556 private:
1557   virtual BasicBlock *getSuccessorV(unsigned idx) const;
1558   virtual unsigned getNumSuccessorsV() const;
1559   virtual void setSuccessorV(unsigned idx, BasicBlock *B);
1560 };
1561
1562
1563 //===----------------------------------------------------------------------===//
1564 //                              UnwindInst Class
1565 //===----------------------------------------------------------------------===//
1566
1567 //===---------------------------------------------------------------------------
1568 /// UnwindInst - Immediately exit the current function, unwinding the stack
1569 /// until an invoke instruction is found.
1570 ///
1571 class UnwindInst : public TerminatorInst {
1572 public:
1573   explicit UnwindInst(Instruction *InsertBefore = 0)
1574     : TerminatorInst(Instruction::Unwind, 0, 0, InsertBefore) {
1575   }
1576   explicit UnwindInst(BasicBlock *InsertAtEnd)
1577     : TerminatorInst(Instruction::Unwind, 0, 0, InsertAtEnd) {
1578   }
1579
1580   virtual UnwindInst *clone() const;
1581
1582   unsigned getNumSuccessors() const { return 0; }
1583
1584   // Methods for support type inquiry through isa, cast, and dyn_cast:
1585   static inline bool classof(const UnwindInst *) { return true; }
1586   static inline bool classof(const Instruction *I) {
1587     return I->getOpcode() == Instruction::Unwind;
1588   }
1589   static inline bool classof(const Value *V) {
1590     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1591   }
1592 private:
1593   virtual BasicBlock *getSuccessorV(unsigned idx) const;
1594   virtual unsigned getNumSuccessorsV() const;
1595   virtual void setSuccessorV(unsigned idx, BasicBlock *B);
1596 };
1597
1598 //===----------------------------------------------------------------------===//
1599 //                           UnreachableInst Class
1600 //===----------------------------------------------------------------------===//
1601
1602 //===---------------------------------------------------------------------------
1603 /// UnreachableInst - This function has undefined behavior.  In particular, the
1604 /// presence of this instruction indicates some higher level knowledge that the
1605 /// end of the block cannot be reached.
1606 ///
1607 class UnreachableInst : public TerminatorInst {
1608 public:
1609   explicit UnreachableInst(Instruction *InsertBefore = 0)
1610     : TerminatorInst(Instruction::Unreachable, 0, 0, InsertBefore) {
1611   }
1612   explicit UnreachableInst(BasicBlock *InsertAtEnd)
1613     : TerminatorInst(Instruction::Unreachable, 0, 0, InsertAtEnd) {
1614   }
1615
1616   virtual UnreachableInst *clone() const;
1617
1618   unsigned getNumSuccessors() const { return 0; }
1619
1620   // Methods for support type inquiry through isa, cast, and dyn_cast:
1621   static inline bool classof(const UnreachableInst *) { return true; }
1622   static inline bool classof(const Instruction *I) {
1623     return I->getOpcode() == Instruction::Unreachable;
1624   }
1625   static inline bool classof(const Value *V) {
1626     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1627   }
1628 private:
1629   virtual BasicBlock *getSuccessorV(unsigned idx) const;
1630   virtual unsigned getNumSuccessorsV() const;
1631   virtual void setSuccessorV(unsigned idx, BasicBlock *B);
1632 };
1633
1634 //===----------------------------------------------------------------------===//
1635 //                                 TruncInst Class
1636 //===----------------------------------------------------------------------===//
1637
1638 /// @brief This class represents a truncation of integer types.
1639 class TruncInst : public CastInst {
1640   /// Private copy constructor
1641   TruncInst(const TruncInst &CI)
1642     : CastInst(CI.getType(), Trunc, CI.getOperand(0)) {
1643   }
1644 public:
1645   /// @brief Constructor with insert-before-instruction semantics
1646   TruncInst(
1647     Value *S,                     ///< The value to be truncated
1648     const Type *Ty,               ///< The (smaller) type to truncate to
1649     const std::string &Name = "", ///< A name for the new instruction
1650     Instruction *InsertBefore = 0 ///< Where to insert the new instruction
1651   );
1652
1653   /// @brief Constructor with insert-at-end-of-block semantics
1654   TruncInst(
1655     Value *S,                     ///< The value to be truncated
1656     const Type *Ty,               ///< The (smaller) type to truncate to
1657     const std::string &Name,      ///< A name for the new instruction
1658     BasicBlock *InsertAtEnd       ///< The block to insert the instruction into
1659   );
1660
1661   /// @brief Clone an identical TruncInst
1662   virtual CastInst *clone() const;
1663
1664   /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
1665   static inline bool classof(const TruncInst *) { return true; }
1666   static inline bool classof(const Instruction *I) {
1667     return I->getOpcode() == Trunc;
1668   }
1669   static inline bool classof(const Value *V) {
1670     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1671   }
1672 };
1673
1674 //===----------------------------------------------------------------------===//
1675 //                                 ZExtInst Class
1676 //===----------------------------------------------------------------------===//
1677
1678 /// @brief This class represents zero extension of integer types.
1679 class ZExtInst : public CastInst {
1680   /// @brief Private copy constructor
1681   ZExtInst(const ZExtInst &CI)
1682     : CastInst(CI.getType(), ZExt, CI.getOperand(0)) {
1683   }
1684 public:
1685   /// @brief Constructor with insert-before-instruction semantics
1686   ZExtInst(
1687     Value *S,                     ///< The value to be zero extended
1688     const Type *Ty,               ///< The type to zero extend to
1689     const std::string &Name = "", ///< A name for the new instruction
1690     Instruction *InsertBefore = 0 ///< Where to insert the new instruction
1691   );
1692
1693   /// @brief Constructor with insert-at-end semantics.
1694   ZExtInst(
1695     Value *S,                     ///< The value to be zero extended
1696     const Type *Ty,               ///< The type to zero extend to
1697     const std::string &Name,      ///< A name for the new instruction
1698     BasicBlock *InsertAtEnd       ///< The block to insert the instruction into
1699   );
1700
1701   /// @brief Clone an identical ZExtInst
1702   virtual CastInst *clone() const;
1703
1704   /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
1705   static inline bool classof(const ZExtInst *) { return true; }
1706   static inline bool classof(const Instruction *I) {
1707     return I->getOpcode() == ZExt;
1708   }
1709   static inline bool classof(const Value *V) {
1710     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1711   }
1712 };
1713
1714 //===----------------------------------------------------------------------===//
1715 //                                 SExtInst Class
1716 //===----------------------------------------------------------------------===//
1717
1718 /// @brief This class represents a sign extension of integer types.
1719 class SExtInst : public CastInst {
1720   /// @brief Private copy constructor
1721   SExtInst(const SExtInst &CI)
1722     : CastInst(CI.getType(), SExt, CI.getOperand(0)) {
1723   }
1724 public:
1725   /// @brief Constructor with insert-before-instruction semantics
1726   SExtInst(
1727     Value *S,                     ///< The value to be sign extended
1728     const Type *Ty,               ///< The type to sign extend to
1729     const std::string &Name = "", ///< A name for the new instruction
1730     Instruction *InsertBefore = 0 ///< Where to insert the new instruction
1731   );
1732
1733   /// @brief Constructor with insert-at-end-of-block semantics
1734   SExtInst(
1735     Value *S,                     ///< The value to be sign extended
1736     const Type *Ty,               ///< The type to sign extend to
1737     const std::string &Name,      ///< A name for the new instruction
1738     BasicBlock *InsertAtEnd       ///< The block to insert the instruction into
1739   );
1740
1741   /// @brief Clone an identical SExtInst
1742   virtual CastInst *clone() const;
1743
1744   /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
1745   static inline bool classof(const SExtInst *) { return true; }
1746   static inline bool classof(const Instruction *I) {
1747     return I->getOpcode() == SExt;
1748   }
1749   static inline bool classof(const Value *V) {
1750     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1751   }
1752 };
1753
1754 //===----------------------------------------------------------------------===//
1755 //                                 FPTruncInst Class
1756 //===----------------------------------------------------------------------===//
1757
1758 /// @brief This class represents a truncation of floating point types.
1759 class FPTruncInst : public CastInst {
1760   FPTruncInst(const FPTruncInst &CI)
1761     : CastInst(CI.getType(), FPTrunc, CI.getOperand(0)) {
1762   }
1763 public:
1764   /// @brief Constructor with insert-before-instruction semantics
1765   FPTruncInst(
1766     Value *S,                     ///< The value to be truncated
1767     const Type *Ty,               ///< The type to truncate to
1768     const std::string &Name = "", ///< A name for the new instruction
1769     Instruction *InsertBefore = 0 ///< Where to insert the new instruction
1770   );
1771
1772   /// @brief Constructor with insert-before-instruction semantics
1773   FPTruncInst(
1774     Value *S,                     ///< The value to be truncated
1775     const Type *Ty,               ///< The type to truncate to
1776     const std::string &Name,      ///< A name for the new instruction
1777     BasicBlock *InsertAtEnd       ///< The block to insert the instruction into
1778   );
1779
1780   /// @brief Clone an identical FPTruncInst
1781   virtual CastInst *clone() const;
1782
1783   /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
1784   static inline bool classof(const FPTruncInst *) { return true; }
1785   static inline bool classof(const Instruction *I) {
1786     return I->getOpcode() == FPTrunc;
1787   }
1788   static inline bool classof(const Value *V) {
1789     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1790   }
1791 };
1792
1793 //===----------------------------------------------------------------------===//
1794 //                                 FPExtInst Class
1795 //===----------------------------------------------------------------------===//
1796
1797 /// @brief This class represents an extension of floating point types.
1798 class FPExtInst : public CastInst {
1799   FPExtInst(const FPExtInst &CI)
1800     : CastInst(CI.getType(), FPExt, CI.getOperand(0)) {
1801   }
1802 public:
1803   /// @brief Constructor with insert-before-instruction semantics
1804   FPExtInst(
1805     Value *S,                     ///< The value to be extended
1806     const Type *Ty,               ///< The type to extend to
1807     const std::string &Name = "", ///< A name for the new instruction
1808     Instruction *InsertBefore = 0 ///< Where to insert the new instruction
1809   );
1810
1811   /// @brief Constructor with insert-at-end-of-block semantics
1812   FPExtInst(
1813     Value *S,                     ///< The value to be extended
1814     const Type *Ty,               ///< The type to extend to
1815     const std::string &Name,      ///< A name for the new instruction
1816     BasicBlock *InsertAtEnd       ///< The block to insert the instruction into
1817   );
1818
1819   /// @brief Clone an identical FPExtInst
1820   virtual CastInst *clone() const;
1821
1822   /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
1823   static inline bool classof(const FPExtInst *) { return true; }
1824   static inline bool classof(const Instruction *I) {
1825     return I->getOpcode() == FPExt;
1826   }
1827   static inline bool classof(const Value *V) {
1828     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1829   }
1830 };
1831
1832 //===----------------------------------------------------------------------===//
1833 //                                 UIToFPInst Class
1834 //===----------------------------------------------------------------------===//
1835
1836 /// @brief This class represents a cast unsigned integer to floating point.
1837 class UIToFPInst : public CastInst {
1838   UIToFPInst(const UIToFPInst &CI)
1839     : CastInst(CI.getType(), UIToFP, CI.getOperand(0)) {
1840   }
1841 public:
1842   /// @brief Constructor with insert-before-instruction semantics
1843   UIToFPInst(
1844     Value *S,                     ///< The value to be converted
1845     const Type *Ty,               ///< The type to convert to
1846     const std::string &Name = "", ///< A name for the new instruction
1847     Instruction *InsertBefore = 0 ///< Where to insert the new instruction
1848   );
1849
1850   /// @brief Constructor with insert-at-end-of-block semantics
1851   UIToFPInst(
1852     Value *S,                     ///< The value to be converted
1853     const Type *Ty,               ///< The type to convert to
1854     const std::string &Name,      ///< A name for the new instruction
1855     BasicBlock *InsertAtEnd       ///< The block to insert the instruction into
1856   );
1857
1858   /// @brief Clone an identical UIToFPInst
1859   virtual CastInst *clone() const;
1860
1861   /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
1862   static inline bool classof(const UIToFPInst *) { return true; }
1863   static inline bool classof(const Instruction *I) {
1864     return I->getOpcode() == UIToFP;
1865   }
1866   static inline bool classof(const Value *V) {
1867     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1868   }
1869 };
1870
1871 //===----------------------------------------------------------------------===//
1872 //                                 SIToFPInst Class
1873 //===----------------------------------------------------------------------===//
1874
1875 /// @brief This class represents a cast from signed integer to floating point.
1876 class SIToFPInst : public CastInst {
1877   SIToFPInst(const SIToFPInst &CI)
1878     : CastInst(CI.getType(), SIToFP, CI.getOperand(0)) {
1879   }
1880 public:
1881   /// @brief Constructor with insert-before-instruction semantics
1882   SIToFPInst(
1883     Value *S,                     ///< The value to be converted
1884     const Type *Ty,               ///< The type to convert to
1885     const std::string &Name = "", ///< A name for the new instruction
1886     Instruction *InsertBefore = 0 ///< Where to insert the new instruction
1887   );
1888
1889   /// @brief Constructor with insert-at-end-of-block semantics
1890   SIToFPInst(
1891     Value *S,                     ///< The value to be converted
1892     const Type *Ty,               ///< The type to convert to
1893     const std::string &Name,      ///< A name for the new instruction
1894     BasicBlock *InsertAtEnd       ///< The block to insert the instruction into
1895   );
1896
1897   /// @brief Clone an identical SIToFPInst
1898   virtual CastInst *clone() const;
1899
1900   /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
1901   static inline bool classof(const SIToFPInst *) { return true; }
1902   static inline bool classof(const Instruction *I) {
1903     return I->getOpcode() == SIToFP;
1904   }
1905   static inline bool classof(const Value *V) {
1906     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1907   }
1908 };
1909
1910 //===----------------------------------------------------------------------===//
1911 //                                 FPToUIInst Class
1912 //===----------------------------------------------------------------------===//
1913
1914 /// @brief This class represents a cast from floating point to unsigned integer
1915 class FPToUIInst  : public CastInst {
1916   FPToUIInst(const FPToUIInst &CI)
1917     : CastInst(CI.getType(), FPToUI, CI.getOperand(0)) {
1918   }
1919 public:
1920   /// @brief Constructor with insert-before-instruction semantics
1921   FPToUIInst(
1922     Value *S,                     ///< The value to be converted
1923     const Type *Ty,               ///< The type to convert to
1924     const std::string &Name = "", ///< A name for the new instruction
1925     Instruction *InsertBefore = 0 ///< Where to insert the new instruction
1926   );
1927
1928   /// @brief Constructor with insert-at-end-of-block semantics
1929   FPToUIInst(
1930     Value *S,                     ///< The value to be converted
1931     const Type *Ty,               ///< The type to convert to
1932     const std::string &Name,      ///< A name for the new instruction
1933     BasicBlock *InsertAtEnd       ///< Where to insert the new instruction
1934   );
1935
1936   /// @brief Clone an identical FPToUIInst
1937   virtual CastInst *clone() const;
1938
1939   /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
1940   static inline bool classof(const FPToUIInst *) { return true; }
1941   static inline bool classof(const Instruction *I) {
1942     return I->getOpcode() == FPToUI;
1943   }
1944   static inline bool classof(const Value *V) {
1945     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1946   }
1947 };
1948
1949 //===----------------------------------------------------------------------===//
1950 //                                 FPToSIInst Class
1951 //===----------------------------------------------------------------------===//
1952
1953 /// @brief This class represents a cast from floating point to signed integer.
1954 class FPToSIInst  : public CastInst {
1955   FPToSIInst(const FPToSIInst &CI)
1956     : CastInst(CI.getType(), FPToSI, CI.getOperand(0)) {
1957   }
1958 public:
1959   /// @brief Constructor with insert-before-instruction semantics
1960   FPToSIInst(
1961     Value *S,                     ///< The value to be converted
1962     const Type *Ty,               ///< The type to convert to
1963     const std::string &Name = "", ///< A name for the new instruction
1964     Instruction *InsertBefore = 0 ///< Where to insert the new instruction
1965   );
1966
1967   /// @brief Constructor with insert-at-end-of-block semantics
1968   FPToSIInst(
1969     Value *S,                     ///< The value to be converted
1970     const Type *Ty,               ///< The type to convert to
1971     const std::string &Name,      ///< A name for the new instruction
1972     BasicBlock *InsertAtEnd       ///< The block to insert the instruction into
1973   );
1974
1975   /// @brief Clone an identical FPToSIInst
1976   virtual CastInst *clone() const;
1977
1978   /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
1979   static inline bool classof(const FPToSIInst *) { return true; }
1980   static inline bool classof(const Instruction *I) {
1981     return I->getOpcode() == FPToSI;
1982   }
1983   static inline bool classof(const Value *V) {
1984     return isa<Instruction>(V) && classof(cast<Instruction>(V));
1985   }
1986 };
1987
1988 //===----------------------------------------------------------------------===//
1989 //                                 IntToPtrInst Class
1990 //===----------------------------------------------------------------------===//
1991
1992 /// @brief This class represents a cast from an integer to a pointer.
1993 class IntToPtrInst : public CastInst {
1994   IntToPtrInst(const IntToPtrInst &CI)
1995     : CastInst(CI.getType(), IntToPtr, CI.getOperand(0)) {
1996   }
1997 public:
1998   /// @brief Constructor with insert-before-instruction semantics
1999   IntToPtrInst(
2000     Value *S,                     ///< The value to be converted
2001     const Type *Ty,               ///< The type to convert to
2002     const std::string &Name = "", ///< A name for the new instruction
2003     Instruction *InsertBefore = 0 ///< Where to insert the new instruction
2004   );
2005
2006   /// @brief Constructor with insert-at-end-of-block semantics
2007   IntToPtrInst(
2008     Value *S,                     ///< The value to be converted
2009     const Type *Ty,               ///< The type to convert to
2010     const std::string &Name,      ///< A name for the new instruction
2011     BasicBlock *InsertAtEnd       ///< The block to insert the instruction into
2012   );
2013
2014   /// @brief Clone an identical IntToPtrInst
2015   virtual CastInst *clone() const;
2016
2017   // Methods for support type inquiry through isa, cast, and dyn_cast:
2018   static inline bool classof(const IntToPtrInst *) { return true; }
2019   static inline bool classof(const Instruction *I) {
2020     return I->getOpcode() == IntToPtr;
2021   }
2022   static inline bool classof(const Value *V) {
2023     return isa<Instruction>(V) && classof(cast<Instruction>(V));
2024   }
2025 };
2026
2027 //===----------------------------------------------------------------------===//
2028 //                                 PtrToIntInst Class
2029 //===----------------------------------------------------------------------===//
2030
2031 /// @brief This class represents a cast from a pointer to an integer
2032 class PtrToIntInst : public CastInst {
2033   PtrToIntInst(const PtrToIntInst &CI)
2034     : CastInst(CI.getType(), PtrToInt, CI.getOperand(0)) {
2035   }
2036 public:
2037   /// @brief Constructor with insert-before-instruction semantics
2038   PtrToIntInst(
2039     Value *S,                     ///< The value to be converted
2040     const Type *Ty,               ///< The type to convert to
2041     const std::string &Name = "", ///< A name for the new instruction
2042     Instruction *InsertBefore = 0 ///< Where to insert the new instruction
2043   );
2044
2045   /// @brief Constructor with insert-at-end-of-block semantics
2046   PtrToIntInst(
2047     Value *S,                     ///< The value to be converted
2048     const Type *Ty,               ///< The type to convert to
2049     const std::string &Name,      ///< A name for the new instruction
2050     BasicBlock *InsertAtEnd       ///< The block to insert the instruction into
2051   );
2052
2053   /// @brief Clone an identical PtrToIntInst
2054   virtual CastInst *clone() const;
2055
2056   // Methods for support type inquiry through isa, cast, and dyn_cast:
2057   static inline bool classof(const PtrToIntInst *) { return true; }
2058   static inline bool classof(const Instruction *I) {
2059     return I->getOpcode() == PtrToInt;
2060   }
2061   static inline bool classof(const Value *V) {
2062     return isa<Instruction>(V) && classof(cast<Instruction>(V));
2063   }
2064 };
2065
2066 //===----------------------------------------------------------------------===//
2067 //                             BitCastInst Class
2068 //===----------------------------------------------------------------------===//
2069
2070 /// @brief This class represents a no-op cast from one type to another.
2071 class BitCastInst : public CastInst {
2072   BitCastInst(const BitCastInst &CI)
2073     : CastInst(CI.getType(), BitCast, CI.getOperand(0)) {
2074   }
2075 public:
2076   /// @brief Constructor with insert-before-instruction semantics
2077   BitCastInst(
2078     Value *S,                     ///< The value to be casted
2079     const Type *Ty,               ///< The type to casted to
2080     const std::string &Name = "", ///< A name for the new instruction
2081     Instruction *InsertBefore = 0 ///< Where to insert the new instruction
2082   );
2083
2084   /// @brief Constructor with insert-at-end-of-block semantics
2085   BitCastInst(
2086     Value *S,                     ///< The value to be casted
2087     const Type *Ty,               ///< The type to casted to
2088     const std::string &Name,      ///< A name for the new instruction
2089     BasicBlock *InsertAtEnd       ///< The block to insert the instruction into
2090   );
2091
2092   /// @brief Clone an identical BitCastInst
2093   virtual CastInst *clone() const;
2094
2095   // Methods for support type inquiry through isa, cast, and dyn_cast:
2096   static inline bool classof(const BitCastInst *) { return true; }
2097   static inline bool classof(const Instruction *I) {
2098     return I->getOpcode() == BitCast;
2099   }
2100   static inline bool classof(const Value *V) {
2101     return isa<Instruction>(V) && classof(cast<Instruction>(V));
2102   }
2103 };
2104
2105 } // End llvm namespace
2106
2107 #endif