Second half of a fix for PR218 & test/Regression/Assembler/2004-02-01-NegativeZero...
authorChris Lattner <sabre@nondot.org>
Sun, 1 Feb 2004 22:49:04 +0000 (22:49 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 1 Feb 2004 22:49:04 +0000 (22:49 +0000)
Basically we store floating point values as their integral components, instead of relying
on the semantics of floating point < to differentiate between values.  This is likely to
make the map search be faster anyway.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11064 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Constants.cpp

index 8b108c23354644dfe8de565a90f5d50148dc6cf6..caeb8cd08e06aa2ee6f5c0c238be62bf21bc1fa5 100644 (file)
@@ -698,15 +698,54 @@ ConstantInt *ConstantInt::get(const Type *Ty, unsigned char V) {
 
 //---- ConstantFP::get() implementation...
 //
-static ValueMap<double, Type, ConstantFP> FPConstants;
+namespace llvm {
+  template<>
+  struct ConstantCreator<ConstantFP, Type, uint64_t> {
+    static ConstantFP *create(const Type *Ty, uint64_t V) {
+      assert(Ty == Type::DoubleTy);
+      union {
+        double F;
+        uint64_t I;
+      } T;
+      T.I = V;
+      return new ConstantFP(Ty, T.F);
+    }
+  };
+  template<>
+  struct ConstantCreator<ConstantFP, Type, uint32_t> {
+    static ConstantFP *create(const Type *Ty, uint32_t V) {
+      assert(Ty == Type::FloatTy);
+      union {
+        float F;
+        uint32_t I;
+      } T;
+      T.I = V;
+      return new ConstantFP(Ty, T.F);
+    }
+  };
+}
+
+static ValueMap<uint64_t, Type, ConstantFP> DoubleConstants;
+static ValueMap<uint32_t, Type, ConstantFP> FloatConstants;
 
 ConstantFP *ConstantFP::get(const Type *Ty, double V) {
   if (Ty == Type::FloatTy) {
     // Force the value through memory to normalize it.
-    volatile float Tmp = V;
-    V = Tmp;
+    union {
+      float F;
+      uint32_t I;
+    } T;
+    T.F = (float)V;
+    return FloatConstants.getOrCreate(Ty, T.I);
+  } else {
+    assert(Ty == Type::DoubleTy);
+    union {
+      double F;
+      uint64_t I;
+    } T;
+    T.F = V;
+    return DoubleConstants.getOrCreate(Ty, T.I);
   }
-  return FPConstants.getOrCreate(Ty, V);
 }
 
 //---- ConstantArray::get() implementation...