The first half of a fix for PR218 & test/Regression/Assembler/2004-02-01-NegativeZero.llx
authorChris Lattner <sabre@nondot.org>
Sun, 1 Feb 2004 22:48:09 +0000 (22:48 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 1 Feb 2004 22:48:09 +0000 (22:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11063 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Constants.h

index 8d0ec281f898f0b1cd5fa5bd3b7ae3fa02d3fa50..79b6322dbf9f8c158c61d688bc157e0f281fa3f7 100644 (file)
@@ -258,7 +258,8 @@ public:
 ///
 class ConstantFP : public Constant {
   double Val;
-  friend struct ConstantCreator<ConstantFP, Type, double>;
+  friend struct ConstantCreator<ConstantFP, Type, uint64_t>;
+  friend struct ConstantCreator<ConstantFP, Type, uint32_t>;
   ConstantFP(const ConstantFP &);      // DO NOT IMPLEMENT
 protected:
   ConstantFP(const Type *Ty, double V);
@@ -271,8 +272,16 @@ public:
   inline double getValue() const { return Val; }
 
   /// isNullValue - Return true if this is the value that would be returned by
-  /// getNullValue.
-  virtual bool isNullValue() const { return Val == 0; }
+  /// getNullValue.  Don't depend on == for doubles to tell us it's zero, it
+  /// considers -0.0 to be null as well as 0.0.  :(
+  virtual bool isNullValue() const {
+    union {
+      double V;
+      uint64_t I;
+    } T;
+    T.V = Val;
+    return T.I == 0;
+  }
 
   /// Methods for support type inquiry through isa, cast, and dyn_cast:
   static inline bool classof(const ConstantFP *) { return true; }