add CFP::isNegative() and ConstnatInt::isNegative() methods.

Devirtualize the isNegativeZeroValue method.

llvm-svn: 135249
This commit is contained in:
Chris Lattner 2011-07-15 05:58:04 +00:00
parent 20c6e388ef
commit e99d93799f
3 changed files with 16 additions and 8 deletions

View File

@ -54,7 +54,7 @@ public:
/// isNegativeZeroValue - Return true if the value is what would be returned
/// by getZeroValueForNegation.
virtual bool isNegativeZeroValue() const { return isNullValue(); }
bool isNegativeZeroValue() const;
/// canTrap - Return true if evaluation of this constant could trap. This is
/// true for things like constant expressions that could divide by zero.

View File

@ -156,6 +156,8 @@ public:
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
/// common code. It also correctly performs the comparison without the
@ -263,22 +265,19 @@ public:
/// isValueValidForType - return true if Ty is big enough to represent V.
static bool isValueValidForType(const Type *Ty, const APFloat &V);
inline const APFloat& getValueAPF() const { return Val; }
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;
/// isNegativeZeroValue - Return true if the value is what would be returned
/// by getZeroValueForNegation.
virtual bool isNegativeZeroValue() const {
return Val.isZero() && Val.isNegative();
}
/// isZero - Return true if the value is positive or negative zero.
bool isZero() const { return Val.isZero(); }
/// isNegative - Return true if the sign bit is set.
bool isNegative() const { return Val.isNegative(); }
/// isNaN - Return true if the value is a NaN.
bool isNaN() const { return Val.isNaN(); }

View File

@ -40,6 +40,15 @@ using namespace llvm;
// Constant Class
//===----------------------------------------------------------------------===//
bool Constant::isNegativeZeroValue() const {
// Floating point values have an explicit -0.0 value.
if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
return CFP->isZero() && CFP->isNegative();
// Otherwise, just use +0.0.
return isNullValue();
}
// Constructor to create a '0' constant of arbitrary type...
Constant *Constant::getNullValue(const Type *Ty) {
switch (Ty->getTypeID()) {