Use the correct alignment for POD-member memcpys where the first field is a
bitfield. CGBitField::StorageAlignment holds the alignment in chars, but
emitMemcpy had been treating it as if it were held in bits, leading to
underaligned memcpys.

Related to PR15348.

Thanks very much to Chandler for the diagnosis.

llvm-svn: 176163
diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
index d5c5fd2..0589446 100644
--- a/clang/lib/CodeGen/CGClass.cpp
+++ b/clang/lib/CodeGen/CGClass.cpp
@@ -788,19 +788,22 @@
         return;
       }
 
-      unsigned FirstFieldAlign = ~0U; // Set to invalid.
+      CharUnits Alignment;
 
       if (FirstField->isBitField()) {
         const CGRecordLayout &RL =
           CGF.getTypes().getCGRecordLayout(FirstField->getParent());
         const CGBitFieldInfo &BFInfo = RL.getBitFieldInfo(FirstField);
-        FirstFieldAlign = BFInfo.StorageAlignment;
-      } else
-        FirstFieldAlign = CGF.getContext().getTypeAlign(FirstField->getType());
+        Alignment = CharUnits::fromQuantity(BFInfo.StorageAlignment);
+      } else {
+        unsigned AlignBits =
+          CGF.getContext().getTypeAlign(FirstField->getType());
+        Alignment = CGF.getContext().toCharUnitsFromBits(AlignBits);
+      }
 
-      assert(FirstFieldOffset % FirstFieldAlign == 0 && "Bad field alignment.");
-      CharUnits Alignment =
-        CGF.getContext().toCharUnitsFromBits(FirstFieldAlign);
+      assert((CGF.getContext().toCharUnitsFromBits(FirstFieldOffset) %
+              Alignment) == 0 && "Bad field alignment.");
+
       CharUnits MemcpySize = getMemcpySize();
       QualType RecordTy = CGF.getContext().getTypeDeclType(ClassDecl);
       llvm::Value *ThisPtr = CGF.LoadCXXThis();