add a couple of enum values
[oota-llvm.git] / include / llvm / Instructions.h
index 904ca8f3784ef96f7782d0c0de05b828d32bdaf1..f94bffaa49f549ca142bd4233c53f217a7369488 100644 (file)
@@ -33,10 +33,11 @@ class PointerType;
 /// AllocaInst.
 ///
 class AllocationInst : public UnaryInstruction {
+  unsigned Alignment;
 protected:
-  AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy,
+  AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, unsigned Align,
                  const std::string &Name = "", Instruction *InsertBefore = 0);
-  AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy,
+  AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, unsigned Align,
                  const std::string &Name, BasicBlock *InsertAtEnd);
 
 public:
@@ -63,6 +64,15 @@ public:
   ///
   const Type *getAllocatedType() const;
 
+  /// getAlignment - Return the alignment of the memory that is being allocated
+  /// by the instruction.
+  ///
+  unsigned getAlignment() const { return Alignment; }
+  void setAlignment(unsigned Align) {
+    assert((Align & (Align-1)) == 0 && "Alignment is not a power of 2!");
+    Alignment = Align;
+  }
+  
   virtual Instruction *clone() const = 0;
 
   // Methods for support type inquiry through isa, cast, and dyn_cast:
@@ -89,11 +99,18 @@ public:
   explicit MallocInst(const Type *Ty, Value *ArraySize = 0,
                       const std::string &Name = "",
                       Instruction *InsertBefore = 0)
-    : AllocationInst(Ty, ArraySize, Malloc, Name, InsertBefore) {}
+    : AllocationInst(Ty, ArraySize, Malloc, 0, Name, InsertBefore) {}
   MallocInst(const Type *Ty, Value *ArraySize, const std::string &Name,
              BasicBlock *InsertAtEnd)
-    : AllocationInst(Ty, ArraySize, Malloc, Name, InsertAtEnd) {}
-
+    : AllocationInst(Ty, ArraySize, Malloc, 0, Name, InsertAtEnd) {}
+  MallocInst(const Type *Ty, Value *ArraySize, unsigned Align, 
+             const std::string &Name, BasicBlock *InsertAtEnd)
+  : AllocationInst(Ty, ArraySize, Malloc, Align, Name, InsertAtEnd) {}
+  explicit MallocInst(const Type *Ty, Value *ArraySize, unsigned Align,
+                      const std::string &Name = "",
+                      Instruction *InsertBefore = 0)
+  : AllocationInst(Ty, ArraySize, Malloc, Align, Name, InsertBefore) {}
+  
   virtual MallocInst *clone() const;
 
   // Methods for support type inquiry through isa, cast, and dyn_cast:
@@ -119,11 +136,18 @@ public:
   explicit AllocaInst(const Type *Ty, Value *ArraySize = 0,
                       const std::string &Name = "",
                       Instruction *InsertBefore = 0)
-    : AllocationInst(Ty, ArraySize, Alloca, Name, InsertBefore) {}
+    : AllocationInst(Ty, ArraySize, Alloca, 0, Name, InsertBefore) {}
   AllocaInst(const Type *Ty, Value *ArraySize, const std::string &Name,
              BasicBlock *InsertAtEnd)
-    : AllocationInst(Ty, ArraySize, Alloca, Name, InsertAtEnd) {}
-
+    : AllocationInst(Ty, ArraySize, Alloca, 0, Name, InsertAtEnd) {}
+  AllocaInst(const Type *Ty, Value *ArraySize, unsigned Align,
+             const std::string &Name, BasicBlock *InsertAtEnd)
+  : AllocationInst(Ty, ArraySize, Alloca, Align, Name, InsertAtEnd) {}
+  explicit AllocaInst(const Type *Ty, Value *ArraySize, unsigned Align,
+                      const std::string &Name = "",
+                      Instruction *InsertBefore = 0)
+  : AllocationInst(Ty, ArraySize, Alloca, Align, Name, InsertBefore) {}
+  
   virtual AllocaInst *clone() const;
 
   // Methods for support type inquiry through isa, cast, and dyn_cast:
@@ -660,75 +684,126 @@ public:
   }
 };
 
-
 //===----------------------------------------------------------------------===//
-//                                VANextInst Class
+//                                VAArgInst Class
 //===----------------------------------------------------------------------===//
 
-/// VANextInst - This class represents the va_next llvm instruction, which
-/// advances a vararg list passed an argument of the specified type, returning
-/// the resultant list.
+/// VAArgInst - This class represents the va_arg llvm instruction, which returns
+/// an argument of the specified type given a va_list and increments that list
 ///
-class VANextInst : public UnaryInstruction {
-  PATypeHolder ArgTy;
-  VANextInst(const VANextInst &VAN)
-    : UnaryInstruction(VAN.getType(), VANext, VAN.getOperand(0)),
-      ArgTy(VAN.getArgType()) {
-  }
-
+class VAArgInst : public UnaryInstruction {
+  VAArgInst(const VAArgInst &VAA)
+    : UnaryInstruction(VAA.getType(), VAArg, VAA.getOperand(0)) {}
 public:
-  VANextInst(Value *List, const Type *Ty, const std::string &Name = "",
+  VAArgInst(Value *List, const Type *Ty, const std::string &Name = "",
              Instruction *InsertBefore = 0)
-    : UnaryInstruction(List->getType(), VANext, List, Name, InsertBefore),
-      ArgTy(Ty) {
+    : UnaryInstruction(Ty, VAArg, List, Name, InsertBefore) {
   }
-  VANextInst(Value *List, const Type *Ty, const std::string &Name,
-             BasicBlock *InsertAtEnd)
-    : UnaryInstruction(List->getType(), VANext, List, Name, InsertAtEnd),
-      ArgTy(Ty) {
+  VAArgInst(Value *List, const Type *Ty, const std::string &Name,
+            BasicBlock *InsertAtEnd)
+    : UnaryInstruction(Ty, VAArg, List, Name, InsertAtEnd) {
   }
 
-  const Type *getArgType() const { return ArgTy; }
-
-  virtual VANextInst *clone() const;
+  virtual VAArgInst *clone() const;
+  bool mayWriteToMemory() const { return true; }
 
   // Methods for support type inquiry through isa, cast, and dyn_cast:
-  static inline bool classof(const VANextInst *) { return true; }
+  static inline bool classof(const VAArgInst *) { return true; }
   static inline bool classof(const Instruction *I) {
-    return I->getOpcode() == VANext;
+    return I->getOpcode() == VAArg;
   }
   static inline bool classof(const Value *V) {
     return isa<Instruction>(V) && classof(cast<Instruction>(V));
   }
 };
 
-
 //===----------------------------------------------------------------------===//
-//                                VAArgInst Class
+//                                ExtractElementInst Class
 //===----------------------------------------------------------------------===//
 
-/// VAArgInst - This class represents the va_arg llvm instruction, which returns
-/// an argument of the specified type given a va_list.
+/// ExtractElementInst - This instruction extracts a single (scalar)
+/// element from a PackedType value
 ///
-class VAArgInst : public UnaryInstruction {
-  VAArgInst(const VAArgInst &VAA)
-    : UnaryInstruction(VAA.getType(), VAArg, VAA.getOperand(0)) {}
+class ExtractElementInst : public Instruction {
+  Use Ops[2];
+  ExtractElementInst(const ExtractElementInst &EE) : 
+    Instruction(EE.getType(), ExtractElement, Ops, 2) {
+    Ops[0].init(EE.Ops[0], this);
+    Ops[1].init(EE.Ops[1], this);
+  }
+
 public:
-  VAArgInst(Value *List, const Type *Ty, const std::string &Name = "",
-             Instruction *InsertBefore = 0)
-    : UnaryInstruction(Ty, VAArg, List, Name, InsertBefore) {
+  ExtractElementInst(Value *Val, Value *Index,
+                     const std::string &Name = "", Instruction *InsertBefore = 0);
+  ExtractElementInst(Value *Val, Value *Index,
+                     const std::string &Name, BasicBlock *InsertAtEnd);
+
+  virtual ExtractElementInst *clone() const;
+
+  virtual bool mayWriteToMemory() const { return false; }
+
+  /// Transparently provide more efficient getOperand methods.
+  Value *getOperand(unsigned i) const {
+    assert(i < 2 && "getOperand() out of range!");
+    return Ops[i];
   }
-  VAArgInst(Value *List, const Type *Ty, const std::string &Name,
-            BasicBlock *InsertAtEnd)
-    : UnaryInstruction(Ty, VAArg, List, Name, InsertAtEnd) {
+  void setOperand(unsigned i, Value *Val) {
+    assert(i < 2 && "setOperand() out of range!");
+    Ops[i] = Val;
   }
+  unsigned getNumOperands() const { return 2; }
 
-  virtual VAArgInst *clone() const;
+  // Methods for support type inquiry through isa, cast, and dyn_cast:
+  static inline bool classof(const ExtractElementInst *) { return true; }
+  static inline bool classof(const Instruction *I) {
+    return I->getOpcode() == Instruction::ExtractElement;
+  }
+  static inline bool classof(const Value *V) {
+    return isa<Instruction>(V) && classof(cast<Instruction>(V));
+  }
+};
+
+//===----------------------------------------------------------------------===//
+//                                InsertElementInst Class
+//===----------------------------------------------------------------------===//
+
+/// InsertElementInst - This instruction inserts a single (scalar)
+/// element into a PackedType value
+///
+class InsertElementInst : public Instruction {
+  Use Ops[3];
+  InsertElementInst(const InsertElementInst &IE) : 
+    Instruction(IE.getType(), InsertElement, Ops, 3) {
+    Ops[0].init(IE.Ops[0], this);
+    Ops[1].init(IE.Ops[1], this);
+    Ops[2].init(IE.Ops[2], this);
+  }
+
+public:
+  InsertElementInst(Value *Val, Value *Elt, Value *Index,
+                    const std::string &Name = "", Instruction *InsertBefore = 0);
+  InsertElementInst(Value *Val, Value *Elt,  Value *Index,
+                    const std::string &Name, BasicBlock *InsertAtEnd);
+
+  virtual InsertElementInst *clone() const;
+
+  virtual bool mayWriteToMemory() const { return false; }
+
+  /// Transparently provide more efficient getOperand methods.
+  Value *getOperand(unsigned i) const {
+    assert(i < 3 && "getOperand() out of range!");
+    return Ops[i];
+  }
+  void setOperand(unsigned i, Value *Val) {
+    assert(i < 3 && "setOperand() out of range!");
+    Ops[i] = Val;
+  }
+  unsigned getNumOperands() const { return 3; }
 
   // Methods for support type inquiry through isa, cast, and dyn_cast:
-  static inline bool classof(const VAArgInst *) { return true; }
+  static inline bool classof(const InsertElementInst *) { return true; }
   static inline bool classof(const Instruction *I) {
-    return I->getOpcode() == VAArg;
+    return I->getOpcode() == Instruction::InsertElement;
   }
   static inline bool classof(const Value *V) {
     return isa<Instruction>(V) && classof(cast<Instruction>(V));
@@ -846,6 +921,11 @@ public:
     return getIncomingValue(getBasicBlockIndex(BB));
   }
 
+  /// hasConstantValue - If the specified PHI node always merges together the 
+  /// same value, return the value, otherwise return null.
+  ///
+  Value *hasConstantValue(bool AllowNonDominatingInstruction = false) const;
+  
   /// Methods for support type inquiry through isa, cast, and dyn_cast:
   static inline bool classof(const PHINode *) { return true; }
   static inline bool classof(const Instruction *I) {