class ConstantInt;
class PointerType;
class VectorType;
+class ConstantRange;
+class APInt;
+class ParamAttrsList;
//===----------------------------------------------------------------------===//
// AllocationInst Class
/// SubclassData field in Value to store whether or not the load is volatile.
///
class LoadInst : public UnaryInstruction {
+
LoadInst(const LoadInst &LI)
: UnaryInstruction(LI.getType(), Load, LI.getOperand(0)) {
setVolatile(LI.isVolatile());
+ setAlignment(LI.getAlignment());
#ifndef NDEBUG
AssertOK();
public:
LoadInst(Value *Ptr, const std::string &Name, Instruction *InsertBefore);
LoadInst(Value *Ptr, const std::string &Name, BasicBlock *InsertAtEnd);
- LoadInst(Value *Ptr, const std::string &Name, bool isVolatile = false,
+ LoadInst(Value *Ptr, const std::string &Name, bool isVolatile = false,
+ Instruction *InsertBefore = 0);
+ LoadInst(Value *Ptr, const std::string &Name, bool isVolatile, unsigned Align,
Instruction *InsertBefore = 0);
LoadInst(Value *Ptr, const std::string &Name, bool isVolatile,
BasicBlock *InsertAtEnd);
LoadInst(Value *Ptr, const char *Name, Instruction *InsertBefore);
LoadInst(Value *Ptr, const char *Name, BasicBlock *InsertAtEnd);
- explicit LoadInst(Value *Ptr, const char *Name = 0, bool isVolatile = false,
+ explicit LoadInst(Value *Ptr, const char *Name = 0, bool isVolatile = false,
Instruction *InsertBefore = 0);
LoadInst(Value *Ptr, const char *Name, bool isVolatile,
BasicBlock *InsertAtEnd);
/// isVolatile - Return true if this is a load from a volatile memory
/// location.
///
- bool isVolatile() const { return SubclassData; }
+ bool isVolatile() const { return SubclassData & 1; }
/// setVolatile - Specify whether this is a volatile load or not.
///
- void setVolatile(bool V) { SubclassData = V; }
+ void setVolatile(bool V) {
+ SubclassData = (SubclassData & ~1) | ((V) ? 1 : 0);
+ }
virtual LoadInst *clone() const;
+ /// getAlignment - Return the alignment of the access that is being performed
+ ///
+ unsigned getAlignment() const {
+ return (1 << (SubclassData>>1)) >> 1;
+ }
+
+ void setAlignment(unsigned Align);
+
Value *getPointerOperand() { return getOperand(0); }
const Value *getPointerOperand() const { return getOperand(0); }
static unsigned getPointerOperandIndex() { return 0U; }
///
class StoreInst : public Instruction {
Use Ops[2];
+
StoreInst(const StoreInst &SI) : Instruction(SI.getType(), Store, Ops, 2) {
Ops[0].init(SI.Ops[0], this);
Ops[1].init(SI.Ops[1], this);
setVolatile(SI.isVolatile());
+ setAlignment(SI.getAlignment());
+
#ifndef NDEBUG
AssertOK();
#endif
StoreInst(Value *Val, Value *Ptr, BasicBlock *InsertAtEnd);
StoreInst(Value *Val, Value *Ptr, bool isVolatile = false,
Instruction *InsertBefore = 0);
+ StoreInst(Value *Val, Value *Ptr, bool isVolatile,
+ unsigned Align, Instruction *InsertBefore = 0);
StoreInst(Value *Val, Value *Ptr, bool isVolatile, BasicBlock *InsertAtEnd);
/// isVolatile - Return true if this is a load from a volatile memory
/// location.
///
- bool isVolatile() const { return SubclassData; }
+ bool isVolatile() const { return SubclassData & 1; }
/// setVolatile - Specify whether this is a volatile load or not.
///
- void setVolatile(bool V) { SubclassData = V; }
+ void setVolatile(bool V) {
+ SubclassData = (SubclassData & ~1) | ((V) ? 1 : 0);
+ }
/// Transparently provide more efficient getOperand methods.
Value *getOperand(unsigned i) const {
}
unsigned getNumOperands() const { return 2; }
-
+ /// getAlignment - Return the alignment of the access that is being performed
+ ///
+ unsigned getAlignment() const {
+ return (1 << (SubclassData>>1)) >> 1;
+ }
+
+ void setAlignment(unsigned Align);
+
virtual StoreInst *clone() const;
Value *getPointerOperand() { return getOperand(1); }
inline bool hasIndices() const {
return getNumOperands() > 1;
}
+
+ /// hasAllZeroIndices - Return true if all of the indices of this GEP are
+ /// zeros. If so, the result pointer and the first operand have the same
+ /// value, just potentially different types.
+ bool hasAllZeroIndices() const;
+
+ /// hasAllConstantIndices - Return true if all of the indices of this GEP are
+ /// constant integers. If so, the result pointer and the first operand have
+ /// a constant offset between them.
+ bool hasAllConstantIndices() const;
+
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const GetElementPtrInst *) { return true; }
/// @brief Determine if the predicate is signed.
static bool isSignedPredicate(Predicate pred);
+ /// Initialize a set of values that all satisfy the predicate with C.
+ /// @brief Make a ConstantRange for a relation with a constant value.
+ static ConstantRange makeConstantRange(Predicate pred, const APInt &C);
+
/// Exchange the two operands to this instruction in such a way that it does
/// not modify the semantics of the instruction. The predicate value may be
/// changed to retain the same result if the predicate is order dependent
/// hold the calling convention of the call.
///
class CallInst : public Instruction {
+ ParamAttrsList *ParamAttrs; ///< parameter attributes for call
CallInst(const CallInst &CI);
void init(Value *Func, Value* const *Params, unsigned NumParams);
void init(Value *Func, Value *Actual1, Value *Actual2);
SubclassData = (SubclassData & 1) | (CC << 1);
}
+ /// Obtains a pointer to the ParamAttrsList object which holds the
+ /// parameter attributes information, if any.
+ /// @returns 0 if no attributes have been set.
+ /// @brief Get the parameter attributes.
+ ParamAttrsList *getParamAttrs() const { return ParamAttrs; }
+
+ /// Sets the parameter attributes for this CallInst. To construct a
+ /// ParamAttrsList, see ParameterAttributes.h
+ /// @brief Set the parameter attributes.
+ void setParamAttrs(ParamAttrsList *attrs);
+
/// getCalledFunction - Return the function being called by this instruction
/// if it is a direct call. If it is a call through a function pointer,
/// return null.
public:
SelectInst(Value *C, Value *S1, Value *S2, const std::string &Name = "",
Instruction *InsertBefore = 0)
- : Instruction(S1->getType(), Instruction::Select, Ops, 3,
- Name, InsertBefore) {
+ : Instruction(S1->getType(), Instruction::Select, Ops, 3, InsertBefore) {
init(C, S1, S2);
+ setName(Name);
}
SelectInst(Value *C, Value *S1, Value *S2, const std::string &Name,
BasicBlock *InsertAtEnd)
- : Instruction(S1->getType(), Instruction::Select, Ops, 3,
- Name, InsertAtEnd) {
+ : Instruction(S1->getType(), Instruction::Select, Ops, 3, InsertAtEnd) {
init(C, S1, S2);
+ setName(Name);
}
Value *getCondition() const { return Ops[0]; }
public:
VAArgInst(Value *List, const Type *Ty, const std::string &Name = "",
Instruction *InsertBefore = 0)
- : UnaryInstruction(Ty, VAArg, List, 0, InsertBefore) {
+ : UnaryInstruction(Ty, VAArg, List, InsertBefore) {
setName(Name);
}
VAArgInst(Value *List, const Type *Ty, const std::string &Name,
BasicBlock *InsertAtEnd)
- : UnaryInstruction(Ty, VAArg, List, 0, InsertAtEnd) {
+ : UnaryInstruction(Ty, VAArg, List, InsertAtEnd) {
setName(Name);
}
public:
explicit PHINode(const Type *Ty, const std::string &Name = "",
Instruction *InsertBefore = 0)
- : Instruction(Ty, Instruction::PHI, 0, 0, Name, InsertBefore),
+ : Instruction(Ty, Instruction::PHI, 0, 0, InsertBefore),
ReservedSpace(0) {
+ setName(Name);
}
PHINode(const Type *Ty, const std::string &Name, BasicBlock *InsertAtEnd)
- : Instruction(Ty, Instruction::PHI, 0, 0, Name, InsertAtEnd),
+ : Instruction(Ty, Instruction::PHI, 0, 0, InsertAtEnd),
ReservedSpace(0) {
+ setName(Name);
}
~PHINode();
/// does not continue in this function any longer.
///
class ReturnInst : public TerminatorInst {
- Use RetVal; // Possibly null retval.
- ReturnInst(const ReturnInst &RI) : TerminatorInst(Instruction::Ret, &RetVal,
- RI.getNumOperands()) {
- if (RI.getNumOperands())
- RetVal.init(RI.RetVal, this);
- }
-
+ Use RetVal; // Return Value: null if 'void'.
+ ReturnInst(const ReturnInst &RI);
void init(Value *RetVal);
public:
//
// NOTE: If the Value* passed is of type void then the constructor behaves as
// if it was passed NULL.
- explicit ReturnInst(Value *retVal = 0, Instruction *InsertBefore = 0)
- : TerminatorInst(Instruction::Ret, &RetVal, 0, InsertBefore) {
- init(retVal);
- }
- ReturnInst(Value *retVal, BasicBlock *InsertAtEnd)
- : TerminatorInst(Instruction::Ret, &RetVal, 0, InsertAtEnd) {
- init(retVal);
- }
- explicit ReturnInst(BasicBlock *InsertAtEnd)
- : TerminatorInst(Instruction::Ret, &RetVal, 0, InsertAtEnd) {
- }
+ explicit ReturnInst(Value *retVal = 0, Instruction *InsertBefore = 0);
+ ReturnInst(Value *retVal, BasicBlock *InsertAtEnd);
+ explicit ReturnInst(BasicBlock *InsertAtEnd);
virtual ReturnInst *clone() const;
// BranchInst(BB* T, BB *F, Value *C, Inst *I) - 'br C, T, F', insert before I
// BranchInst(BB* B, BB *I) - 'br B' insert at end
// BranchInst(BB* T, BB *F, Value *C, BB *I) - 'br C, T, F', insert at end
- explicit BranchInst(BasicBlock *IfTrue, Instruction *InsertBefore = 0)
- : TerminatorInst(Instruction::Br, Ops, 1, InsertBefore) {
- assert(IfTrue != 0 && "Branch destination may not be null!");
- Ops[0].init(reinterpret_cast<Value*>(IfTrue), this);
- }
+ explicit BranchInst(BasicBlock *IfTrue, Instruction *InsertBefore = 0);
BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *Cond,
- Instruction *InsertBefore = 0)
- : TerminatorInst(Instruction::Br, Ops, 3, InsertBefore) {
- Ops[0].init(reinterpret_cast<Value*>(IfTrue), this);
- Ops[1].init(reinterpret_cast<Value*>(IfFalse), this);
- Ops[2].init(Cond, this);
-#ifndef NDEBUG
- AssertOK();
-#endif
- }
-
- BranchInst(BasicBlock *IfTrue, BasicBlock *InsertAtEnd)
- : TerminatorInst(Instruction::Br, Ops, 1, InsertAtEnd) {
- assert(IfTrue != 0 && "Branch destination may not be null!");
- Ops[0].init(reinterpret_cast<Value*>(IfTrue), this);
- }
-
+ Instruction *InsertBefore = 0);
+ BranchInst(BasicBlock *IfTrue, BasicBlock *InsertAtEnd);
BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *Cond,
- BasicBlock *InsertAtEnd)
- : TerminatorInst(Instruction::Br, Ops, 3, InsertAtEnd) {
- Ops[0].init(reinterpret_cast<Value*>(IfTrue), this);
- Ops[1].init(reinterpret_cast<Value*>(IfFalse), this);
- Ops[2].init(Cond, this);
-#ifndef NDEBUG
- AssertOK();
-#endif
- }
-
+ BasicBlock *InsertAtEnd);
/// Transparently provide more efficient getOperand methods.
Value *getOperand(unsigned i) const {
/// be specified here to make memory allocation more efficient. This
/// constructor can also autoinsert before another instruction.
SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases,
- Instruction *InsertBefore = 0)
- : TerminatorInst(Instruction::Switch, 0, 0, InsertBefore) {
- init(Value, Default, NumCases);
- }
-
+ Instruction *InsertBefore = 0);
+
/// SwitchInst ctor - Create a new switch instruction, specifying a value to
/// switch on and a default destination. The number of additional cases can
/// be specified here to make memory allocation more efficient. This
/// constructor also autoinserts at the end of the specified BasicBlock.
SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases,
- BasicBlock *InsertAtEnd)
- : TerminatorInst(Instruction::Switch, 0, 0, InsertAtEnd) {
- init(Value, Default, NumCases);
- }
+ BasicBlock *InsertAtEnd);
~SwitchInst();
/// calling convention of the call.
///
class InvokeInst : public TerminatorInst {
+ ParamAttrsList *ParamAttrs;
InvokeInst(const InvokeInst &BI);
void init(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
Value* const *Args, unsigned NumArgs);
SubclassData = CC;
}
+ /// Obtains a pointer to the ParamAttrsList object which holds the
+ /// parameter attributes information, if any.
+ /// @returns 0 if no attributes have been set.
+ /// @brief Get the parameter attributes.
+ ParamAttrsList *getParamAttrs() const { return ParamAttrs; }
+
+ /// Sets the parameter attributes for this InvokeInst. To construct a
+ /// ParamAttrsList, see ParameterAttributes.h
+ /// @brief Set the parameter attributes.
+ void setParamAttrs(ParamAttrsList *attrs);
+
/// getCalledFunction - Return the function called, or null if this is an
/// indirect function invocation.
///
///
class UnwindInst : public TerminatorInst {
public:
- explicit UnwindInst(Instruction *InsertBefore = 0)
- : TerminatorInst(Instruction::Unwind, 0, 0, InsertBefore) {
- }
- explicit UnwindInst(BasicBlock *InsertAtEnd)
- : TerminatorInst(Instruction::Unwind, 0, 0, InsertAtEnd) {
- }
+ explicit UnwindInst(Instruction *InsertBefore = 0);
+ explicit UnwindInst(BasicBlock *InsertAtEnd);
virtual UnwindInst *clone() const;
///
class UnreachableInst : public TerminatorInst {
public:
- explicit UnreachableInst(Instruction *InsertBefore = 0)
- : TerminatorInst(Instruction::Unreachable, 0, 0, InsertBefore) {
- }
- explicit UnreachableInst(BasicBlock *InsertAtEnd)
- : TerminatorInst(Instruction::Unreachable, 0, 0, InsertAtEnd) {
- }
+ explicit UnreachableInst(Instruction *InsertBefore = 0);
+ explicit UnreachableInst(BasicBlock *InsertAtEnd);
virtual UnreachableInst *clone() const;