Operator.h revision f2411744214dad8c71044aac2977ca77e9ebf028
1//===-- llvm/Operator.h - Operator utility subclass -------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines various classes for working with Instructions and 11// ConstantExprs. 12// 13//===----------------------------------------------------------------------===// 14 15#ifndef LLVM_OPERATOR_H 16#define LLVM_OPERATOR_H 17 18#include "llvm/Instruction.h" 19#include "llvm/Constants.h" 20 21namespace llvm { 22 23/// Operator - This is a utility class that provides an abstraction for the 24/// common functionality between Instructions and ConstantExprs. 25/// 26class Operator : public User { 27private: 28 // Do not implement any of these. The Operator class is intended to be used 29 // as a utility, and is never itself instantiated. 30 void *operator new(size_t, unsigned); 31 void *operator new(size_t s); 32 Operator(); 33 ~Operator(); 34 35public: 36 /// getOpcode - Return the opcode for this Instruction or ConstantExpr. 37 /// 38 unsigned getOpcode() const { 39 if (const Instruction *I = dyn_cast<Instruction>(this)) 40 return I->getOpcode(); 41 return cast<ConstantExpr>(this)->getOpcode(); 42 } 43 44 /// getOpcode - If V is an Instruction or ConstantExpr, return its 45 /// opcode. Otherwise return UserOp1. 46 /// 47 static unsigned getOpcode(const Value *V) { 48 if (const Instruction *I = dyn_cast<Instruction>(V)) 49 return I->getOpcode(); 50 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) 51 return CE->getOpcode(); 52 return Instruction::UserOp1; 53 } 54 55 static inline bool classof(const Operator *) { return true; } 56 static inline bool classof(const Instruction *I) { return true; } 57 static inline bool classof(const ConstantExpr *I) { return true; } 58 static inline bool classof(const Value *V) { 59 return isa<Instruction>(V) || isa<ConstantExpr>(V); 60 } 61}; 62 63/// OverflowingBinaryOperator - Utility class for integer arithmetic operators 64/// which may exhibit overflow - Add, Sub, and Mul. 65/// 66class OverflowingBinaryOperator : public Operator { 67public: 68 /// hasNoSignedOverflow - Test whether this operation is known to never 69 /// undergo signed overflow. 70 bool hasNoSignedOverflow() const { 71 return SubclassOptionalData & (1 << 0); 72 } 73 void setHasNoSignedOverflow(bool B) { 74 SubclassOptionalData = (SubclassOptionalData & ~(1 << 0)) | (B << 0); 75 } 76 77 /// hasNoUnsignedOverflow - Test whether this operation is known to never 78 /// undergo unsigned overflow. 79 bool hasNoUnsignedOverflow() const { 80 return SubclassOptionalData & (1 << 1); 81 } 82 void setHasNoUnsignedOverflow(bool B) { 83 SubclassOptionalData = (SubclassOptionalData & ~(1 << 1)) | (B << 1); 84 } 85 86 static inline bool classof(const OverflowingBinaryOperator *) { return true; } 87 static inline bool classof(const Instruction *I) { 88 return I->getOpcode() == Instruction::Add || 89 I->getOpcode() == Instruction::Sub || 90 I->getOpcode() == Instruction::Mul; 91 } 92 static inline bool classof(const ConstantExpr *CE) { 93 return CE->getOpcode() == Instruction::Add || 94 CE->getOpcode() == Instruction::Sub || 95 CE->getOpcode() == Instruction::Mul; 96 } 97 static inline bool classof(const Value *V) { 98 return (isa<Instruction>(V) && classof(cast<Instruction>(V))) || 99 (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V))); 100 } 101}; 102 103/// UDivOperator - An Operator with opcode Instruction::UDiv. 104/// 105class UDivOperator : public Operator { 106public: 107 /// isExact - Test whether this division is known to be exact, with 108 /// zero remainder. 109 bool isExact() const { 110 return SubclassOptionalData & (1 << 0); 111 } 112 void setIsExact(bool B) { 113 SubclassOptionalData = (SubclassOptionalData & ~(1 << 0)) | (B << 0); 114 } 115 116 // Methods for support type inquiry through isa, cast, and dyn_cast: 117 static inline bool classof(const UDivOperator *) { return true; } 118 static inline bool classof(const ConstantExpr *CE) { 119 return CE->getOpcode() == Instruction::UDiv; 120 } 121 static inline bool classof(const Instruction *I) { 122 return I->getOpcode() == Instruction::UDiv; 123 } 124 static inline bool classof(const Value *V) { 125 return (isa<Instruction>(V) && classof(cast<Instruction>(V))) || 126 (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V))); 127 } 128}; 129 130class GEPOperator : public Operator { 131public: 132 inline op_iterator idx_begin() { return op_begin()+1; } 133 inline const_op_iterator idx_begin() const { return op_begin()+1; } 134 inline op_iterator idx_end() { return op_end(); } 135 inline const_op_iterator idx_end() const { return op_end(); } 136 137 Value *getPointerOperand() { 138 return getOperand(0); 139 } 140 const Value *getPointerOperand() const { 141 return getOperand(0); 142 } 143 static unsigned getPointerOperandIndex() { 144 return 0U; // get index for modifying correct operand 145 } 146 147 /// getPointerOperandType - Method to return the pointer operand as a 148 /// PointerType. 149 const PointerType *getPointerOperandType() const { 150 return reinterpret_cast<const PointerType*>(getPointerOperand()->getType()); 151 } 152 153 unsigned getNumIndices() const { // Note: always non-negative 154 return getNumOperands() - 1; 155 } 156 157 bool hasIndices() const { 158 return getNumOperands() > 1; 159 } 160 161 /// hasAllZeroIndices - Return true if all of the indices of this GEP are 162 /// zeros. If so, the result pointer and the first operand have the same 163 /// value, just potentially different types. 164 bool hasAllZeroIndices() const { 165 for (const_op_iterator I = idx_begin(), E = idx_end(); I != E; ++I) { 166 if (Constant *C = dyn_cast<Constant>(I)) 167 if (C->isNullValue()) 168 continue; 169 return false; 170 } 171 return true; 172 } 173 174 // Methods for support type inquiry through isa, cast, and dyn_cast: 175 static inline bool classof(const GEPOperator *) { return true; } 176 static inline bool classof(const GetElementPtrInst *) { return true; } 177 static inline bool classof(const ConstantExpr *CE) { 178 return CE->getOpcode() == Instruction::GetElementPtr; 179 } 180 static inline bool classof(const Instruction *I) { 181 return I->getOpcode() == Instruction::GetElementPtr; 182 } 183 static inline bool classof(const Value *V) { 184 return isa<GetElementPtrInst>(V) || 185 (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V))); 186 } 187}; 188 189} // End llvm namespace 190 191#endif 192