<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 10, 2015 at 10:30 AM, Ulrich Weigand <span dir="ltr"><<a href="mailto:ulrich.weigand@de.ibm.com" target="_blank">ulrich.weigand@de.ibm.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: uweigand<br>
Date: Fri Jul 10 12:30:00 2015<br>
New Revision: 241916<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D241916-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=syzcGKg4AYe_MPeHIvvpiYJFQrMHNCXP9ipjkumXA8E&s=lRi0_I3WX1ElPChEWyxHMRTI-6ZxMTeJ3DhWol8aQjk&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=241916&view=rev</a><br>
Log:<br>
Respect alignment of nested bitfields<br>
<br>
tools/clang/test/CodeGen/packed-nest-unpacked.c contains this test:<br>
<br>
struct XBitfield {<br>
  unsigned b1 : 10;<br>
  unsigned b2 : 12;<br>
  unsigned b3 : 10;<br>
};<br>
struct YBitfield {<br>
  char x;<br>
  struct XBitfield y;<br>
} __attribute((packed));<br>
struct YBitfield gbitfield;<br>
<br>
unsigned test7() {<br>
  // CHECK: @test7<br>
  // CHECK: load i32, i32* getelementptr inbounds (%struct.YBitfield, %struct.YBitfield* @gbitfield, i32 0, i32 1, i32 0), align 4<br>
  return gbitfield.y.b2;<br>
}<br>
<br>
The "align 4" is actually wrong.  Accessing all of "gbitfield.y" as a single<br>
i32 is of course possible, but that still doesn't make it 4-byte aligned as<br>
it remains packed at offset 1 in the surrounding gbitfield object.<br>
<br>
This alignment was changed by commit r169489, which also introduced changes<br>
to bitfield access code in CGExpr.cpp.  Code before that change used to take<br>
into account *both* the alignment of the field to be accessed within the<br>
current struct, *and* the alignment of that outer struct itself; this logic<br>
was removed by the above commit.<br>
<br>
Neglecting to consider both values can cause incorrect code to be generated<br>
(I've seen an unaligned access crash on SystemZ due to this bug).<br>
<br>
In order to always use the best known alignment value, this patch removes<br>
the CGBitFieldInfo::StorageAlignment member and replaces it with a<br>
StorageOffset member specifying the offset from the start of the surrounding<br>
struct to the bitfield's underlying storage.  This offset can then be combined<br>
with the best-known alignment for a bitfield access lvalue to determine the<br>
alignment to use when accessing the bitfield's storage.<br>
<br>
Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D11034&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=syzcGKg4AYe_MPeHIvvpiYJFQrMHNCXP9ipjkumXA8E&s=zonhzBmu7A1cA8MqGlSTqbhkaNre53VdioAJ6KCE_q0&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D11034</a><br>
<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/CGAtomic.cpp<br>
    cfe/trunk/lib/CodeGen/CGClass.cpp<br>
    cfe/trunk/lib/CodeGen/CGExpr.cpp<br>
    cfe/trunk/lib/CodeGen/CGObjCRuntime.cpp<br>
    cfe/trunk/lib/CodeGen/CGRecordLayout.h<br>
    cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp<br>
    cfe/trunk/test/CodeGen/bitfield-2.c<br>
    cfe/trunk/test/CodeGen/packed-nest-unpacked.c<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGAtomic.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGAtomic.cpp-3Frev-3D241916-26r1-3D241915-26r2-3D241916-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=syzcGKg4AYe_MPeHIvvpiYJFQrMHNCXP9ipjkumXA8E&s=K8ocgo15HmQI8RdwJ-Uaw9pL4fH1tZzv08TEJu0nF-c&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGAtomic.cpp?rev=241916&r1=241915&r2=241916&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGAtomic.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGAtomic.cpp Fri Jul 10 12:30:00 2015<br>
@@ -93,6 +93,7 @@ namespace {<br>
         BFI = OrigBFI;<br>
         BFI.Offset = Offset;<br>
         BFI.StorageSize = AtomicSizeInBits;<br>
+        BFI.StorageOffset += OffsetInChars;<br>
         LVal = LValue::MakeBitfield(Addr, BFI, lvalue.getType(),<br>
                                     lvalue.getAlignment());<br>
         LVal.setTBAAInfo(lvalue.getTBAAInfo());<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGClass.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGClass.cpp-3Frev-3D241916-26r1-3D241915-26r2-3D241916-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=syzcGKg4AYe_MPeHIvvpiYJFQrMHNCXP9ipjkumXA8E&s=siibldPdYdXJA1ZuxwsGkZ1bO7FMQj9QKyz6U9BuI8w&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGClass.cpp?rev=241916&r1=241915&r2=241916&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGClass.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGClass.cpp Fri Jul 10 12:30:00 2015<br>
@@ -911,32 +911,22 @@ namespace {<br>
         return;<br>
       }<br>
<br>
-      CharUnits Alignment;<br>
-<br>
       uint64_t FirstByteOffset;<br>
       if (FirstField->isBitField()) {<br>
         const CGRecordLayout &RL =<br>
           CGF.getTypes().getCGRecordLayout(FirstField->getParent());<br>
         const CGBitFieldInfo &BFInfo = RL.getBitFieldInfo(FirstField);<br>
-        Alignment = CharUnits::fromQuantity(BFInfo.StorageAlignment);<br>
         // FirstFieldOffset is not appropriate for bitfields,<br>
         // it won't tell us what the storage offset should be and thus might not<br>
         // be properly aligned.<br>
         //<br>
         // Instead calculate the storage offset using the offset of the field in<br>
         // the struct type.<br></blockquote><div><br></div><div>This comment seems out of date now that we are not using the LLVM struct type's layout to calculate FirstByteOffset.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
-        const llvm::DataLayout &DL = CGF.CGM.getDataLayout();<br>
-        FirstByteOffset =<br>
-            DL.getStructLayout(RL.getLLVMType())<br>
-                ->getElementOffsetInBits(RL.getLLVMFieldNo(FirstField));<br>
+        FirstByteOffset = CGF.getContext().toBits(BFInfo.StorageOffset);<br>
       } else {<br>
-        Alignment = CGF.getContext().getDeclAlign(FirstField);<br>
         FirstByteOffset = FirstFieldOffset;<br>
       }<br>
<br>
-      assert((CGF.getContext().toCharUnitsFromBits(FirstByteOffset) %<br>
-              Alignment) == 0 && "Bad field alignment.");<br>
-<br>
       CharUnits MemcpySize = getMemcpySize(FirstByteOffset);<br>
       QualType RecordTy = CGF.getContext().getTypeDeclType(ClassDecl);<br>
       llvm::Value *ThisPtr = CGF.LoadCXXThis();<br>
@@ -946,6 +936,9 @@ namespace {<br>
       LValue SrcLV = CGF.MakeNaturalAlignAddrLValue(SrcPtr, RecordTy);<br>
       LValue Src = CGF.EmitLValueForFieldInitialization(SrcLV, FirstField);<br>
<br>
+      CharUnits Offset = CGF.getContext().toCharUnitsFromBits(FirstByteOffset);<br>
+      CharUnits Alignment = DestLV.getAlignment().alignmentAtOffset(Offset);<br>
+<br>
       emitMemcpyIR(Dest.isBitField() ? Dest.getBitFieldAddr() : Dest.getAddress(),<br>
                    Src.isBitField() ? Src.getBitFieldAddr() : Src.getAddress(),<br>
                    MemcpySize, Alignment);<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGExpr.cpp-3Frev-3D241916-26r1-3D241915-26r2-3D241916-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=syzcGKg4AYe_MPeHIvvpiYJFQrMHNCXP9ipjkumXA8E&s=dsNAxDdOhFWyWHmPgpVBZwqZyR4yVAOc-VyuwhpNiJY&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=241916&r1=241915&r2=241916&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Fri Jul 10 12:30:00 2015<br>
@@ -1356,14 +1356,15 @@ RValue CodeGenFunction::EmitLoadOfLValue<br>
<br>
 RValue CodeGenFunction::EmitLoadOfBitfieldLValue(LValue LV) {<br>
   const CGBitFieldInfo &Info = LV.getBitFieldInfo();<br>
+  CharUnits Align = LV.getAlignment().alignmentAtOffset(Info.StorageOffset);<br>
<br>
   // Get the output type.<br>
   llvm::Type *ResLTy = ConvertType(LV.getType());<br>
<br>
   llvm::Value *Ptr = LV.getBitFieldAddr();<br>
-  llvm::Value *Val = Builder.CreateLoad(Ptr, LV.isVolatileQualified(),<br>
-                                        "bf.load");<br>
-  cast<llvm::LoadInst>(Val)->setAlignment(Info.StorageAlignment);<br>
+  llvm::Value *Val = Builder.CreateAlignedLoad(Ptr, Align.getQuantity(),<br>
+                                               LV.isVolatileQualified(),<br>
+                                               "bf.load");<br>
<br>
   if (Info.IsSigned) {<br>
     assert(static_cast<unsigned>(Info.Offset + Info.Size) <= Info.StorageSize);<br>
@@ -1559,6 +1560,7 @@ void CodeGenFunction::EmitStoreThroughLV<br>
 void CodeGenFunction::EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst,<br>
                                                      llvm::Value **Result) {<br>
   const CGBitFieldInfo &Info = Dst.getBitFieldInfo();<br>
+  CharUnits Align = Dst.getAlignment().alignmentAtOffset(Info.StorageOffset);<br>
   llvm::Type *ResLTy = ConvertTypeForMem(Dst.getType());<br>
   llvm::Value *Ptr = Dst.getBitFieldAddr();<br>
<br>
@@ -1575,9 +1577,9 @@ void CodeGenFunction::EmitStoreThroughBi<br>
   // and mask together with source before storing.<br>
   if (Info.StorageSize != Info.Size) {<br>
     assert(Info.StorageSize > Info.Size && "Invalid bitfield size.");<br>
-    llvm::Value *Val = Builder.CreateLoad(Ptr, Dst.isVolatileQualified(),<br>
-                                          "bf.load");<br>
-    cast<llvm::LoadInst>(Val)->setAlignment(Info.StorageAlignment);<br>
+    llvm::Value *Val = Builder.CreateAlignedLoad(Ptr, Align.getQuantity(),<br>
+                                                 Dst.isVolatileQualified(),<br>
+                                                 "bf.load");<br>
<br>
     // Mask the source value as needed.<br>
     if (!hasBooleanRepresentation(Dst.getType()))<br>
@@ -1603,9 +1605,8 @@ void CodeGenFunction::EmitStoreThroughBi<br>
   }<br>
<br>
   // Write the new value back out.<br>
-  llvm::StoreInst *Store = Builder.CreateStore(SrcVal, Ptr,<br>
-                                               Dst.isVolatileQualified());<br>
-  Store->setAlignment(Info.StorageAlignment);<br>
+  Builder.CreateAlignedStore(SrcVal, Ptr, Align.getQuantity(),<br>
+                             Dst.isVolatileQualified());<br>
<br>
   // Return the new value of the bit-field, if requested.<br>
   if (Result) {<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGObjCRuntime.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGObjCRuntime.cpp-3Frev-3D241916-26r1-3D241915-26r2-3D241916-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=syzcGKg4AYe_MPeHIvvpiYJFQrMHNCXP9ipjkumXA8E&s=_OfHNsl0reIoWNSPFu9yXn4Gd31c-9GsMWR0kwXaD8g&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCRuntime.cpp?rev=241916&r1=241915&r2=241916&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGObjCRuntime.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGObjCRuntime.cpp Fri Jul 10 12:30:00 2015<br>
@@ -134,7 +134,7 @@ LValue CGObjCRuntime::EmitValueForIvarAt<br>
   CGBitFieldInfo *Info = new (CGF.CGM.getContext()) CGBitFieldInfo(<br>
     CGBitFieldInfo::MakeInfo(CGF.CGM.getTypes(), Ivar, BitOffset, BitFieldSize,<br>
                              CGF.CGM.getContext().toBits(StorageSize),<br>
-                             Alignment.getQuantity()));<br>
+                             CharUnits::fromQuantity(0)));<br>
<br>
   V = CGF.Builder.CreateBitCast(V,<br>
                                 llvm::Type::getIntNPtrTy(CGF.getLLVMContext(),<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGRecordLayout.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGRecordLayout.h-3Frev-3D241916-26r1-3D241915-26r2-3D241916-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=syzcGKg4AYe_MPeHIvvpiYJFQrMHNCXP9ipjkumXA8E&s=kpBcKP_sj-fiYbq1HVrOaFtbNmPgnpzYUojaOup2BDw&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGRecordLayout.h?rev=241916&r1=241915&r2=241916&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGRecordLayout.h (original)<br>
+++ cfe/trunk/lib/CodeGen/CGRecordLayout.h Fri Jul 10 12:30:00 2015<br>
@@ -78,16 +78,16 @@ struct CGBitFieldInfo {<br>
   /// bitfield.<br>
   unsigned StorageSize;<br>
<br>
-  /// The alignment which should be used when accessing the bitfield.<br>
-  unsigned StorageAlignment;<br>
+  /// The offset of the bitfield storage from the start of the struct.<br>
+  CharUnits StorageOffset;<br>
<br>
   CGBitFieldInfo()<br>
-      : Offset(), Size(), IsSigned(), StorageSize(), StorageAlignment() {}<br>
+      : Offset(), Size(), IsSigned(), StorageSize(), StorageOffset() {}<br>
<br>
   CGBitFieldInfo(unsigned Offset, unsigned Size, bool IsSigned,<br>
-                 unsigned StorageSize, unsigned StorageAlignment)<br>
+                 unsigned StorageSize, CharUnits StorageOffset)<br>
       : Offset(Offset), Size(Size), IsSigned(IsSigned),<br>
-        StorageSize(StorageSize), StorageAlignment(StorageAlignment) {}<br>
+        StorageSize(StorageSize), StorageOffset(StorageOffset) {}<br>
<br>
   void print(raw_ostream &OS) const;<br>
   void dump() const;<br>
@@ -99,7 +99,7 @@ struct CGBitFieldInfo {<br>
                                  const FieldDecl *FD,<br>
                                  uint64_t Offset, uint64_t Size,<br>
                                  uint64_t StorageSize,<br>
-                                 uint64_t StorageAlignment);<br>
+                                 CharUnits StorageOffset);<br>
 };<br>
<br>
 /// CGRecordLayout - This class handles struct and union layout info while<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGRecordLayoutBuilder.cpp-3Frev-3D241916-26r1-3D241915-26r2-3D241916-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=syzcGKg4AYe_MPeHIvvpiYJFQrMHNCXP9ipjkumXA8E&s=aFqORYMg6fFVGhMX1WChDiSQXS4TEJRWXQSxkOOtfCk&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp?rev=241916&r1=241915&r2=241916&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp Fri Jul 10 12:30:00 2015<br>
@@ -228,11 +228,7 @@ void CGRecordLowering::setBitFieldInfo(<br>
   Info.Offset = (unsigned)(getFieldBitOffset(FD) - Context.toBits(StartOffset));<br>
   Info.Size = FD->getBitWidthValue(Context);<br>
   Info.StorageSize = (unsigned)DataLayout.getTypeAllocSizeInBits(StorageType);<br>
-  // Here we calculate the actual storage alignment of the bits.  E.g if we've<br>
-  // got an alignment >= 2 and the bitfield starts at offset 6 we've got an<br>
-  // alignment of 2.<br>
-  Info.StorageAlignment =<br>
-      Layout.getAlignment().alignmentAtOffset(StartOffset).getQuantity();<br>
+  Info.StorageOffset = StartOffset;<br>
   if (Info.Size > Info.StorageSize)<br>
     Info.Size = Info.StorageSize;<br>
   // Reverse the bit offsets for big endian machines. Because we represent<br>
@@ -651,7 +647,7 @@ CGBitFieldInfo CGBitFieldInfo::MakeInfo(<br>
                                         const FieldDecl *FD,<br>
                                         uint64_t Offset, uint64_t Size,<br>
                                         uint64_t StorageSize,<br>
-                                        uint64_t StorageAlignment) {<br>
+                                        CharUnits StorageOffset) {<br>
   // This function is vestigial from CGRecordLayoutBuilder days but is still<br>
   // used in GCObjCRuntime.cpp.  That usage has a "fixme" attached to it that<br>
   // when addressed will allow for the removal of this function.<br>
@@ -683,7 +679,7 @@ CGBitFieldInfo CGBitFieldInfo::MakeInfo(<br>
     Offset = StorageSize - (Offset + Size);<br>
   }<br>
<br>
-  return CGBitFieldInfo(Offset, Size, IsSigned, StorageSize, StorageAlignment);<br>
+  return CGBitFieldInfo(Offset, Size, IsSigned, StorageSize, StorageOffset);<br>
 }<br>
<br>
 CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D,<br>
@@ -856,7 +852,7 @@ void CGBitFieldInfo::print(raw_ostream &<br>
      << " Size:" << Size<br>
      << " IsSigned:" << IsSigned<br>
      << " StorageSize:" << StorageSize<br>
-     << " StorageAlignment:" << StorageAlignment << ">";<br>
+     << " StorageOffset:" << StorageOffset.getQuantity() << ">";<br>
 }<br>
<br>
 void CGBitFieldInfo::dump() const {<br>
<br>
Modified: cfe/trunk/test/CodeGen/bitfield-2.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_CodeGen_bitfield-2D2.c-3Frev-3D241916-26r1-3D241915-26r2-3D241916-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=syzcGKg4AYe_MPeHIvvpiYJFQrMHNCXP9ipjkumXA8E&s=evejqXkwWvIx76FCCnx6OrYOg8zFOH7h0y_7nS_czYo&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/bitfield-2.c?rev=241916&r1=241915&r2=241916&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/bitfield-2.c (original)<br>
+++ cfe/trunk/test/CodeGen/bitfield-2.c Fri Jul 10 12:30:00 2015<br>
@@ -14,7 +14,7 @@<br>
 // CHECK-RECORD:   LLVMType:%struct.s0 = type { [3 x i8] }<br>
 // CHECK-RECORD:   IsZeroInitializable:1<br>
 // CHECK-RECORD:   BitFields:[<br>
-// CHECK-RECORD:     <CGBitFieldInfo Offset:0 Size:24 IsSigned:1 StorageSize:24 StorageAlignment:1><br>
+// CHECK-RECORD:     <CGBitFieldInfo Offset:0 Size:24 IsSigned:1 StorageSize:24 StorageOffset:0><br>
 struct __attribute((packed)) s0 {<br>
   int f0 : 24;<br>
 };<br>
@@ -54,8 +54,8 @@ unsigned long long test_0() {<br>
 // CHECK-RECORD:   LLVMType:%struct.s1 = type { [3 x i8] }<br>
 // CHECK-RECORD:   IsZeroInitializable:1<br>
 // CHECK-RECORD:   BitFields:[<br>
-// CHECK-RECORD:     <CGBitFieldInfo Offset:0 Size:10 IsSigned:1 StorageSize:24 StorageAlignment:1><br>
-// CHECK-RECORD:     <CGBitFieldInfo Offset:10 Size:10 IsSigned:1 StorageSize:24 StorageAlignment:1><br>
+// CHECK-RECORD:     <CGBitFieldInfo Offset:0 Size:10 IsSigned:1 StorageSize:24 StorageOffset:0><br>
+// CHECK-RECORD:     <CGBitFieldInfo Offset:10 Size:10 IsSigned:1 StorageSize:24 StorageOffset:0><br>
<br>
 #pragma pack(push)<br>
 #pragma pack(1)<br>
@@ -102,7 +102,7 @@ unsigned long long test_1() {<br>
 // CHECK-RECORD:   LLVMType:%union.u2 = type { i8 }<br>
 // CHECK-RECORD:   IsZeroInitializable:1<br>
 // CHECK-RECORD:   BitFields:[<br>
-// CHECK-RECORD:     <CGBitFieldInfo Offset:0 Size:3 IsSigned:0 StorageSize:8 StorageAlignment:1><br>
+// CHECK-RECORD:     <CGBitFieldInfo Offset:0 Size:3 IsSigned:0 StorageSize:8 StorageOffset:0><br>
<br>
 union __attribute__((packed)) u2 {<br>
   unsigned long long f0 : 3;<br>
@@ -274,8 +274,8 @@ _Bool test_6() {<br>
 // CHECK-RECORD:   LLVMType:%struct.s7 = type { i32, i32, i32, i8, i32, [12 x i8] }<br>
 // CHECK-RECORD:   IsZeroInitializable:1<br>
 // CHECK-RECORD:   BitFields:[<br>
-// CHECK-RECORD:     <CGBitFieldInfo Offset:0 Size:5 IsSigned:1 StorageSize:8 StorageAlignment:4><br>
-// CHECK-RECORD:     <CGBitFieldInfo Offset:0 Size:29 IsSigned:1 StorageSize:32 StorageAlignment:16><br>
+// CHECK-RECORD:     <CGBitFieldInfo Offset:0 Size:5 IsSigned:1 StorageSize:8 StorageOffset:12><br>
+// CHECK-RECORD:     <CGBitFieldInfo Offset:0 Size:29 IsSigned:1 StorageSize:32 StorageOffset:16><br>
<br>
 struct __attribute__((aligned(16))) s7 {<br>
   int a, b, c;<br>
<br>
Modified: cfe/trunk/test/CodeGen/packed-nest-unpacked.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_CodeGen_packed-2Dnest-2Dunpacked.c-3Frev-3D241916-26r1-3D241915-26r2-3D241916-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=syzcGKg4AYe_MPeHIvvpiYJFQrMHNCXP9ipjkumXA8E&s=0zTqtyiYl3xa5V_R16YgCm2K0-FSrGg_cyt-Fxe0dbo&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/packed-nest-unpacked.c?rev=241916&r1=241915&r2=241916&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/packed-nest-unpacked.c (original)<br>
+++ cfe/trunk/test/CodeGen/packed-nest-unpacked.c Fri Jul 10 12:30:00 2015<br>
@@ -60,6 +60,35 @@ struct YBitfield gbitfield;<br>
<br>
 unsigned test7() {<br>
   // CHECK: @test7<br>
-  // CHECK: load i32, i32* getelementptr inbounds (%struct.YBitfield, %struct.YBitfield* @gbitfield, i32 0, i32 1, i32 0), align 4<br>
+  // CHECK: load i32, i32* getelementptr inbounds (%struct.YBitfield, %struct.YBitfield* @gbitfield, i32 0, i32 1, i32 0), align 1<br>
   return gbitfield.y.b2;<br>
 }<br>
+<br>
+void test8(unsigned x) {<br>
+  // CHECK: @test8<br>
+  // CHECK: load i32, i32* getelementptr inbounds (%struct.YBitfield, %struct.YBitfield* @gbitfield, i32 0, i32 1, i32 0), align 1<br>
+  // CHECK: store i32 {{.*}}, i32* getelementptr inbounds (%struct.YBitfield, %struct.YBitfield* @gbitfield, i32 0, i32 1, i32 0), align 1<br>
+  gbitfield.y.b2 = x;<br>
+}<br>
+<br>
+struct TBitfield<br>
+{<br>
+  long a;<br>
+  char b;<br>
+  unsigned c:15;<br>
+};<br>
+struct TBitfield tbitfield;<br>
+<br>
+unsigned test9() {<br>
+  // CHECK: @test9<br>
+  // CHECK: load i16, i16* getelementptr inbounds (%struct.TBitfield, %struct.TBitfield* @tbitfield, i32 0, i32 2), align 1<br>
+  return tbitfield.c;<br>
+}<br>
+<br>
+void test10(unsigned x) {<br>
+  // CHECK: @test10<br>
+  // CHECK: load i16, i16* getelementptr inbounds (%struct.TBitfield, %struct.TBitfield* @tbitfield, i32 0, i32 2), align 1<br>
+  // CHECK: store i16 {{.*}}, i16* getelementptr inbounds (%struct.TBitfield, %struct.TBitfield* @tbitfield, i32 0, i32 2), align 1<br>
+  tbitfield.c = x;<br>
+}<br>
+<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>