summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/CodeGen/CGRecordLayoutBuilder.cpp11
-rw-r--r--clang/test/CodeGen/bitfield-machinewords.c79
2 files changed, 2 insertions, 88 deletions
diff --git a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
index 06192bd2eea..a10d8e791b0 100644
--- a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
+++ b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
@@ -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/clang/test/CodeGen/bitfield-machinewords.c b/clang/test/CodeGen/bitfield-machinewords.c
deleted file mode 100644
index 3d370e7112f..00000000000
--- a/clang/test/CodeGen/bitfield-machinewords.c
+++ /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 }
OpenPOWER on IntegriCloud