To not break TBAA rules, use a union.
authorChris Lattner <sabre@nondot.org>
Tue, 4 Jan 2005 01:56:57 +0000 (01:56 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 4 Jan 2005 01:56:57 +0000 (01:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19280 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/AsmWriter.cpp

index 945f0b5b6ce34dc4efba2eacb8af3ad488e22503..d5a8a5c6014343b1a3993ea6c47d660074d7e991 100644 (file)
@@ -421,7 +421,8 @@ static void WriteConstantInt(std::ostream &Out, const Constant *CV,
          (StrVal[1] >= '0' && StrVal[1] <= '9')))
       // Reparse stringized version!
       if (atof(StrVal.c_str()) == CFP->getValue()) {
-        Out << StrVal; return;
+        Out << StrVal;
+        return;
       }
     
     // Otherwise we could not reparse it to exactly the same value, so we must
@@ -430,11 +431,14 @@ static void WriteConstantInt(std::ostream &Out, const Constant *CV,
     // Behave nicely in the face of C TBAA rules... see:
     // http://www.nullstone.com/htmls/category/aliastyp.htm
     //
-    double Val = CFP->getValue();
-    char *Ptr = (char*)&Val;
-    assert(sizeof(double) == sizeof(uint64_t) && sizeof(double) == 8 &&
+    union {
+      double D;
+      uint64_t U;
+    } V;
+    V.D = CFP->getValue();
+    assert(sizeof(double) == sizeof(uint64_t) &&
            "assuming that double is 64 bits!");
-    Out << "0x" << utohexstr(*(uint64_t*)Ptr);
+    Out << "0x" << utohexstr(V.U);
 
   } else if (isa<ConstantAggregateZero>(CV)) {
     Out << "zeroinitializer";