1e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// RUN: %clang_cc1 -emit-llvm -triple x86_64 -O3 -o %t.opt.ll %s \
2e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// RUN:   -fdump-record-layouts 2> %t.dump.txt
3e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// RUN: FileCheck -check-prefix=CHECK-RECORD < %t.dump.txt %s
4e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// RUN: FileCheck -check-prefix=CHECK-OPT < %t.opt.ll %s
52677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
62677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar/****/
72677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
8e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// Check that we don't read off the end a packed 24-bit structure.
92677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// PR6176
102677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
11e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD: *** Dumping IRgen Record Layout
12e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD: Record: struct s0
13e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD: Layout: <CGRecordLayout
149cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner// CHECK-RECORD:   LLVMType:%struct.s0 = type <{ [3 x i8] }>
15f16aa103d3afd42fbca2ab346f191bf745cec092John McCall// CHECK-RECORD:   IsZeroInitializable:1
16e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:   BitFields:[
17e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:     <CGBitFieldInfo Size:24 IsSigned:1
18e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:                     NumComponents:2 Components: [
19e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:         <AccessInfo FieldIndex:0 FieldByteOffset:0 FieldBitStart:0 AccessWidth:16
2089da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:                     AccessAlignment:1 TargetBitOffset:0 TargetBitWidth:16>
21e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:         <AccessInfo FieldIndex:0 FieldByteOffset:2 FieldBitStart:0 AccessWidth:8
2289da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:                     AccessAlignment:1 TargetBitOffset:16 TargetBitWidth:8>
232677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarstruct __attribute((packed)) s0 {
242677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  int f0 : 24;
252677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar};
262677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
272677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarstruct s0 g0 = { 0xdeadbeef };
282677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
292677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f0_load(struct s0 *a0) {
302677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  int size_check[sizeof(struct s0) == 3 ? 1 : -1];
312677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return a0->f0;
322677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
332677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f0_store(struct s0 *a0) {
342677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return (a0->f0 = 1);
352677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
362677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f0_reload(struct s0 *a0) {
372677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return (a0->f0 += 1);
382677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
392677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
402677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT: define i64 @test_0()
412677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT:  ret i64 1
422677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT: }
432677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarunsigned long long test_0() {
442677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  struct s0 g0 = { 0xdeadbeef };
452677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  unsigned long long res = 0;
462677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= g0.f0;
472677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= f0_load(&g0) ^ f0_store(&g0) ^ f0_reload(&g0);
482677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= g0.f0;
492677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return res;
502677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
512677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
522677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar/****/
532677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
542677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// PR5591
552677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
56e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD: *** Dumping IRgen Record Layout
57e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD: Record: struct s1
58e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD: Layout: <CGRecordLayout
599cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner// CHECK-RECORD:   LLVMType:%struct.s1 = type <{ [2 x i8], i8 }>
60f16aa103d3afd42fbca2ab346f191bf745cec092John McCall// CHECK-RECORD:   IsZeroInitializable:1
61e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:   BitFields:[
62e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:     <CGBitFieldInfo Size:10 IsSigned:1
63e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:                     NumComponents:1 Components: [
64e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:         <AccessInfo FieldIndex:0 FieldByteOffset:0 FieldBitStart:0 AccessWidth:16
6589da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:                     AccessAlignment:1 TargetBitOffset:0 TargetBitWidth:10>
66e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:     ]>
67e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:     <CGBitFieldInfo Size:10 IsSigned:1
68e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:                     NumComponents:2 Components: [
69e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:         <AccessInfo FieldIndex:0 FieldByteOffset:0 FieldBitStart:10 AccessWidth:16
7089da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:                     AccessAlignment:1 TargetBitOffset:0 TargetBitWidth:6>
71e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:         <AccessInfo FieldIndex:0 FieldByteOffset:2 FieldBitStart:0 AccessWidth:8
7289da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:                     AccessAlignment:1 TargetBitOffset:6 TargetBitWidth:4>
73e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar
742677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar#pragma pack(push)
752677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar#pragma pack(1)
762677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarstruct __attribute((packed)) s1 {
772677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  signed f0 : 10;
782677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  signed f1 : 10;
792677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar};
802677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar#pragma pack(pop)
812677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
822677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarstruct s1 g1 = { 0xdeadbeef, 0xdeadbeef };
832677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
842677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f1_load(struct s1 *a0) {
852677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  int size_check[sizeof(struct s1) == 3 ? 1 : -1];
862677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return a0->f1;
872677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
882677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f1_store(struct s1 *a0) {
892677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return (a0->f1 = 1234);
902677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
912677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f1_reload(struct s1 *a0) {
922677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return (a0->f1 += 1234);
932677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
942677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
952677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT: define i64 @test_1()
962677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT:  ret i64 210
972677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT: }
982677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarunsigned long long test_1() {
992677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  struct s1 g1 = { 0xdeadbeef, 0xdeadbeef };
1002677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  unsigned long long res = 0;
1012677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= g1.f0 ^ g1.f1;
1022677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= f1_load(&g1) ^ f1_store(&g1) ^ f1_reload(&g1);
1032677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= g1.f0 ^ g1.f1;
1042677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return res;
1052677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
1062677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1072677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar/****/
1082677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
109e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// Check that we don't access beyond the bounds of a union.
110e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar//
1112677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// PR5567
1122677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
113e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD: *** Dumping IRgen Record Layout
114e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD: Record: union u2
115e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD: Layout: <CGRecordLayout
1169cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner// CHECK-RECORD:   LLVMType:%union.u2 = type <{ i8 }>
117f16aa103d3afd42fbca2ab346f191bf745cec092John McCall// CHECK-RECORD:   IsZeroInitializable:1
118e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:   BitFields:[
119e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:     <CGBitFieldInfo Size:3 IsSigned:0
120e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:                     NumComponents:1 Components: [
121e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar// CHECK-RECORD:         <AccessInfo FieldIndex:0 FieldByteOffset:0 FieldBitStart:0 AccessWidth:8
12289da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:                     AccessAlignment:1 TargetBitOffset:0 TargetBitWidth:3>
123e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbar
124e1467a4ceeeb74cdc54830e03df8d58893e38892Daniel Dunbarunion __attribute__((packed)) u2 {
1252677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  unsigned long long f0 : 3;
1262677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar};
1272677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1282677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarunion u2 g2 = { 0xdeadbeef };
1292677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1302677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f2_load(union u2 *a0) {
1312677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return a0->f0;
1322677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
1332677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f2_store(union u2 *a0) {
1342677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return (a0->f0 = 1234);
1352677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
1362677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f2_reload(union u2 *a0) {
1372677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return (a0->f0 += 1234);
1382677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
1392677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1402677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT: define i64 @test_2()
1412677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT:  ret i64 2
1422677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT: }
1432677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarunsigned long long test_2() {
1442677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  union u2 g2 = { 0xdeadbeef };
1452677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  unsigned long long res = 0;
1462677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= g2.f0;
1472677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= f2_load(&g2) ^ f2_store(&g2) ^ f2_reload(&g2);
1482677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= g2.f0;
1492677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return res;
1502677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
1512677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1522677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar/***/
1532677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1542677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// PR5039
1552677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1562677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarstruct s3 {
1572677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  long long f0 : 32;
1582677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  long long f1 : 32;
1592677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar};
1602677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1612677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarstruct s3 g3 = { 0xdeadbeef, 0xdeadbeef };
1622677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1632677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f3_load(struct s3 *a0) {
1642677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  a0->f0 = 1;
1652677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return a0->f0;
1662677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
1672677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f3_store(struct s3 *a0) {
1682677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  a0->f0 = 1;
1692677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return (a0->f0 = 1234);
1702677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
1712677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f3_reload(struct s3 *a0) {
1722677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  a0->f0 = 1;
1732677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return (a0->f0 += 1234);
1742677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
1752677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1762677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT: define i64 @test_3()
1772677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT:  ret i64 -559039940
1782677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT: }
1792677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarunsigned long long test_3() {
1802677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  struct s3 g3 = { 0xdeadbeef, 0xdeadbeef };
1812677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  unsigned long long res = 0;
1822677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= g3.f0 ^ g3.f1;
1832677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= f3_load(&g3) ^ f3_store(&g3) ^ f3_reload(&g3);
1842677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= g3.f0 ^ g3.f1;
1852677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return res;
1862677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
1872677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1882677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar/***/
1892677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1902677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// This is a case where the bitfield access will straddle an alignment boundary
1912677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// of its underlying type.
1922677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1932677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarstruct s4 {
1942677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  unsigned f0 : 16;
1952677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  unsigned f1 : 28 __attribute__ ((packed));
1962677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar};
1972677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
1982677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarstruct s4 g4 = { 0xdeadbeef, 0xdeadbeef };
1992677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
2002677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f4_load(struct s4 *a0) {
2012677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return a0->f0 ^ a0->f1;
2022677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
2032677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f4_store(struct s4 *a0) {
2042677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return (a0->f0 = 1234) ^ (a0->f1 = 5678);
2052677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
2062677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f4_reload(struct s4 *a0) {
2072677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return (a0->f0 += 1234) ^ (a0->f1 += 5678);
2082677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
2092677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
2102677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT: define i64 @test_4()
2112677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT:  ret i64 4860
2122677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT: }
2132677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarunsigned long long test_4() {
2142677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  struct s4 g4 = { 0xdeadbeef, 0xdeadbeef };
2152677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  unsigned long long res = 0;
2162677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= g4.f0 ^ g4.f1;
2172677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= f4_load(&g4) ^ f4_store(&g4) ^ f4_reload(&g4);
2182677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= g4.f0 ^ g4.f1;
2192677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return res;
2202677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
2212677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
2222677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar/***/
2232677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
2242677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarstruct s5 {
2252677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  unsigned f0 : 2;
2262677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  _Bool f1 : 1;
2272677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  _Bool f2 : 1;
2282677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar};
2292677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
2302677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarstruct s5 g5 = { 0xdeadbeef, 0xdeadbeef };
2312677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
2322677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f5_load(struct s5 *a0) {
2332677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return a0->f0 ^ a0->f1;
2342677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
2352677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f5_store(struct s5 *a0) {
2362677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return (a0->f0 = 0xF) ^ (a0->f1 = 0xF) ^ (a0->f2 = 0xF);
2372677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
2382677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarint f5_reload(struct s5 *a0) {
2392677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return (a0->f0 += 0xF) ^ (a0->f1 += 0xF) ^ (a0->f2 += 0xF);
2402677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
2412677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar
2422677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT: define i64 @test_5()
2432677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT:  ret i64 2
2442677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar// CHECK-OPT: }
2452677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbarunsigned long long test_5() {
2462677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  struct s5 g5 = { 0xdeadbeef, 0xdeadbeef, 0xdeadbeef };
2472677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  unsigned long long res = 0;
2482677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= g5.f0 ^ g5.f1 ^ g5.f2;
2492677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= f5_load(&g5) ^ f5_store(&g5) ^ f5_reload(&g5);
2502677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  res ^= g5.f0 ^ g5.f1 ^ g5.f2;
2512677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar  return res;
2522677261656b2f3325218d38bdd9d102ad732da92Daniel Dunbar}
2534803535dfef2626d2aec18ef92450b5008945352Anders Carlsson
2548ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar/***/
2558ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar
2568ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbarstruct s6 {
2578ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar  _Bool f0 : 2;
2584803535dfef2626d2aec18ef92450b5008945352Anders Carlsson};
2594803535dfef2626d2aec18ef92450b5008945352Anders Carlsson
2608ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbarstruct s6 g6 = { 0xF };
2618ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar
2628ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbarint f6_load(struct s6 *a0) {
2638ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar  return a0->f0;
2648ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar}
2658ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbarint f6_store(struct s6 *a0) {
2668ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar  return a0->f0 = 0x0;
2678ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar}
2688ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbarint f6_reload(struct s6 *a0) {
2698ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar  return (a0->f0 += 0xF);
2708ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar}
2718ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar
2724803535dfef2626d2aec18ef92450b5008945352Anders Carlsson// CHECK-OPT: define zeroext i1 @test_6()
2738ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar// CHECK-OPT:  ret i1 true
2744803535dfef2626d2aec18ef92450b5008945352Anders Carlsson// CHECK-OPT: }
2754803535dfef2626d2aec18ef92450b5008945352Anders Carlsson_Bool test_6() {
2768ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar  struct s6 g6 = { 0xF };
2778ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar  unsigned long long res = 0;
2788ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar  res ^= g6.f0;
2798ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar  res ^= f6_load(&g6);
2808ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar  res ^= g6.f0;
2818ab78a7d9d755975db67170cae64c05d5176c00cDaniel Dunbar  return res;
2824803535dfef2626d2aec18ef92450b5008945352Anders Carlsson}
28389da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar
28489da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar/***/
28589da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar
28689da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// Check that we compute the best alignment possible for each access.
28789da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar//
28889da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD: *** Dumping IRgen Record Layout
28989da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD: Record: struct s7
29089da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD: Layout: <CGRecordLayout
2919cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner// CHECK-RECORD:   LLVMType:%struct.s7 = type { i32, i32, i32, i8, [3 x i8], [4 x i8], [12 x i8] }
292f16aa103d3afd42fbca2ab346f191bf745cec092John McCall// CHECK-RECORD:   IsZeroInitializable:1
29389da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:   BitFields:[
29489da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:     <CGBitFieldInfo Size:5 IsSigned:1
29589da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:                     NumComponents:1 Components: [
29689da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:         <AccessInfo FieldIndex:0 FieldByteOffset:12 FieldBitStart:0 AccessWidth:32
29789da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:                     AccessAlignment:4 TargetBitOffset:0 TargetBitWidth:5>
29889da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:     ]>
29989da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:     <CGBitFieldInfo Size:29 IsSigned:1
30089da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:                     NumComponents:1 Components: [
30189da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:         <AccessInfo FieldIndex:0 FieldByteOffset:16 FieldBitStart:0 AccessWidth:32
30289da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar// CHECK-RECORD:                     AccessAlignment:16 TargetBitOffset:0 TargetBitWidth:29>
30389da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar
30489da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbarstruct __attribute__((aligned(16))) s7 {
30589da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar  int a, b, c;
30689da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar  int f0 : 5;
30789da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar  int f1 : 29;
30889da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar};
30989da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar
31089da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbarint f7_load(struct s7 *a0) {
31189da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar  return a0->f0;
31289da874f8ecfebabdac2c6e9b7930ebe179ccf81Daniel Dunbar}
3134651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar
3144651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar/***/
3154651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar
3164651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar// This is a case where we narrow the access width immediately.
3174651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar
3184651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbarstruct __attribute__((packed)) s8 {
3194651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  char f0 : 4;
3204651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  char f1;
3214651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  int  f2 : 4;
3224651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  char f3 : 4;
3234651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar};
3244651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar
3254651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbarstruct s8 g8 = { 0xF };
3264651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar
3274651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbarint f8_load(struct s8 *a0) {
3284651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  return a0->f0 ^ a0 ->f2 ^ a0->f3;
3294651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar}
3304651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbarint f8_store(struct s8 *a0) {
3314651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  return (a0->f0 = 0xFD) ^ (a0->f2 = 0xFD) ^ (a0->f3 = 0xFD);
3324651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar}
3334651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbarint f8_reload(struct s8 *a0) {
3344651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  return (a0->f0 += 0xFD) ^ (a0->f2 += 0xFD) ^ (a0->f3 += 0xFD);
3354651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar}
3364651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar
3374651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar// CHECK-OPT: define i32 @test_8()
3384651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar// CHECK-OPT:  ret i32 -3
3394651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar// CHECK-OPT: }
3404651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbarunsigned test_8() {
3414651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  struct s8 g8 = { 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef };
3424651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  unsigned long long res = 0;
3434651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  res ^= g8.f0 ^ g8.f2 ^ g8.f3;
3444651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  res ^= f8_load(&g8) ^ f8_store(&g8) ^ f8_reload(&g8);
3454651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  res ^= g8.f0 ^ g8.f2 ^ g8.f3;
3464651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar  return res;
3474651efb5ba5710c91b58c8b86872b264dd71f464Daniel Dunbar}
34852968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar
34952968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar/***/
35052968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar
35152968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar// This is another case where we narrow the access width immediately.
35252968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar//
35352968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar// <rdar://problem/7893760>
35452968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar
35552968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbarstruct __attribute__((packed)) s9 {
35652968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar  unsigned f0 : 7;
35752968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar  unsigned f1 : 7;
35852968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar  unsigned f2 : 7;
35952968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar  unsigned f3 : 7;
36052968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar  unsigned f4 : 7;
36152968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar  unsigned f5 : 7;
36252968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar  unsigned f6 : 7;
36352968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar  unsigned f7 : 7;
36452968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar};
36552968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar
36652968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbarint f9_load(struct s9 *a0) {
36752968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar  return a0->f7;
36852968a1c765e43000f904ecb27a6353b0185bcd6Daniel Dunbar}
369