r215648 - Revert "CodeGen: When bitfields fall on natural boundaries, split them up"
Chandler Carruth
chandlerc at google.com
Thu Aug 14 16:54:02 PDT 2014
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 <mail at justinbogner.com>
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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140814/47d46377/attachment.html>
More information about the cfe-commits
mailing list