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