Just wanted to say thanks, and do ping me if you run into trouble finding a way to get the backend to behave here.
On Thu, Aug 14, 2014 at 8:44 AM, Justin Bogner <[email protected]> wrote: > Author: bogner > Date: Thu Aug 14 10:44:29 2014 > New Revision: 215648 > > URL: http://llvm.org/viewvc/llvm-project?rev=215648&view=rev > Log: > Revert "CodeGen: When bitfields fall on natural boundaries, split them up" > > It fits better with LLVM's memory model to try to do this in the > backend. Specifically, narrowing wide loads in the backends should be > relatively straightforward and is generally valuable, whereas widening > loads tends to be very constrained. > > Discussion here: > > > http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20140811/112581.html > > This reverts commit r215614. > > Removed: > cfe/trunk/test/CodeGen/bitfield-machinewords.c > Modified: > cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp > > Modified: cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp?rev=215648&r1=215647&r2=215648&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp Thu Aug 14 10:44:29 > 2014 > @@ -377,10 +377,6 @@ CGRecordLowering::accumulateBitFields(Re > } > return; > } > - > - llvm::Type *WordType = > - DataLayout.getLargestLegalIntType(Types.getLLVMContext()); > - uint64_t WordSize = WordType ? DataLayout.getTypeSizeInBits(WordType) : > 0; > for (;;) { > // Check to see if we need to start a new run. > if (Run == FieldEnd) { > @@ -396,12 +392,9 @@ CGRecordLowering::accumulateBitFields(Re > ++Field; > continue; > } > - // Add bitfields to the run as long as they qualify. If we end up on > a word > - // boundary we insert a break since it's equivalent and very wide > types are > - // harder to optimize with. > + // Add bitfields to the run as long as they qualify. > if (Field != FieldEnd && Field->getBitWidthValue(Context) != 0 && > - Tail == getFieldBitOffset(*Field) && > - WordSize != Tail - StartBitOffset) { > + Tail == getFieldBitOffset(*Field)) { > Tail += Field->getBitWidthValue(Context); > ++Field; > continue; > > Removed: cfe/trunk/test/CodeGen/bitfield-machinewords.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/bitfield-machinewords.c?rev=215647&view=auto > > ============================================================================== > --- cfe/trunk/test/CodeGen/bitfield-machinewords.c (original) > +++ cfe/trunk/test/CodeGen/bitfield-machinewords.c (removed) > @@ -1,79 +0,0 @@ > -// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | > FileCheck %s -check-prefix=CHECK32 > -// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -emit-llvm -o - | > FileCheck %s -check-prefix=CHECK64 > - > -typedef unsigned long long uint64_t; > - > -struct thirty_two_bit_fields { > - unsigned int ttbf1 : 32; > - unsigned int ttbf2 : 32; > - unsigned int ttbf3 : 32; > - unsigned int ttbf4 : 32; > -}; > -void ttbf(struct thirty_two_bit_fields *x) {} > -// CHECK32: %struct.thirty_two_bit_fields = type { i32, i32, i32, i32 } > -// CHECK64: %struct.thirty_two_bit_fields = type { i64, i64 } > - > -struct thirty_two_in_sixty_four { > - uint64_t ttisf1 : 32; > - uint64_t ttisf2 : 32; > - uint64_t ttisf3 : 32; > - uint64_t ttisf4 : 32; > -}; > -void ttisf(struct thirty_two_in_sixty_four *x) {} > -// CHECK32: %struct.thirty_two_in_sixty_four = type { i32, i32, i32, i32 } > -// CHECK64: %struct.thirty_two_in_sixty_four = type { i64, i64 } > - > -struct everything_fits { > - unsigned int ef1 : 2; > - unsigned int ef2 : 29; > - unsigned int ef3 : 1; > - > - unsigned int ef4 : 16; > - unsigned int ef5 : 16; > - > - unsigned int ef6 : 7; > - unsigned int ef7 : 25; > -}; > -void ef(struct everything_fits *x) {} > -// CHECK32: %struct.everything_fits = type { i32, i32, i32 } > -// CHECK64: %struct.everything_fits = type <{ i64, i32 }> > - > -struct not_lined_up { > - uint64_t nlu1 : 31; > - uint64_t nlu2 : 2; > - uint64_t nlu3 : 32; > - uint64_t nlu4 : 31; > -}; > -void nlu(struct not_lined_up *x) {} > -// CHECK32: %struct.not_lined_up = type { i96 } > -// CHECK64: %struct.not_lined_up = type { i40, i64 } > - > -struct padding_between_words { > - unsigned int pbw1 : 16; > - unsigned int pbw2 : 14; > - > - unsigned int pbw3 : 12; > - unsigned int pbw4 : 16; > - > - unsigned int pbw5 : 8; > - unsigned int pbw6 : 10; > - > - unsigned int pbw7 : 20; > - unsigned int pbw8 : 10; > -}; > -void pbw(struct padding_between_words *x) {} > -// CHECK32: %struct.padding_between_words = type { i32, i32, i24, i32 } > -// CHECK64: %struct.padding_between_words = type { i32, i32, i24, i32 } > - > -struct unaligned_are_coalesced { > - uint64_t uac1 : 16; > - uint64_t uac2 : 32; > - uint64_t uac3 : 16; > - uint64_t uac4 : 48; > - uint64_t uac5 : 64; > - uint64_t uac6 : 16; > - uint64_t uac7 : 32; > -}; > -void uac(struct unaligned_are_coalesced *x) {} > -// CHECK32: %struct.unaligned_are_coalesced = type { i112, i112 } > -// CHECK64: %struct.unaligned_are_coalesced = type { i64, i48, i64, i48 } > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
