X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FInstrTypes.h;h=1ee2a4b33180ab63001cb34d46c4d935e2f7417c;hb=7886ae9e3ca7ec20eceb213523a6788d368cfc73;hp=386c00118fac3e2e070ca9b33d12afb653cf1deb;hpb=7e2dd6628e398f369a110856ec69455f65d17638;p=oota-llvm.git diff --git a/include/llvm/InstrTypes.h b/include/llvm/InstrTypes.h index 386c00118fa..1ee2a4b3318 100644 --- a/include/llvm/InstrTypes.h +++ b/include/llvm/InstrTypes.h @@ -18,9 +18,12 @@ #include "llvm/Instruction.h" #include "llvm/OperandTraits.h" +#include "llvm/DerivedTypes.h" namespace llvm { +class LLVMContext; + //===----------------------------------------------------------------------===// // TerminatorInst Class //===----------------------------------------------------------------------===// @@ -49,7 +52,7 @@ protected: virtual void setSuccessorV(unsigned idx, BasicBlock *B) = 0; public: - virtual Instruction *clone() const = 0; + virtual Instruction *clone(LLVMContext &Context) const = 0; /// getNumSuccessors - Return the number of successors that this terminator /// has. @@ -72,7 +75,7 @@ public: // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const TerminatorInst *) { return true; } static inline bool classof(const Instruction *I) { - return I->getOpcode() >= TermOpsBegin && I->getOpcode() < TermOpsEnd; + return I->isTerminator(); } static inline bool classof(const Value *V) { return isa(V) && classof(cast(V)); @@ -89,7 +92,8 @@ class UnaryInstruction : public Instruction { UnaryInstruction(const UnaryInstruction&); // Do not implement protected: - UnaryInstruction(const Type *Ty, unsigned iType, Value *V, Instruction *IB = 0) + UnaryInstruction(const Type *Ty, unsigned iType, Value *V, + Instruction *IB = 0) : Instruction(Ty, iType, &Op<0>(), 1, IB) { Op<0>() = V; } @@ -108,7 +112,7 @@ public: /// Transparently provide more efficient getOperand methods. DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); - + // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const UnaryInstruction *) { return true; } static inline bool classof(const Instruction *I) { @@ -117,7 +121,7 @@ public: I->getOpcode() == Instruction::Free || I->getOpcode() == Instruction::Load || I->getOpcode() == Instruction::VAArg || - I->getOpcode() == Instruction::GetResult || + I->getOpcode() == Instruction::ExtractValue || (I->getOpcode() >= CastOpsBegin && I->getOpcode() < CastOpsEnd); } static inline bool classof(const Value *V) { @@ -198,25 +202,40 @@ public: /// CreateNeg, CreateNot - Create the NEG and NOT /// instructions out of SUB and XOR instructions. /// - static BinaryOperator *CreateNeg(Value *Op, const std::string &Name = "", + static BinaryOperator *CreateNeg(LLVMContext &Context, + Value *Op, const std::string &Name = "", Instruction *InsertBefore = 0); - static BinaryOperator *CreateNeg(Value *Op, const std::string &Name, + static BinaryOperator *CreateNeg(LLVMContext &Context, + Value *Op, const std::string &Name, BasicBlock *InsertAtEnd); - static BinaryOperator *CreateNot(Value *Op, const std::string &Name = "", + static BinaryOperator *CreateFNeg(LLVMContext &Context, + Value *Op, const std::string &Name = "", + Instruction *InsertBefore = 0); + static BinaryOperator *CreateFNeg(LLVMContext &Context, + Value *Op, const std::string &Name, + BasicBlock *InsertAtEnd); + static BinaryOperator *CreateNot(LLVMContext &Context, + Value *Op, const std::string &Name = "", Instruction *InsertBefore = 0); - static BinaryOperator *CreateNot(Value *Op, const std::string &Name, + static BinaryOperator *CreateNot(LLVMContext &Context, + Value *Op, const std::string &Name, BasicBlock *InsertAtEnd); - /// isNeg, isNot - Check if the given Value is a NEG or NOT instruction. + /// isNeg, isFNeg, isNot - Check if the given Value is a + /// NEG, FNeg, or NOT instruction. /// static bool isNeg(const Value *V); + static bool isFNeg(const Value *V); static bool isNot(const Value *V); /// getNegArgument, getNotArgument - Helper functions to extract the - /// unary argument of a NEG or NOT operation implemented via Sub or Xor. + /// unary argument of a NEG, FNEG or NOT operation implemented via + /// Sub, FSub, or Xor. /// static const Value *getNegArgument(const Value *BinOp); static Value *getNegArgument( Value *BinOp); + static const Value *getFNegArgument(const Value *BinOp); + static Value *getFNegArgument( Value *BinOp); static const Value *getNotArgument(const Value *BinOp); static Value *getNotArgument( Value *BinOp); @@ -224,7 +243,7 @@ public: return static_cast(Instruction::getOpcode()); } - virtual BinaryOperator *clone() const; + virtual BinaryOperator *clone(LLVMContext &Context) const; /// swapOperands - Exchange the two operands to this instruction. /// This instruction is safe to use on any binary instruction and @@ -236,58 +255,11 @@ public: // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const BinaryOperator *) { return true; } static inline bool classof(const Instruction *I) { - return I->getOpcode() >= BinaryOpsBegin && I->getOpcode() < BinaryOpsEnd; + return I->isBinaryOp(); } static inline bool classof(const Value *V) { return isa(V) && classof(cast(V)); } - - /// Backward-compatible interfaces - /// @deprecated in 2.4, do not use, will disappear soon - static BinaryOperator *create(BinaryOps Op, Value *S1, Value *S2, - const std::string &Name = "", - Instruction *InsertBefore = 0) { - return Create(Op, S1, S2, Name, InsertBefore); - } - static BinaryOperator *create(BinaryOps Op, Value *S1, Value *S2, - const std::string &Name, - BasicBlock *InsertAtEnd) { - return Create(Op, S1, S2, Name, InsertAtEnd); - } -#define HANDLE_BINARY_INST(N, OPC, CLASS) \ - static BinaryOperator *create##OPC(Value *V1, Value *V2, \ - const std::string &Name = "") {\ - return Create(Instruction::OPC, V1, V2, Name);\ - } -#include "llvm/Instruction.def" -#define HANDLE_BINARY_INST(N, OPC, CLASS) \ - static BinaryOperator *create##OPC(Value *V1, Value *V2, \ - const std::string &Name, BasicBlock *BB) {\ - return Create(Instruction::OPC, V1, V2, Name, BB);\ - } -#include "llvm/Instruction.def" -#define HANDLE_BINARY_INST(N, OPC, CLASS) \ - static BinaryOperator *create##OPC(Value *V1, Value *V2, \ - const std::string &Name, Instruction *I) {\ - return Create(Instruction::OPC, V1, V2, Name, I);\ - } -#include "llvm/Instruction.def" - static BinaryOperator *createNeg(Value *Op, const std::string &Name = "", - Instruction *InsertBefore = 0) { - return CreateNeg(Op, Name, InsertBefore); - } - static BinaryOperator *createNeg(Value *Op, const std::string &Name, - BasicBlock *InsertAtEnd) { - return CreateNeg(Op, Name, InsertAtEnd); - } - static BinaryOperator *createNot(Value *Op, const std::string &Name = "", - Instruction *InsertBefore = 0) { - return CreateNot(Op, Name, InsertBefore); - } - static BinaryOperator *createNot(Value *Op, const std::string &Name, - BasicBlock *InsertAtEnd) { - return CreateNot(Op, Name, InsertAtEnd); - } }; template <> @@ -312,22 +284,22 @@ class CastInst : public UnaryInstruction { : UnaryInstruction(CI.getType(), CI.getOpcode(), CI.getOperand(0)) { } /// @brief Do not allow default construction - CastInst(); + CastInst(); protected: /// @brief Constructor with insert-before-instruction semantics for subclasses - CastInst(const Type *Ty, unsigned iType, Value *S, - const std::string &Name = "", Instruction *InsertBefore = 0) + CastInst(const Type *Ty, unsigned iType, Value *S, + const std::string &NameStr = "", Instruction *InsertBefore = 0) : UnaryInstruction(Ty, iType, S, InsertBefore) { - setName(Name); + setName(NameStr); } /// @brief Constructor with insert-at-end-of-block semantics for subclasses - CastInst(const Type *Ty, unsigned iType, Value *S, - const std::string &Name, BasicBlock *InsertAtEnd) + CastInst(const Type *Ty, unsigned iType, Value *S, + const std::string &NameStr, BasicBlock *InsertAtEnd) : UnaryInstruction(Ty, iType, S, InsertAtEnd) { - setName(Name); + setName(NameStr); } public: - /// Provides a way to construct any of the CastInst subclasses using an + /// Provides a way to construct any of the CastInst subclasses using an /// opcode instead of the subclass's constructor. The opcode must be in the /// CastOps category (Instruction::isCast(opcode) returns true). This /// constructor has insert-before-instruction semantics to automatically @@ -422,7 +394,7 @@ public: /// @brief Create an FPExt, BitCast, or FPTrunc for fp -> fp casts static CastInst *CreateFPCast( - Value *S, ///< The floating point value to be casted + Value *S, ///< The floating point value to be casted const Type *Ty, ///< The floating point type to cast to const std::string &Name = "", ///< Name for the instruction Instruction *InsertBefore = 0 ///< Place to insert the instruction @@ -430,7 +402,7 @@ public: /// @brief Create an FPExt, BitCast, or FPTrunc for fp -> fp casts static CastInst *CreateFPCast( - Value *S, ///< The floating point value to be casted + Value *S, ///< The floating point value to be casted const Type *Ty, ///< The floating point type to cast to const std::string &Name, ///< The name for the instruction BasicBlock *InsertAtEnd ///< The block to insert the instruction into @@ -468,7 +440,7 @@ public: bool DstIsSigned ///< Whether to treate the dest. as signed ); - /// There are several places where we need to know if a cast instruction + /// There are several places where we need to know if a cast instruction /// only deals with integer source and destination types. To simplify that /// logic, this method is provided. /// @returns true iff the cast has only integral typed operand and dest type. @@ -477,20 +449,20 @@ public: /// A lossless cast is one that does not alter the basic value. It implies /// a no-op cast but is more stringent, preventing things like int->float, - /// long->double, int->ptr, or vector->anything. + /// long->double, int->ptr, or vector->anything. /// @returns true iff the cast is lossless. /// @brief Determine if this is a lossless cast. bool isLosslessCast() const; - /// A no-op cast is one that can be effected without changing any bits. + /// A no-op cast is one that can be effected without changing any bits. /// It implies that the source and destination types are the same size. The - /// IntPtrTy argument is used to make accurate determinations for casts + /// IntPtrTy argument is used to make accurate determinations for casts /// involving Integer and Pointer types. They are no-op casts if the integer - /// is the same size as the pointer. However, pointer size varies with + /// is the same size as the pointer. However, pointer size varies with /// platform. Generally, the result of TargetData::getIntPtrType() should be /// passed in. If that's not available, use Type::Int64Ty, which will make /// the isNoopCast call conservative. - /// @brief Determine if this cast is a no-op cast. + /// @brief Determine if this cast is a no-op cast. bool isNoopCast( const Type *IntPtrTy ///< Integer type corresponding to pointer ) const; @@ -498,7 +470,7 @@ public: /// Determine how a pair of casts can be eliminated, if they can be at all. /// This is a helper function for both CastInst and ConstantExpr. /// @returns 0 if the CastInst pair can't be eliminated - /// @returns Instruction::CastOps value for a cast that can replace + /// @returns Instruction::CastOps value for a cast that can replace /// the pair, casting SrcTy to DstTy. /// @brief Determine if a cast pair is eliminable static unsigned isEliminableCastPair( @@ -511,8 +483,8 @@ public: ); /// @brief Return the opcode of this CastInst - Instruction::CastOps getOpcode() const { - return Instruction::CastOps(Instruction::getOpcode()); + Instruction::CastOps getOpcode() const { + return Instruction::CastOps(Instruction::getOpcode()); } /// @brief Return the source type, as a convenience @@ -521,7 +493,7 @@ public: const Type* getDestTy() const { return getType(); } /// This method can be used to determine if a cast from S to DstTy using - /// Opcode op is valid or not. + /// Opcode op is valid or not. /// @returns true iff the proposed cast is valid. /// @brief Determine if a cast is valid without creating one. static bool castIsValid(Instruction::CastOps op, Value *S, const Type *DstTy); @@ -529,52 +501,18 @@ public: /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const CastInst *) { return true; } static inline bool classof(const Instruction *I) { - return I->getOpcode() >= CastOpsBegin && I->getOpcode() < CastOpsEnd; + return I->isCast(); } static inline bool classof(const Value *V) { return isa(V) && classof(cast(V)); } - /// Backward-compatible interfaces - /// @deprecated in 2.4, do not use, will disappear soon - static CastInst *create(Instruction::CastOps Op,Value *S,const Type *Ty, - const std::string &Name = "",Instruction *InsertBefore = 0) { - return Create(Op,S,Ty,Name,InsertBefore); - } - static CastInst *create(Instruction::CastOps Op,Value *S,const Type *Ty, - const std::string &Name,BasicBlock *InsertAtEnd) { - return Create(Op,S,Ty,Name,InsertAtEnd); - } - -#define DEFINE_CASTINST_DEPRECATED(OP) \ - static CastInst *create ## OP ## Cast(Value *S, const Type *Ty, \ - const std::string &Name = "", Instruction *InsertBefore = 0) { \ - return Create ## OP ## Cast(S, Ty, Name, InsertBefore); \ - } \ - static CastInst *create ## OP ## Cast(Value *S, const Type *Ty, \ - const std::string &Name, BasicBlock *InsertAtEnd) { \ - return Create ## OP ## Cast(S, Ty, Name, InsertAtEnd); \ - } - DEFINE_CASTINST_DEPRECATED(ZExtOrBit) - DEFINE_CASTINST_DEPRECATED(SExtOrBit) - DEFINE_CASTINST_DEPRECATED(Pointer) - DEFINE_CASTINST_DEPRECATED(FP) - DEFINE_CASTINST_DEPRECATED(TruncOrBit) -#undef DEFINE_CASTINST_DEPRECATED - static CastInst *createIntegerCast(Value *S, const Type *Ty, bool isSigned, - const std::string &Name = "", Instruction *InsertBefore = 0) { - return CreateIntegerCast(S, Ty, isSigned, Name, InsertBefore); - } - static CastInst *createIntegerCast(Value *S, const Type *Ty, bool isSigned, - const std::string &Name, BasicBlock *InsertAtEnd) { - return CreateIntegerCast(S, Ty, isSigned, Name, InsertAtEnd); - } }; //===----------------------------------------------------------------------===// // CmpInst Class //===----------------------------------------------------------------------===// -/// This class is the base class for the comparison instructions. +/// This class is the base class for the comparison instructions. /// @brief Abstract base class of comparison instructions. // FIXME: why not derive from BinaryOperator? class CmpInst: public Instruction { @@ -584,7 +522,7 @@ protected: CmpInst(const Type *ty, Instruction::OtherOps op, unsigned short pred, Value *LHS, Value *RHS, const std::string &Name = "", Instruction *InsertBefore = 0); - + CmpInst(const Type *ty, Instruction::OtherOps op, unsigned short pred, Value *LHS, Value *RHS, const std::string &Name, BasicBlock *InsertAtEnd); @@ -634,21 +572,22 @@ public: void *operator new(size_t s) { return User::operator new(s, 2); } - /// Construct a compare instruction, given the opcode, the predicate and - /// the two operands. Optionally (if InstBefore is specified) insert the - /// instruction into a BasicBlock right before the specified instruction. + /// Construct a compare instruction, given the opcode, the predicate and + /// the two operands. Optionally (if InstBefore is specified) insert the + /// instruction into a BasicBlock right before the specified instruction. /// The specified Instruction is allowed to be a dereferenced end iterator. /// @brief Create a CmpInst - static CmpInst *Create(OtherOps Op, unsigned short predicate, Value *S1, + static CmpInst *Create(LLVMContext &Context, OtherOps Op, + unsigned short predicate, Value *S1, Value *S2, const std::string &Name = "", Instruction *InsertBefore = 0); - /// Construct a compare instruction, given the opcode, the predicate and the - /// two operands. Also automatically insert this instruction to the end of + /// Construct a compare instruction, given the opcode, the predicate and the + /// two operands. Also automatically insert this instruction to the end of /// the BasicBlock specified. /// @brief Create a CmpInst - static CmpInst *Create(OtherOps Op, unsigned short predicate, Value *S1, - Value *S2, const std::string &Name, + static CmpInst *Create(OtherOps Op, unsigned short predicate, Value *S1, + Value *S2, const std::string &Name, BasicBlock *InsertAtEnd); /// @brief Get the opcode casted to the right type @@ -661,10 +600,10 @@ public: /// @brief Set the predicate for this instruction to the specified value. void setPredicate(Predicate P) { SubclassData = P; } - + /// For example, EQ -> NE, UGT -> ULE, SLT -> SGE, /// OEQ -> UNE, UGT -> OLE, OLT -> UGE, etc. - /// @returns the inverse predicate for the instruction's current predicate. + /// @returns the inverse predicate for the instruction's current predicate. /// @brief Return the inverse of the instruction's predicate. Predicate getInversePredicate() const { return getInversePredicate(getPredicate()); @@ -672,21 +611,21 @@ public: /// For example, EQ -> NE, UGT -> ULE, SLT -> SGE, /// OEQ -> UNE, UGT -> OLE, OLT -> UGE, etc. - /// @returns the inverse predicate for predicate provided in \p pred. + /// @returns the inverse predicate for predicate provided in \p pred. /// @brief Return the inverse of a given predicate static Predicate getInversePredicate(Predicate pred); /// For example, EQ->EQ, SLE->SGE, ULT->UGT, /// OEQ->OEQ, ULE->UGE, OLT->OGT, etc. - /// @returns the predicate that would be the result of exchanging the two - /// operands of the CmpInst instruction without changing the result - /// produced. + /// @returns the predicate that would be the result of exchanging the two + /// operands of the CmpInst instruction without changing the result + /// produced. /// @brief Return the predicate as if the operands were swapped Predicate getSwappedPredicate() const { return getSwappedPredicate(getPredicate()); } - /// This is a static version that you can use without an instruction + /// This is a static version that you can use without an instruction /// available. /// @brief Return the predicate as if the operands were swapped. static Predicate getSwappedPredicate(Predicate pred); @@ -724,26 +663,12 @@ public: /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const CmpInst *) { return true; } static inline bool classof(const Instruction *I) { - return I->getOpcode() == Instruction::ICmp || - I->getOpcode() == Instruction::FCmp || - I->getOpcode() == Instruction::VICmp || - I->getOpcode() == Instruction::VFCmp; + return I->getOpcode() == Instruction::ICmp || + I->getOpcode() == Instruction::FCmp; } static inline bool classof(const Value *V) { return isa(V) && classof(cast(V)); } - /// Backward-compatible interfaces - /// @deprecated in 2.4, do not use, will disappear soon - static CmpInst *create(OtherOps Op, unsigned short predicate, Value *S1, - Value *S2, const std::string &Name = "", - Instruction *InsertBefore = 0) { - return Create(Op, predicate, S1, S2, Name, InsertBefore); - } - static CmpInst *create(OtherOps Op, unsigned short predicate, Value *S1, - Value *S2, const std::string &Name, - BasicBlock *InsertAtEnd) { - return Create(Op, predicate, S1, S2, Name, InsertAtEnd); - } };