class VectorType;
class ConstantRange;
class APInt;
-class ParamAttrsList;
//===----------------------------------------------------------------------===//
// AllocationInst Class
///
class CallInst : public Instruction {
- const ParamAttrsList *ParamAttrs; ///< parameter attributes for call
+ PAListPtr 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.
- const ParamAttrsList *getParamAttrs() const { return ParamAttrs; }
+ /// getParamAttrs - Return the parameter attributes for this call.
+ ///
+ const PAListPtr &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(const ParamAttrsList *attrs);
+ /// setParamAttrs - Sets the parameter attributes for this call.
+ void setParamAttrs(const PAListPtr &Attrs) { ParamAttrs = Attrs; }
/// @brief Determine whether the call or the callee has the given attribute.
- bool paramHasAttr(uint16_t i, unsigned attr) const;
+ bool paramHasAttr(unsigned i, unsigned attr) const;
/// @brief Extract the alignment for a call or parameter (0=unknown).
- uint16_t getParamAlignment(uint16_t i) const;
+ unsigned getParamAlignment(unsigned i) const {
+ return ParamAttrs.getParamAlignment(i);
+ }
/// @brief Determine if the call does not access memory.
- bool doesNotAccessMemory() const;
+ bool doesNotAccessMemory() const {
+ return paramHasAttr(0, ParamAttr::ReadNone);
+ }
/// @brief Determine if the call does not access or only reads memory.
- bool onlyReadsMemory() const;
+ bool onlyReadsMemory() const {
+ return doesNotAccessMemory() || paramHasAttr(0, ParamAttr::ReadOnly);
+ }
/// @brief Determine if the call cannot return.
- bool doesNotReturn() const;
+ bool doesNotReturn() const {
+ return paramHasAttr(0, ParamAttr::NoReturn);
+ }
/// @brief Determine if the call cannot unwind.
- bool doesNotThrow() const;
+ bool doesNotThrow() const {
+ return paramHasAttr(0, ParamAttr::NoUnwind);
+ }
void setDoesNotThrow(bool doesNotThrow = true);
- /// @brief Determine if the call returns a structure.
- bool isStructReturn() const;
+ /// @brief Determine if the call returns a structure through first
+ /// pointer argument.
+ bool hasStructRetAttr() const {
+ // Be friendly and also check the callee.
+ return paramHasAttr(1, ParamAttr::StructRet);
+ }
/// @brief Determine if any call argument is an aggregate passed by value.
- bool hasByValArgument() const;
+ bool hasByValArgument() const {
+ return ParamAttrs.hasAttrSomewhere(ParamAttr::ByVal);
+ }
/// getCalledFunction - Return the function being called by this instruction
/// if it is a direct call. If it is a call through a function pointer,
}
/// Transparently provide more efficient getOperand methods.
- Value *getOperand(unsigned i) const {
+ const Value *getOperand(unsigned i) const {
+ assert(i < 3 && "getOperand() out of range!");
+ return Ops[i];
+ }
+ Value *getOperand(unsigned i) {
assert(i < 3 && "getOperand() out of range!");
return Ops[i];
}
Ops[i] = Val;
}
unsigned getNumOperands() const { return 3; }
+
+ /// getMaskValue - Return the index from the shuffle mask for the specified
+ /// output result. This is either -1 if the element is undef or a number less
+ /// than 2*numelements.
+ int getMaskValue(unsigned i) const;
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const ShuffleVectorInst *) { return true; }
/// addIncoming - Add an incoming value to the end of the PHI list
///
void addIncoming(Value *V, BasicBlock *BB) {
+ assert(V && "PHI node got a null value!");
+ assert(BB && "PHI node got a null basic block!");
assert(getType() == V->getType() &&
"All operands to PHI node must be the same type as the PHI node!");
unsigned OpNo = NumOperands;
class ReturnInst : public TerminatorInst {
Use RetVal;
ReturnInst(const ReturnInst &RI);
- void init(const Value * const* retVals, unsigned N);
+ void init(Value * const* retVals, unsigned N);
public:
// ReturnInst constructors:
// ReturnInst(Value* X, Inst *I) - 'ret X' instruction, insert before I
// ReturnInst( null, BB *B) - 'ret void' instruction, insert @ end of BB
// ReturnInst(Value* X, BB *B) - 'ret X' instruction, insert @ end of BB
+ // ReturnInst(Value* X, N) - 'ret X,X+1...X+N-1' instruction
+ // ReturnInst(Value* X, N, Inst *) - 'ret X,X+1...X+N-1', insert before I
+ // ReturnInst(Value* X, N, BB *) - 'ret X,X+1...X+N-1', insert @ end of BB
//
// 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);
ReturnInst(Value *retVal, BasicBlock *InsertAtEnd);
- ReturnInst(const std::vector<Value *> &retVals);
- ReturnInst(const std::vector<Value *> &retVals, Instruction *InsertBefore);
- ReturnInst(const std::vector<Value *> &retVals, BasicBlock *InsertAtEnd);
+ ReturnInst(Value * const* retVals, unsigned N);
+ ReturnInst(Value * const* retVals, unsigned N, Instruction *InsertBefore);
+ ReturnInst(Value * const* retVals, unsigned N, BasicBlock *InsertAtEnd);
explicit ReturnInst(BasicBlock *InsertAtEnd);
virtual ~ReturnInst();
virtual ReturnInst *clone() const;
- // Transparently provide more efficient getOperand methods.
- Value *getOperand(unsigned i) const {
- assert(i < getNumOperands() && "getOperand() out of range!");
- if (getNumOperands() == 0 || getNumOperands() == 1)
+ Value *getOperand(unsigned n = 0) const {
+ if (getNumOperands() > 1)
+ return TerminatorInst::getOperand(n);
+ else
return RetVal;
-
- return OperandList[i];
}
- void setOperand(unsigned i, Value *Val) {
- assert(i < getNumOperands() && "setOperand() out of range!");
- if (i == 0)
- RetVal = Val;
- else
- OperandList[i] = Val;
+ Value *getReturnValue(unsigned n = 0) const {
+ return getOperand(n);
}
- Value *getReturnValue(unsigned n = 0) const;
-
unsigned getNumSuccessors() const { return 0; }
// Methods for support type inquiry through isa, cast, and dyn_cast:
/// calling convention of the call.
///
class InvokeInst : public TerminatorInst {
- const ParamAttrsList *ParamAttrs;
+ PAListPtr 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.
- const ParamAttrsList *getParamAttrs() const { return ParamAttrs; }
+ /// getParamAttrs - Return the parameter attributes for this invoke.
+ ///
+ const PAListPtr &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(const ParamAttrsList *attrs);
+ /// setParamAttrs - Set the parameter attributes for this invoke.
+ ///
+ void setParamAttrs(const PAListPtr &Attrs) { ParamAttrs = Attrs; }
/// @brief Determine whether the call or the callee has the given attribute.
- bool paramHasAttr(uint16_t i, ParameterAttributes attr) const;
+ bool paramHasAttr(unsigned i, ParameterAttributes attr) const;
/// @brief Extract the alignment for a call or parameter (0=unknown).
- uint16_t getParamAlignment(uint16_t i) const;
+ unsigned getParamAlignment(unsigned i) const {
+ return ParamAttrs.getParamAlignment(i);
+ }
/// @brief Determine if the call does not access memory.
- bool doesNotAccessMemory() const;
+ bool doesNotAccessMemory() const {
+ return paramHasAttr(0, ParamAttr::ReadNone);
+ }
/// @brief Determine if the call does not access or only reads memory.
- bool onlyReadsMemory() const;
+ bool onlyReadsMemory() const {
+ return doesNotAccessMemory() || paramHasAttr(0, ParamAttr::ReadOnly);
+ }
/// @brief Determine if the call cannot return.
- bool doesNotReturn() const;
+ bool doesNotReturn() const {
+ return paramHasAttr(0, ParamAttr::NoReturn);
+ }
/// @brief Determine if the call cannot unwind.
- bool doesNotThrow() const;
+ bool doesNotThrow() const {
+ return paramHasAttr(0, ParamAttr::NoUnwind);
+ }
void setDoesNotThrow(bool doesNotThrow = true);
- /// @brief Determine if the call returns a structure.
- bool isStructReturn() const;
+ /// @brief Determine if the call returns a structure through first
+ /// pointer argument.
+ bool hasStructRetAttr() const {
+ // Be friendly and also check the callee.
+ return paramHasAttr(1, ParamAttr::StructRet);
+ }
/// getCalledFunction - Return the function called, or null if this is an
/// indirect function invocation.