X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FOperator.h;h=541f13d859175444e8b66c18457869f9a074ebe8;hb=819c4f365fe2bf9be75faafa667fb22366dabaf5;hp=4da19219d2f4fbbfa724e377b593d38e47c29abb;hpb=ca178908c8dc2303a1fb54a8a93bab0f0b964e11;p=oota-llvm.git diff --git a/include/llvm/Operator.h b/include/llvm/Operator.h index 4da19219d2f..541f13d8591 100644 --- a/include/llvm/Operator.h +++ b/include/llvm/Operator.h @@ -61,7 +61,8 @@ public: }; /// OverflowingBinaryOperator - Utility class for integer arithmetic operators -/// which may exhibit overflow - Add, Sub, and Mul. +/// which may exhibit overflow - Add, Sub, and Mul. It does not include SDiv, +/// despite that operator having the potential for overflow. /// class OverflowingBinaryOperator : public Operator { public: @@ -100,9 +101,9 @@ public: } }; -/// UDivOperator - An Operator with opcode Instruction::UDiv. +/// SDivOperator - An Operator with opcode Instruction::SDiv. /// -class UDivOperator : public Operator { +class SDivOperator : public Operator { public: /// isExact - Test whether this division is known to be exact, with /// zero remainder. @@ -114,12 +115,12 @@ public: } // Methods for support type inquiry through isa, cast, and dyn_cast: - static inline bool classof(const UDivOperator *) { return true; } + static inline bool classof(const SDivOperator *) { return true; } static inline bool classof(const ConstantExpr *CE) { - return CE->getOpcode() == Instruction::UDiv; + return CE->getOpcode() == Instruction::SDiv; } static inline bool classof(const Instruction *I) { - return I->getOpcode() == Instruction::UDiv; + return I->getOpcode() == Instruction::SDiv; } static inline bool classof(const Value *V) { return (isa(V) && classof(cast(V))) || @@ -127,6 +128,65 @@ public: } }; +class GEPOperator : public Operator { +public: + inline op_iterator idx_begin() { return op_begin()+1; } + inline const_op_iterator idx_begin() const { return op_begin()+1; } + inline op_iterator idx_end() { return op_end(); } + inline const_op_iterator idx_end() const { return op_end(); } + + Value *getPointerOperand() { + return getOperand(0); + } + const Value *getPointerOperand() const { + return getOperand(0); + } + static unsigned getPointerOperandIndex() { + return 0U; // get index for modifying correct operand + } + + /// getPointerOperandType - Method to return the pointer operand as a + /// PointerType. + const PointerType *getPointerOperandType() const { + return reinterpret_cast(getPointerOperand()->getType()); + } + + unsigned getNumIndices() const { // Note: always non-negative + return getNumOperands() - 1; + } + + 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 { + for (const_op_iterator I = idx_begin(), E = idx_end(); I != E; ++I) { + if (Constant *C = dyn_cast(I)) + if (C->isNullValue()) + continue; + return false; + } + return true; + } + + // Methods for support type inquiry through isa, cast, and dyn_cast: + static inline bool classof(const GEPOperator *) { return true; } + static inline bool classof(const GetElementPtrInst *) { return true; } + static inline bool classof(const ConstantExpr *CE) { + return CE->getOpcode() == Instruction::GetElementPtr; + } + static inline bool classof(const Instruction *I) { + return I->getOpcode() == Instruction::GetElementPtr; + } + static inline bool classof(const Value *V) { + return isa(V) || + (isa(V) && classof(cast(V))); + } +}; + } // End llvm namespace #endif