Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 1 | //===-- llvm/Constant.h - Constant class definition -------------*- C++ -*-===// |
| 2 | // |
Andrew Walbran | 16937d0 | 2019-10-22 13:54:20 +0100 | [diff] [blame] | 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 |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 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. |
Andrew Scull | cdfcccc | 2018-10-05 20:58:37 +0100 | [diff] [blame] | 40 | /// LLVM Constant Representation |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 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 | public: |
| 47 | void operator=(const Constant &) = delete; |
| 48 | Constant(const Constant &) = delete; |
| 49 | |
| 50 | /// Return true if this is the value that would be returned by getNullValue. |
| 51 | bool isNullValue() const; |
| 52 | |
| 53 | /// Returns true if the value is one. |
| 54 | bool isOneValue() const; |
| 55 | |
| 56 | /// Return true if this is the value that would be returned by |
| 57 | /// getAllOnesValue. |
| 58 | bool isAllOnesValue() const; |
| 59 | |
| 60 | /// Return true if the value is what would be returned by |
| 61 | /// getZeroValueForNegation. |
| 62 | bool isNegativeZeroValue() const; |
| 63 | |
| 64 | /// Return true if the value is negative zero or null value. |
| 65 | bool isZeroValue() const; |
| 66 | |
| 67 | /// Return true if the value is not the smallest signed value. |
| 68 | bool isNotMinSignedValue() const; |
| 69 | |
| 70 | /// Return true if the value is the smallest signed value. |
| 71 | bool isMinSignedValue() const; |
| 72 | |
| 73 | /// Return true if this is a finite and non-zero floating-point scalar |
| 74 | /// constant or a vector constant with all finite and non-zero elements. |
| 75 | bool isFiniteNonZeroFP() const; |
| 76 | |
| 77 | /// Return true if this is a normal (as opposed to denormal) floating-point |
| 78 | /// scalar constant or a vector constant with all normal elements. |
| 79 | bool isNormalFP() const; |
| 80 | |
| 81 | /// Return true if this scalar has an exact multiplicative inverse or this |
| 82 | /// vector has an exact multiplicative inverse for each element in the vector. |
| 83 | bool hasExactInverseFP() const; |
| 84 | |
| 85 | /// Return true if this is a floating-point NaN constant or a vector |
| 86 | /// floating-point constant with all NaN elements. |
| 87 | bool isNaN() const; |
| 88 | |
Andrew Scull | cdfcccc | 2018-10-05 20:58:37 +0100 | [diff] [blame] | 89 | /// Return true if this is a vector constant that includes any undefined |
| 90 | /// elements. |
| 91 | bool containsUndefElement() const; |
| 92 | |
Andrew Walbran | 3d2c197 | 2020-04-07 12:24:26 +0100 | [diff] [blame^] | 93 | /// Return true if this is a vector constant that includes any constant |
| 94 | /// expressions. |
| 95 | bool containsConstantExpression() const; |
| 96 | |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 97 | /// Return true if evaluation of this constant could trap. This is true for |
| 98 | /// things like constant expressions that could divide by zero. |
| 99 | bool canTrap() const; |
| 100 | |
| 101 | /// Return true if the value can vary between threads. |
| 102 | bool isThreadDependent() const; |
| 103 | |
| 104 | /// Return true if the value is dependent on a dllimport variable. |
| 105 | bool isDLLImportDependent() const; |
| 106 | |
| 107 | /// Return true if the constant has users other than constant expressions and |
| 108 | /// other dangling things. |
| 109 | bool isConstantUsed() const; |
| 110 | |
| 111 | /// This method classifies the entry according to whether or not it may |
| 112 | /// generate a relocation entry. This must be conservative, so if it might |
| 113 | /// codegen to a relocatable entry, it should say so. |
| 114 | /// |
| 115 | /// FIXME: This really should not be in IR. |
| 116 | bool needsRelocation() const; |
| 117 | |
| 118 | /// For aggregates (struct/array/vector) return the constant that corresponds |
| 119 | /// to the specified element if possible, or null if not. This can return null |
Andrew Walbran | 16937d0 | 2019-10-22 13:54:20 +0100 | [diff] [blame] | 120 | /// if the element index is a ConstantExpr, if 'this' is a constant expr or |
| 121 | /// if the constant does not fit into an uint64_t. |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 122 | Constant *getAggregateElement(unsigned Elt) const; |
| 123 | Constant *getAggregateElement(Constant *Elt) const; |
| 124 | |
| 125 | /// If this is a splat vector constant, meaning that all of the elements have |
| 126 | /// the same value, return that value. Otherwise return 0. |
| 127 | Constant *getSplatValue() const; |
| 128 | |
| 129 | /// If C is a constant integer then return its value, otherwise C must be a |
| 130 | /// vector of constant integers, all equal, and the common value is returned. |
| 131 | const APInt &getUniqueInteger() const; |
| 132 | |
| 133 | /// Called if some element of this constant is no longer valid. |
| 134 | /// At this point only other constants may be on the use_list for this |
| 135 | /// constant. Any constants on our Use list must also be destroy'd. The |
| 136 | /// implementation must be sure to remove the constant from the list of |
| 137 | /// available cached constants. Implementations should implement |
| 138 | /// destroyConstantImpl to remove constants from any pools/maps they are |
| 139 | /// contained it. |
| 140 | void destroyConstant(); |
| 141 | |
| 142 | //// Methods for support type inquiry through isa, cast, and dyn_cast: |
| 143 | static bool classof(const Value *V) { |
| 144 | static_assert(ConstantFirstVal == 0, "V->getValueID() >= ConstantFirstVal always succeeds"); |
| 145 | return V->getValueID() <= ConstantLastVal; |
| 146 | } |
| 147 | |
| 148 | /// This method is a special form of User::replaceUsesOfWith |
| 149 | /// (which does not work on constants) that does work |
| 150 | /// on constants. Basically this method goes through the trouble of building |
| 151 | /// a new constant that is equivalent to the current one, with all uses of |
| 152 | /// From replaced with uses of To. After this construction is completed, all |
| 153 | /// of the users of 'this' are replaced to use the new constant, and then |
| 154 | /// 'this' is deleted. In general, you should not call this method, instead, |
| 155 | /// use Value::replaceAllUsesWith, which automatically dispatches to this |
| 156 | /// method as needed. |
| 157 | /// |
| 158 | void handleOperandChange(Value *, Value *); |
| 159 | |
| 160 | static Constant *getNullValue(Type* Ty); |
| 161 | |
| 162 | /// @returns the value for an integer or vector of integer constant of the |
| 163 | /// given type that has all its bits set to true. |
Andrew Scull | cdfcccc | 2018-10-05 20:58:37 +0100 | [diff] [blame] | 164 | /// Get the all ones value |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 165 | static Constant *getAllOnesValue(Type* Ty); |
| 166 | |
| 167 | /// Return the value for an integer or pointer constant, or a vector thereof, |
| 168 | /// with the given scalar value. |
| 169 | static Constant *getIntegerValue(Type *Ty, const APInt &V); |
| 170 | |
| 171 | /// If there are any dead constant users dangling off of this constant, remove |
| 172 | /// them. This method is useful for clients that want to check to see if a |
| 173 | /// global is unused, but don't want to deal with potentially dead constants |
| 174 | /// hanging off of the globals. |
| 175 | void removeDeadConstantUsers() const; |
| 176 | |
| 177 | const Constant *stripPointerCasts() const { |
| 178 | return cast<Constant>(Value::stripPointerCasts()); |
| 179 | } |
| 180 | |
| 181 | Constant *stripPointerCasts() { |
| 182 | return const_cast<Constant*>( |
| 183 | static_cast<const Constant *>(this)->stripPointerCasts()); |
| 184 | } |
| 185 | }; |
| 186 | |
| 187 | } // end namespace llvm |
| 188 | |
| 189 | #endif // LLVM_IR_CONSTANT_H |