Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 14 | pmbaty | 1 | //===-- llvm/Constant.h - Constant class definition -------------*- C++ -*-===// |
| 2 | // |
||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
||
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
||
| 6 | // |
||
| 7 | //===----------------------------------------------------------------------===// |
||
| 8 | // |
||
| 9 | // This file contains the declaration of the Constant class. |
||
| 10 | // |
||
| 11 | //===----------------------------------------------------------------------===// |
||
| 12 | |||
| 13 | #ifndef LLVM_IR_CONSTANT_H |
||
| 14 | #define LLVM_IR_CONSTANT_H |
||
| 15 | |||
| 16 | #include "llvm/IR/User.h" |
||
| 17 | #include "llvm/IR/Value.h" |
||
| 18 | #include "llvm/Support/Casting.h" |
||
| 19 | |||
| 20 | namespace llvm { |
||
| 21 | |||
| 22 | class APInt; |
||
| 23 | |||
| 24 | /// This is an important base class in LLVM. It provides the common facilities |
||
| 25 | /// of all constant values in an LLVM program. A constant is a value that is |
||
| 26 | /// immutable at runtime. Functions are constants because their address is |
||
| 27 | /// immutable. Same with global variables. |
||
| 28 | /// |
||
| 29 | /// All constants share the capabilities provided in this class. All constants |
||
| 30 | /// can have a null value. They can have an operand list. Constants can be |
||
| 31 | /// simple (integer and floating point values), complex (arrays and structures), |
||
| 32 | /// or expression based (computations yielding a constant value composed of |
||
| 33 | /// only certain operators and other constant values). |
||
| 34 | /// |
||
| 35 | /// Note that Constants are immutable (once created they never change) |
||
| 36 | /// and are fully shared by structural equivalence. This means that two |
||
| 37 | /// structurally equivalent constants will always have the same address. |
||
| 38 | /// Constants are created on demand as needed and never deleted: thus clients |
||
| 39 | /// don't have to worry about the lifetime of the objects. |
||
| 40 | /// LLVM Constant Representation |
||
| 41 | class Constant : public User { |
||
| 42 | protected: |
||
| 43 | Constant(Type *ty, ValueTy vty, Use *Ops, unsigned NumOps) |
||
| 44 | : User(ty, vty, Ops, NumOps) {} |
||
| 45 | |||
| 46 | ~Constant() = default; |
||
| 47 | |||
| 48 | public: |
||
| 49 | void operator=(const Constant &) = delete; |
||
| 50 | Constant(const Constant &) = delete; |
||
| 51 | |||
| 52 | /// Return true if this is the value that would be returned by getNullValue. |
||
| 53 | bool isNullValue() const; |
||
| 54 | |||
| 55 | /// Returns true if the value is one. |
||
| 56 | bool isOneValue() const; |
||
| 57 | |||
| 58 | /// Return true if the value is not the one value, or, |
||
| 59 | /// for vectors, does not contain one value elements. |
||
| 60 | bool isNotOneValue() const; |
||
| 61 | |||
| 62 | /// Return true if this is the value that would be returned by |
||
| 63 | /// getAllOnesValue. |
||
| 64 | bool isAllOnesValue() const; |
||
| 65 | |||
| 66 | /// Return true if the value is what would be returned by |
||
| 67 | /// getZeroValueForNegation. |
||
| 68 | bool isNegativeZeroValue() const; |
||
| 69 | |||
| 70 | /// Return true if the value is negative zero or null value. |
||
| 71 | bool isZeroValue() const; |
||
| 72 | |||
| 73 | /// Return true if the value is not the smallest signed value, or, |
||
| 74 | /// for vectors, does not contain smallest signed value elements. |
||
| 75 | bool isNotMinSignedValue() const; |
||
| 76 | |||
| 77 | /// Return true if the value is the smallest signed value. |
||
| 78 | bool isMinSignedValue() const; |
||
| 79 | |||
| 80 | /// Return true if this is a finite and non-zero floating-point scalar |
||
| 81 | /// constant or a fixed width vector constant with all finite and non-zero |
||
| 82 | /// elements. |
||
| 83 | bool isFiniteNonZeroFP() const; |
||
| 84 | |||
| 85 | /// Return true if this is a normal (as opposed to denormal, infinity, nan, |
||
| 86 | /// or zero) floating-point scalar constant or a vector constant with all |
||
| 87 | /// normal elements. See APFloat::isNormal. |
||
| 88 | bool isNormalFP() const; |
||
| 89 | |||
| 90 | /// Return true if this scalar has an exact multiplicative inverse or this |
||
| 91 | /// vector has an exact multiplicative inverse for each element in the vector. |
||
| 92 | bool hasExactInverseFP() const; |
||
| 93 | |||
| 94 | /// Return true if this is a floating-point NaN constant or a vector |
||
| 95 | /// floating-point constant with all NaN elements. |
||
| 96 | bool isNaN() const; |
||
| 97 | |||
| 98 | /// Return true if this constant and a constant 'Y' are element-wise equal. |
||
| 99 | /// This is identical to just comparing the pointers, with the exception that |
||
| 100 | /// for vectors, if only one of the constants has an `undef` element in some |
||
| 101 | /// lane, the constants still match. |
||
| 102 | bool isElementWiseEqual(Value *Y) const; |
||
| 103 | |||
| 104 | /// Return true if this is a vector constant that includes any undef or |
||
| 105 | /// poison elements. Since it is impossible to inspect a scalable vector |
||
| 106 | /// element- wise at compile time, this function returns true only if the |
||
| 107 | /// entire vector is undef or poison. |
||
| 108 | bool containsUndefOrPoisonElement() const; |
||
| 109 | |||
| 110 | /// Return true if this is a vector constant that includes any poison |
||
| 111 | /// elements. |
||
| 112 | bool containsPoisonElement() const; |
||
| 113 | |||
| 114 | /// Return true if this is a vector constant that includes any strictly undef |
||
| 115 | /// (not poison) elements. |
||
| 116 | bool containsUndefElement() const; |
||
| 117 | |||
| 118 | /// Return true if this is a fixed width vector constant that includes |
||
| 119 | /// any constant expressions. |
||
| 120 | bool containsConstantExpression() const; |
||
| 121 | |||
| 122 | /// Return true if the value can vary between threads. |
||
| 123 | bool isThreadDependent() const; |
||
| 124 | |||
| 125 | /// Return true if the value is dependent on a dllimport variable. |
||
| 126 | bool isDLLImportDependent() const; |
||
| 127 | |||
| 128 | /// Return true if the constant has users other than constant expressions and |
||
| 129 | /// other dangling things. |
||
| 130 | bool isConstantUsed() const; |
||
| 131 | |||
| 132 | /// This method classifies the entry according to whether or not it may |
||
| 133 | /// generate a relocation entry (either static or dynamic). This must be |
||
| 134 | /// conservative, so if it might codegen to a relocatable entry, it should say |
||
| 135 | /// so. |
||
| 136 | /// |
||
| 137 | /// FIXME: This really should not be in IR. |
||
| 138 | bool needsRelocation() const; |
||
| 139 | bool needsDynamicRelocation() const; |
||
| 140 | |||
| 141 | /// For aggregates (struct/array/vector) return the constant that corresponds |
||
| 142 | /// to the specified element if possible, or null if not. This can return null |
||
| 143 | /// if the element index is a ConstantExpr, if 'this' is a constant expr or |
||
| 144 | /// if the constant does not fit into an uint64_t. |
||
| 145 | Constant *getAggregateElement(unsigned Elt) const; |
||
| 146 | Constant *getAggregateElement(Constant *Elt) const; |
||
| 147 | |||
| 148 | /// If all elements of the vector constant have the same value, return that |
||
| 149 | /// value. Otherwise, return nullptr. Ignore undefined elements by setting |
||
| 150 | /// AllowUndefs to true. |
||
| 151 | Constant *getSplatValue(bool AllowUndefs = false) const; |
||
| 152 | |||
| 153 | /// If C is a constant integer then return its value, otherwise C must be a |
||
| 154 | /// vector of constant integers, all equal, and the common value is returned. |
||
| 155 | const APInt &getUniqueInteger() const; |
||
| 156 | |||
| 157 | /// Called if some element of this constant is no longer valid. |
||
| 158 | /// At this point only other constants may be on the use_list for this |
||
| 159 | /// constant. Any constants on our Use list must also be destroy'd. The |
||
| 160 | /// implementation must be sure to remove the constant from the list of |
||
| 161 | /// available cached constants. Implementations should implement |
||
| 162 | /// destroyConstantImpl to remove constants from any pools/maps they are |
||
| 163 | /// contained it. |
||
| 164 | void destroyConstant(); |
||
| 165 | |||
| 166 | //// Methods for support type inquiry through isa, cast, and dyn_cast: |
||
| 167 | static bool classof(const Value *V) { |
||
| 168 | static_assert(ConstantFirstVal == 0, "V->getValueID() >= ConstantFirstVal always succeeds"); |
||
| 169 | return V->getValueID() <= ConstantLastVal; |
||
| 170 | } |
||
| 171 | |||
| 172 | /// This method is a special form of User::replaceUsesOfWith |
||
| 173 | /// (which does not work on constants) that does work |
||
| 174 | /// on constants. Basically this method goes through the trouble of building |
||
| 175 | /// a new constant that is equivalent to the current one, with all uses of |
||
| 176 | /// From replaced with uses of To. After this construction is completed, all |
||
| 177 | /// of the users of 'this' are replaced to use the new constant, and then |
||
| 178 | /// 'this' is deleted. In general, you should not call this method, instead, |
||
| 179 | /// use Value::replaceAllUsesWith, which automatically dispatches to this |
||
| 180 | /// method as needed. |
||
| 181 | /// |
||
| 182 | void handleOperandChange(Value *, Value *); |
||
| 183 | |||
| 184 | static Constant *getNullValue(Type* Ty); |
||
| 185 | |||
| 186 | /// @returns the value for an integer or vector of integer constant of the |
||
| 187 | /// given type that has all its bits set to true. |
||
| 188 | /// Get the all ones value |
||
| 189 | static Constant *getAllOnesValue(Type* Ty); |
||
| 190 | |||
| 191 | /// Return the value for an integer or pointer constant, or a vector thereof, |
||
| 192 | /// with the given scalar value. |
||
| 193 | static Constant *getIntegerValue(Type *Ty, const APInt &V); |
||
| 194 | |||
| 195 | /// If there are any dead constant users dangling off of this constant, remove |
||
| 196 | /// them. This method is useful for clients that want to check to see if a |
||
| 197 | /// global is unused, but don't want to deal with potentially dead constants |
||
| 198 | /// hanging off of the globals. |
||
| 199 | void removeDeadConstantUsers() const; |
||
| 200 | |||
| 201 | /// Return true if the constant has exactly one live use. |
||
| 202 | /// |
||
| 203 | /// This returns the same result as calling Value::hasOneUse after |
||
| 204 | /// Constant::removeDeadConstantUsers, but doesn't remove dead constants. |
||
| 205 | bool hasOneLiveUse() const; |
||
| 206 | |||
| 207 | /// Return true if the constant has no live uses. |
||
| 208 | /// |
||
| 209 | /// This returns the same result as calling Value::use_empty after |
||
| 210 | /// Constant::removeDeadConstantUsers, but doesn't remove dead constants. |
||
| 211 | bool hasZeroLiveUses() const; |
||
| 212 | |||
| 213 | const Constant *stripPointerCasts() const { |
||
| 214 | return cast<Constant>(Value::stripPointerCasts()); |
||
| 215 | } |
||
| 216 | |||
| 217 | Constant *stripPointerCasts() { |
||
| 218 | return const_cast<Constant*>( |
||
| 219 | static_cast<const Constant *>(this)->stripPointerCasts()); |
||
| 220 | } |
||
| 221 | |||
| 222 | /// Try to replace undefined constant C or undefined elements in C with |
||
| 223 | /// Replacement. If no changes are made, the constant C is returned. |
||
| 224 | static Constant *replaceUndefsWith(Constant *C, Constant *Replacement); |
||
| 225 | |||
| 226 | /// Merges undefs of a Constant with another Constant, along with the |
||
| 227 | /// undefs already present. Other doesn't have to be the same type as C, but |
||
| 228 | /// both must either be scalars or vectors with the same element count. If no |
||
| 229 | /// changes are made, the constant C is returned. |
||
| 230 | static Constant *mergeUndefsWith(Constant *C, Constant *Other); |
||
| 231 | |||
| 232 | /// Return true if a constant is ConstantData or a ConstantAggregate or |
||
| 233 | /// ConstantExpr that contain only ConstantData. |
||
| 234 | bool isManifestConstant() const; |
||
| 235 | |||
| 236 | private: |
||
| 237 | enum PossibleRelocationsTy { |
||
| 238 | /// This constant requires no relocations. That is, it holds simple |
||
| 239 | /// constants (like integrals). |
||
| 240 | NoRelocation = 0, |
||
| 241 | |||
| 242 | /// This constant holds static relocations that can be resolved by the |
||
| 243 | /// static linker. |
||
| 244 | LocalRelocation = 1, |
||
| 245 | |||
| 246 | /// This constant holds dynamic relocations that the dynamic linker will |
||
| 247 | /// need to resolve. |
||
| 248 | GlobalRelocation = 2, |
||
| 249 | }; |
||
| 250 | |||
| 251 | /// Determine what potential relocations may be needed by this constant. |
||
| 252 | PossibleRelocationsTy getRelocationInfo() const; |
||
| 253 | |||
| 254 | bool hasNLiveUses(unsigned N) const; |
||
| 255 | }; |
||
| 256 | |||
| 257 | } // end namespace llvm |
||
| 258 | |||
| 259 | #endif // LLVM_IR_CONSTANT_H |