Make sure the buffer, which containas an instance of APFloat, has proper alignment.
authorShuxin Yang <shuxin.llvm@gmail.com>
Wed, 19 Dec 2012 01:10:17 +0000 (01:10 +0000)
committerShuxin Yang <shuxin.llvm@gmail.com>
Wed, 19 Dec 2012 01:10:17 +0000 (01:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170486 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineAddSub.cpp

index bd642dea36b6ac605acc1f1b2fb14aa2d4e1df9d..30d753436386d2d29ef94d1f86086cedc6563158 100644 (file)
@@ -65,11 +65,11 @@ namespace {
   private:
     bool insaneIntVal(int V) { return V > 4 || V < -4; }
     APFloat *getFpValPtr(void)
-      { return reinterpret_cast<APFloat*>(&FpValBuf[0]); }
+      { return reinterpret_cast<APFloat*>(&FpValBuf.buffer[0]); }
 
     const APFloat &getFpVal(void) const {
       assert(IsFp && BufHasFpVal && "Incorret state");
-      return *reinterpret_cast<const APFloat*>(&FpValBuf[0]);
+      return *reinterpret_cast<const APFloat*>(&FpValBuf.buffer[0]);
     }
 
     APFloat &getFpVal(void)
@@ -78,6 +78,7 @@ namespace {
     bool isInt() const { return !IsFp; }
 
   private:
+
     bool IsFp;
   
     // True iff FpValBuf contains an instance of APFloat.
@@ -88,11 +89,8 @@ namespace {
     // two instructions. So the range of <IntVal> falls in [-4, 4]. APInt
     // is overkill of this end.
     short IntVal;
-  
-    union {
-      char FpValBuf[sizeof(APFloat)];
-      int dummy; // So this structure has at least 4-byte alignment.
-    };
+
+    AlignedCharArrayUnion<APFloat> FpValBuf;
   };
   
   /// FAddend is used to represent floating-point addend. An addend is