class BasicBlock;
class ConstantInt;
class PointerType;
+class PackedType;
//===----------------------------------------------------------------------===//
// AllocationInst Class
/// 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:
///
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:
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) {}
+
+ explicit MallocInst(const Type *Ty, const std::string &Name,
+ Instruction *InsertBefore = 0)
+ : AllocationInst(Ty, 0, Malloc, 0, Name, InsertBefore) {}
+ MallocInst(const Type *Ty, const std::string &Name, BasicBlock *InsertAtEnd)
+ : AllocationInst(Ty, 0, 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) {}
+ 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:
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, const std::string &Name,
+ Instruction *InsertBefore = 0)
+ : AllocationInst(Ty, 0, Alloca, 0, Name, InsertBefore) {}
+ AllocaInst(const Type *Ty, const std::string &Name, BasicBlock *InsertAtEnd)
+ : AllocationInst(Ty, 0, Alloca, 0, Name, InsertAtEnd) {}
+
+ AllocaInst(const Type *Ty, Value *ArraySize, unsigned Align,
+ const std::string &Name = "", Instruction *InsertBefore = 0)
+ : AllocationInst(Ty, ArraySize, Alloca, Align, Name, InsertBefore) {}
+ AllocaInst(const Type *Ty, Value *ArraySize, unsigned Align,
+ const std::string &Name, BasicBlock *InsertAtEnd)
+ : AllocationInst(Ty, ArraySize, Alloca, Align, Name, InsertAtEnd) {}
+
virtual AllocaInst *clone() const;
// Methods for support type inquiry through isa, cast, and dyn_cast:
}
};
+//===----------------------------------------------------------------------===//
+// ExtractElementInst Class
+//===----------------------------------------------------------------------===//
+
+/// ExtractElementInst - This instruction extracts a single (scalar)
+/// element from a PackedType value
+///
+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:
+ ExtractElementInst(Value *Vec, Value *Idx, const std::string &Name = "",
+ Instruction *InsertBefore = 0);
+ ExtractElementInst(Value *Vec, Value *Idx, const std::string &Name,
+ BasicBlock *InsertAtEnd);
+
+ /// isValidOperands - Return true if an extractelement instruction can be
+ /// formed with the specified operands.
+ static bool isValidOperands(const Value *Vec, const Value *Idx);
+
+ 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];
+ }
+ void setOperand(unsigned i, Value *Val) {
+ assert(i < 2 && "setOperand() out of range!");
+ Ops[i] = Val;
+ }
+ unsigned getNumOperands() const { return 2; }
+
+ // 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);
+public:
+ InsertElementInst(Value *Vec, Value *NewElt, Value *Idx,
+ const std::string &Name = "",Instruction *InsertBefore = 0);
+ InsertElementInst(Value *Vec, Value *NewElt, Value *Idx,
+ const std::string &Name, BasicBlock *InsertAtEnd);
+
+ /// isValidOperands - Return true if an insertelement instruction can be
+ /// formed with the specified operands.
+ static bool isValidOperands(const Value *Vec, const Value *NewElt,
+ const Value *Idx);
+
+ virtual InsertElementInst *clone() const;
+
+ virtual bool mayWriteToMemory() const { return false; }
+
+ /// getType - Overload to return most specific packed type.
+ ///
+ inline const PackedType *getType() const {
+ return reinterpret_cast<const PackedType*>(Instruction::getType());
+ }
+
+ /// 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 InsertElementInst *) { return true; }
+ static inline bool classof(const Instruction *I) {
+ return I->getOpcode() == Instruction::InsertElement;
+ }
+ static inline bool classof(const Value *V) {
+ return isa<Instruction>(V) && classof(cast<Instruction>(V));
+ }
+};
+
+//===----------------------------------------------------------------------===//
+// ShuffleVectorInst Class
+//===----------------------------------------------------------------------===//
+
+/// ShuffleVectorInst - This instruction constructs a fixed permutation of two
+/// input vectors.
+///
+class ShuffleVectorInst : public Instruction {
+ Use Ops[3];
+ ShuffleVectorInst(const ShuffleVectorInst &IE);
+public:
+ ShuffleVectorInst(Value *V1, Value *V2, Value *Mask,
+ const std::string &Name = "", Instruction *InsertBefor = 0);
+ ShuffleVectorInst(Value *V1, Value *V2, Value *Mask,
+ const std::string &Name, BasicBlock *InsertAtEnd);
+
+ /// isValidOperands - Return true if a shufflevector instruction can be
+ /// formed with the specified operands.
+ static bool isValidOperands(const Value *V1, const Value *V2,
+ const Value *Mask);
+
+ virtual ShuffleVectorInst *clone() const;
+
+ virtual bool mayWriteToMemory() const { return false; }
+
+ /// getType - Overload to return most specific packed type.
+ ///
+ inline const PackedType *getType() const {
+ return reinterpret_cast<const PackedType*>(Instruction::getType());
+ }
+
+ /// 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 ShuffleVectorInst *) { return true; }
+ static inline bool classof(const Instruction *I) {
+ return I->getOpcode() == Instruction::ShuffleVector;
+ }
+ static inline bool classof(const Value *V) {
+ return isa<Instruction>(V) && classof(cast<Instruction>(V));
+ }
+};
+
+
//===----------------------------------------------------------------------===//
// PHINode Class
//===----------------------------------------------------------------------===//
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) {