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