]> granicus.if.org Git - clang/commitdiff
Revert "CodeGen: When bitfields fall on natural boundaries, split them up"
authorJustin Bogner <mail@justinbogner.com>
Thu, 14 Aug 2014 15:44:29 +0000 (15:44 +0000)
committerJustin Bogner <mail@justinbogner.com>
Thu, 14 Aug 2014 15:44:29 +0000 (15:44 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215648 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGRecordLayoutBuilder.cpp
test/CodeGen/bitfield-machinewords.c [deleted file]

index 06192bd2eead6c3c71192c73846331f826a9909d..a10d8e791b0f52e0672d108ef0da8271cfa91a03 100644 (file)
@@ -377,10 +377,6 @@ CGRecordLowering::accumulateBitFields(RecordDecl::field_iterator Field,
     }
     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(RecordDecl::field_iterator Field,
       ++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;
diff --git a/test/CodeGen/bitfield-machinewords.c b/test/CodeGen/bitfield-machinewords.c
deleted file mode 100644 (file)
index 3d370e7..0000000
+++ /dev/null
@@ -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 }