Clarify that OverflowingBinaryOperator is not used for SDiv, even though
[oota-llvm.git] / include / llvm / Operator.h
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
21 namespace llvm {
22
23 /// Operator - This is a utility class that provides an abstraction for the
24 /// common functionality between Instructions and ConstantExprs.
25 ///
26 class Operator : public User {
27 private:
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
35 public:
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. It does not include SDiv,
65 /// despite that operator having the potential for overflow.
66 ///
67 class OverflowingBinaryOperator : public Operator {
68 public:
69   /// hasNoSignedOverflow - Test whether this operation is known to never
70   /// undergo signed overflow.
71   bool hasNoSignedOverflow() const {
72     return SubclassOptionalData & (1 << 0);
73   }
74   void setHasNoSignedOverflow(bool B) {
75     SubclassOptionalData = (SubclassOptionalData & ~(1 << 0)) | (B << 0);
76   }
77
78   /// hasNoUnsignedOverflow - Test whether this operation is known to never
79   /// undergo unsigned overflow.
80   bool hasNoUnsignedOverflow() const {
81     return SubclassOptionalData & (1 << 1);
82   }
83   void setHasNoUnsignedOverflow(bool B) {
84     SubclassOptionalData = (SubclassOptionalData & ~(1 << 1)) | (B << 1);
85   }
86
87   static inline bool classof(const OverflowingBinaryOperator *) { return true; }
88   static inline bool classof(const Instruction *I) {
89     return I->getOpcode() == Instruction::Add ||
90            I->getOpcode() == Instruction::Sub ||
91            I->getOpcode() == Instruction::Mul;
92   }
93   static inline bool classof(const ConstantExpr *CE) {
94     return CE->getOpcode() == Instruction::Add ||
95            CE->getOpcode() == Instruction::Sub ||
96            CE->getOpcode() == Instruction::Mul;
97   }
98   static inline bool classof(const Value *V) {
99     return (isa<Instruction>(V) && classof(cast<Instruction>(V))) ||
100            (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V)));
101   }
102 };
103
104 /// SDivOperator - An Operator with opcode Instruction::SDiv.
105 ///
106 class SDivOperator : public Operator {
107 public:
108   /// isExact - Test whether this division is known to be exact, with
109   /// zero remainder.
110   bool isExact() const {
111     return SubclassOptionalData & (1 << 0);
112   }
113   void setIsExact(bool B) {
114     SubclassOptionalData = (SubclassOptionalData & ~(1 << 0)) | (B << 0);
115   }
116
117   // Methods for support type inquiry through isa, cast, and dyn_cast:
118   static inline bool classof(const SDivOperator *) { return true; }
119   static inline bool classof(const ConstantExpr *CE) {
120     return CE->getOpcode() == Instruction::SDiv;
121   }
122   static inline bool classof(const Instruction *I) {
123     return I->getOpcode() == Instruction::SDiv;
124   }
125   static inline bool classof(const Value *V) {
126     return (isa<Instruction>(V) && classof(cast<Instruction>(V))) ||
127            (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V)));
128   }
129 };
130
131 class GEPOperator : public Operator {
132 public:
133   inline op_iterator       idx_begin()       { return op_begin()+1; }
134   inline const_op_iterator idx_begin() const { return op_begin()+1; }
135   inline op_iterator       idx_end()         { return op_end(); }
136   inline const_op_iterator idx_end()   const { return op_end(); }
137
138   Value *getPointerOperand() {
139     return getOperand(0);
140   }
141   const Value *getPointerOperand() const {
142     return getOperand(0);
143   }
144   static unsigned getPointerOperandIndex() {
145     return 0U;                      // get index for modifying correct operand
146   }
147
148   /// getPointerOperandType - Method to return the pointer operand as a
149   /// PointerType.
150   const PointerType *getPointerOperandType() const {
151     return reinterpret_cast<const PointerType*>(getPointerOperand()->getType());
152   }
153
154   unsigned getNumIndices() const {  // Note: always non-negative
155     return getNumOperands() - 1;
156   }
157
158   bool hasIndices() const {
159     return getNumOperands() > 1;
160   }
161
162   /// hasAllZeroIndices - Return true if all of the indices of this GEP are
163   /// zeros.  If so, the result pointer and the first operand have the same
164   /// value, just potentially different types.
165   bool hasAllZeroIndices() const {
166     for (const_op_iterator I = idx_begin(), E = idx_end(); I != E; ++I) {
167       if (Constant *C = dyn_cast<Constant>(I))
168         if (C->isNullValue())
169           continue;
170       return false;
171     }
172     return true;
173   }
174
175   // Methods for support type inquiry through isa, cast, and dyn_cast:
176   static inline bool classof(const GEPOperator *) { return true; }
177   static inline bool classof(const GetElementPtrInst *) { return true; }
178   static inline bool classof(const ConstantExpr *CE) {
179     return CE->getOpcode() == Instruction::GetElementPtr;
180   }
181   static inline bool classof(const Instruction *I) {
182     return I->getOpcode() == Instruction::GetElementPtr;
183   }
184   static inline bool classof(const Value *V) {
185     return isa<GetElementPtrInst>(V) ||
186            (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V)));
187   }
188 };
189
190 } // End llvm namespace
191
192 #endif