From 032c6eb1c4d36a9e906f5efc0ada76c952225a4f Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 15 Jul 2011 06:14:08 +0000 Subject: [PATCH] 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 --- include/llvm/Constant.h | 2 +- include/llvm/Constants.h | 50 -------------------------------------- include/llvm/GlobalValue.h | 4 --- lib/VMCore/Constants.cpp | 19 +++++++++++---- 4 files changed, 15 insertions(+), 60 deletions(-) diff --git a/include/llvm/Constant.h b/include/llvm/Constant.h index 95da9fc20c3..5e351c4ec50 100644 --- a/include/llvm/Constant.h +++ b/include/llvm/Constant.h @@ -50,7 +50,7 @@ protected: 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 e6ead6d96d2..01fca291843 100644 --- a/include/llvm/Constants.h +++ b/include/llvm/Constants.h @@ -149,14 +149,6 @@ public: 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 @@ public: 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 @@ protected: 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 @@ public: /// 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 @@ public: return reinterpret_cast(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 @@ public: return reinterpret_cast(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 @@ public: /// 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 @@ public: 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 @@ public: static Constant *getInsertValue(Constant *Agg, Constant *Val, ArrayRef 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 @@ public: /// 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 d77a4dbdb31..d0f0888a227 100644 --- a/include/llvm/GlobalValue.h +++ b/include/llvm/GlobalValue.h @@ -258,10 +258,6 @@ public: /// @} - /// 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 019a590f412..681e7269c9b 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -49,6 +49,19 @@ bool Constant::isNegativeZeroValue() const { return isNullValue(); } +bool Constant::isNullValue() const { + // 0 is null. + if (const ConstantInt *CI = dyn_cast(this)) + return CI->isZero(); + + // +0.0 is null. + if (const ConstantFP *CFP = dyn_cast(this)) + return CFP->isZero() && !CFP->isNegative(); + + // constant zero is zero for aggregates and cpnull is null for pointers. + return isa(this) || isa(this); +} + // Constructor to create a '0' constant of arbitrary type... Constant *Constant::getNullValue(const Type *Ty) { switch (Ty->getTypeID()) { @@ -551,11 +564,7 @@ ConstantFP::ConstantFP(const Type *Ty, const APFloat& V) "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); }