devirtualize Constant::isNullValue:
4 files changed, 15 insertions(+), 60 deletions(-)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135252 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/Constant.h b/include/llvm/Constant.h
index 95da9fc..5e351c4 100644
--- a/include/llvm/Constant.h
+++ b/include/llvm/Constant.h
@@ -50,7 +50,7 @@
public:
/// isNullValue - Return true if this is the value that would be returned by
/// getNullValue.
- virtual bool isNullValue() const = 0;
+ bool isNullValue() const;
/// isNegativeZeroValue - Return true if the value is what would be returned
/// by getZeroValueForNegation.
diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h
index e6ead6d..01fca29 100644
--- a/include/llvm/Constants.h
+++ b/include/llvm/Constants.h
@@ -149,14 +149,6 @@
static bool isValueValidForType(const Type *Ty, uint64_t V);
static bool isValueValidForType(const Type *Ty, int64_t V);
- /// This function will return true iff this constant represents the "null"
- /// value that would be returned by the getNullValue method.
- /// @returns true if this is the null integer value.
- /// @brief Determine if the value is null.
- virtual bool isNullValue() const {
- return Val == 0;
- }
-
bool isNegative() const { return Val.isNegative(); }
/// This is just a convenience method to make client code smaller for a
@@ -267,11 +259,6 @@
static bool isValueValidForType(const Type *Ty, const APFloat &V);
inline const APFloat &getValueAPF() const { return Val; }
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue. For ConstantFP, this is +0.0, but not -0.0. To handle the
- /// two the same, use isZero().
- virtual bool isNullValue() const;
-
/// isZero - Return true if the value is positive or negative zero.
bool isZero() const { return Val.isZero(); }
@@ -323,10 +310,6 @@
public:
static ConstantAggregateZero* get(const Type *Ty);
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue.
- virtual bool isNullValue() const { return true; }
-
virtual void destroyConstant();
/// Methods for support type inquiry through isa, cast, and dyn_cast:
@@ -392,11 +375,6 @@
///
std::string getAsCString() const;
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue. This always returns false because zero arrays are always
- /// created as ConstantAggregateZero objects.
- virtual bool isNullValue() const { return false; }
-
virtual void destroyConstant();
virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U);
@@ -457,13 +435,6 @@
return reinterpret_cast<const StructType*>(Value::getType());
}
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue. This always returns false because zero structs are always
- /// created as ConstantAggregateZero objects.
- virtual bool isNullValue() const {
- return false;
- }
-
virtual void destroyConstant();
virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U);
@@ -505,11 +476,6 @@
return reinterpret_cast<const VectorType*>(Value::getType());
}
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue. This always returns false because zero vectors are always
- /// created as ConstantAggregateZero objects.
- virtual bool isNullValue() const { return false; }
-
/// This function will return true iff every element in this vector constant
/// is set to all ones.
/// @returns true iff this constant's emements are all set to all ones.
@@ -558,10 +524,6 @@
/// get() - Static factory methods - Return objects of the specified value
static ConstantPointerNull *get(const PointerType *T);
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue.
- virtual bool isNullValue() const { return true; }
-
virtual void destroyConstant();
/// getType - Specialize the getType() method to always return an PointerType,
@@ -598,10 +560,6 @@
Function *getFunction() const { return (Function*)Op<0>().get(); }
BasicBlock *getBasicBlock() const { return (BasicBlock*)Op<1>().get(); }
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue.
- virtual bool isNullValue() const { return false; }
-
virtual void destroyConstant();
virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U);
@@ -858,10 +816,6 @@
static Constant *getInsertValue(Constant *Agg, Constant *Val,
ArrayRef<unsigned> Idxs);
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue.
- virtual bool isNullValue() const { return false; }
-
/// getOpcode - Return the opcode at the root of this constant expression
unsigned getOpcode() const { return getSubclassDataFromValue(); }
@@ -944,10 +898,6 @@
///
static UndefValue *get(const Type *T);
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue.
- virtual bool isNullValue() const { return false; }
-
virtual void destroyConstant();
/// Methods for support type inquiry through isa, cast, and dyn_cast:
diff --git a/include/llvm/GlobalValue.h b/include/llvm/GlobalValue.h
index d77a4db..d0f0888 100644
--- a/include/llvm/GlobalValue.h
+++ b/include/llvm/GlobalValue.h
@@ -258,10 +258,6 @@
/// @}
- /// Override from Constant class. No GlobalValue's are null values so this
- /// always returns false.
- virtual bool isNullValue() const { return false; }
-
/// Override from Constant class.
virtual void destroyConstant();
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp
index 019a590..681e726 100644
--- a/lib/VMCore/Constants.cpp
+++ b/lib/VMCore/Constants.cpp
@@ -49,6 +49,19 @@
return isNullValue();
}
+bool Constant::isNullValue() const {
+ // 0 is null.
+ if (const ConstantInt *CI = dyn_cast<ConstantInt>(this))
+ return CI->isZero();
+
+ // +0.0 is null.
+ if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
+ return CFP->isZero() && !CFP->isNegative();
+
+ // constant zero is zero for aggregates and cpnull is null for pointers.
+ return isa<ConstantAggregateZero>(this) || isa<ConstantPointerNull>(this);
+}
+
// Constructor to create a '0' constant of arbitrary type...
Constant *Constant::getNullValue(const Type *Ty) {
switch (Ty->getTypeID()) {
@@ -551,11 +564,7 @@
"FP type Mismatch");
}
-bool ConstantFP::isNullValue() const {
- return Val.isZero() && !Val.isNegative();
-}
-
-bool ConstantFP::isExactlyValue(const APFloat& V) const {
+bool ConstantFP::isExactlyValue(const APFloat &V) const {
return Val.bitwiseIsEqual(V);
}