13a163318526e7bfaa6012b411934728e2954047eManman Ren// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -disable-llvm-optzns %s -emit-llvm -o - | FileCheck %s
23a163318526e7bfaa6012b411934728e2954047eManman Ren// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -struct-path-tbaa -disable-llvm-optzns %s -emit-llvm -o - | FileCheck %s -check-prefix=PATH
3b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// Test TBAA metadata generated by front-end.
4b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
5c80e0314cd2e1c5e6021aeac155b8a181a27e2e1Manman Rentypedef unsigned char uint8_t;
6c80e0314cd2e1c5e6021aeac155b8a181a27e2e1Manman Rentypedef unsigned short uint16_t;
7c80e0314cd2e1c5e6021aeac155b8a181a27e2e1Manman Rentypedef unsigned int uint32_t;
8c80e0314cd2e1c5e6021aeac155b8a181a27e2e1Manman Rentypedef unsigned long long uint64_t;
9b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Rentypedef struct
10b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren{
11b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint16_t f16;
12b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint32_t f32;
13b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint16_t f16_2;
14b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint32_t f32_2;
15b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} StructA;
16b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Rentypedef struct
17b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren{
18b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint16_t f16;
19b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   StructA a;
20b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint32_t f32;
21b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} StructB;
22b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Rentypedef struct
23b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren{
24b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint16_t f16;
25b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   StructB b;
26b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint32_t f32;
27b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} StructC;
28b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Rentypedef struct
29b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren{
30b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint16_t f16;
31b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   StructB b;
32b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint32_t f32;
33b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint8_t f8;
34b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} StructD;
35b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
36b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Rentypedef struct
37b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren{
38b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint16_t f16;
39b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint32_t f32;
40b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} StructS;
41b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Rentypedef struct
42b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren{
43b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint16_t f16;
44b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren   uint32_t f32;
45b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} StructS2;
46b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
47b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g(uint32_t *s, StructA *A, uint64_t count) {
48b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}(
49eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32:!.*]]
50eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
51b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}(
52ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32:!.*]]
53ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32:!.*]]
54b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  *s = 1;
55b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  A->f32 = 4;
56b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  return *s;
57b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren}
58b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
59b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g2(uint32_t *s, StructA *A, uint64_t count) {
60b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}(
61eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
62eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_i16:!.*]]
63b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}(
64ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
65ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_A_f16:!.*]]
66b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  *s = 1;
67b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  A->f16 = 4;
68b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  return *s;
69b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren}
70b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
71b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g3(StructA *A, StructB *B, uint64_t count) {
72b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}(
73eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
74eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
75b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}(
76ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]]
77ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_B_a_f32:!.*]]
78b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  A->f32 = 1;
79b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  B->a.f32 = 4;
80b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  return A->f32;
81b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren}
82b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
83b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g4(StructA *A, StructB *B, uint64_t count) {
84b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}(
85eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
86eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_i16]]
87b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}(
88ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]]
89ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_B_a_f16:!.*]]
90b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  A->f32 = 1;
91b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  B->a.f16 = 4;
92b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  return A->f32;
93b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren}
94b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
95b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g5(StructA *A, StructB *B, uint64_t count) {
96b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}(
97eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
98eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
99b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}(
100ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]]
101ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_B_f32:!.*]]
102b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  A->f32 = 1;
103b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  B->f32 = 4;
104b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  return A->f32;
105b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren}
106b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
107b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g6(StructA *A, StructB *B, uint64_t count) {
108b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}(
109eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
110eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
111b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}(
112ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]]
113ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_B_a_f32_2:!.*]]
114b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  A->f32 = 1;
115b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  B->a.f32_2 = 4;
116b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  return A->f32;
117b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren}
118b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
119b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g7(StructA *A, StructS *S, uint64_t count) {
120b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}(
121eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
122eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
123b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}(
124ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]]
125ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_S_f32:!.*]]
126b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  A->f32 = 1;
127b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  S->f32 = 4;
128b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  return A->f32;
129b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren}
130b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
131b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g8(StructA *A, StructS *S, uint64_t count) {
132b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}(
133eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
134eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_i16]]
135b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}(
136ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]]
137ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_S_f16:!.*]]
138b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  A->f32 = 1;
139b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  S->f16 = 4;
140b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  return A->f32;
141b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren}
142b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
143b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g9(StructS *S, StructS2 *S2, uint64_t count) {
144b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}(
145eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
146eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
147b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}(
148ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_S_f32]]
149ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_S2_f32:!.*]]
150b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  S->f32 = 1;
151b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  S2->f32 = 4;
152b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  return S->f32;
153b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren}
154b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
155b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g10(StructS *S, StructS2 *S2, uint64_t count) {
156b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}(
157eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
158eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_i16]]
159b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}(
160ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_S_f32]]
161ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_S2_f16:!.*]]
162b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  S->f32 = 1;
163b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  S2->f16 = 4;
164b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  return S->f32;
165b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren}
166b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
167b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g11(StructC *C, StructD *D, uint64_t count) {
168b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}(
169eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
170eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
171b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}(
172ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_C_b_a_f32:!.*]]
173ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_D_b_a_f32:!.*]]
174b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  C->b.a.f32 = 1;
175b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  D->b.a.f32 = 4;
176b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  return C->b.a.f32;
177b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren}
178b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
179b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g12(StructC *C, StructD *D, uint64_t count) {
180b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}(
181eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
182eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]]
183b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// TODO: differentiate the two accesses.
184b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}(
185ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_B_a_f32]]
186ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_B_a_f32]]
187b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  StructB *b1 = &(C->b);
188b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  StructB *b2 = &(D->b);
189b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  // b1, b2 have different context.
190b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  b1->a.f32 = 1;
191b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  b2->a.f32 = 4;
192b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren  return b1->a.f32;
193b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren}
194b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
195c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// Make sure that zero-length bitfield works.
196c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren#define ATTR __attribute__ ((ms_struct))
197c7f2bfb4a2dcda757619356a28cb633711a6548cManman Renstruct five {
198c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren  char a;
199c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren  int :0;        /* ignored; prior field is not a bitfield. */
200c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren  char b;
201c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren  char c;
202c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren} ATTR;
203c7f2bfb4a2dcda757619356a28cb633711a6548cManman Renchar g13(struct five *a, struct five *b) {
204c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren  return a->b;
205c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// CHECK: define signext i8 @{{.*}}(
206eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: load i8* %{{.*}}, align 1, !tbaa [[TAG_char:!.*]]
207c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// PATH: define signext i8 @{{.*}}(
208c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// PATH: load i8* %{{.*}}, align 1, !tbaa [[TAG_five_b:!.*]]
209c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren}
210c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren
211c7f2bfb4a2dcda757619356a28cb633711a6548cManman Renstruct six {
212c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren  char a;
213c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren  int :0;
214c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren  char b;
215c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren  char c;
216c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren};
217c7f2bfb4a2dcda757619356a28cb633711a6548cManman Renchar g14(struct six *a, struct six *b) {
218c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// CHECK: define signext i8 @{{.*}}(
219eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: load i8* %{{.*}}, align 1, !tbaa [[TAG_char]]
220c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// PATH: define signext i8 @{{.*}}(
221c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// PATH: load i8* %{{.*}}, align 1, !tbaa [[TAG_six_b:!.*]]
222c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren  return a->b;
223c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren}
224c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren
225eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: [[TAG_char]] = metadata !{metadata !"omnipotent char", metadata [[TAG_cxx_tbaa:!.*]]}
226eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: [[TAG_cxx_tbaa]] = metadata !{metadata !"Simple C/C++ TBAA"}
227eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: [[TAG_i32]] = metadata !{metadata !"int", metadata [[TAG_char]]}
228eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: [[TAG_i16]] = metadata !{metadata !"short", metadata [[TAG_char]]}
229b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren
230eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// PATH: [[TYPE_CHAR:!.*]] = metadata !{metadata !"omnipotent char", metadata
231ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_i32]] = metadata !{metadata [[TYPE_INT:!.*]], metadata [[TYPE_INT]], i64 0}
23250be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_INT]] = metadata !{metadata !"int", metadata [[TYPE_CHAR]]
233ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_A_f32]] = metadata !{metadata [[TYPE_A:!.*]], metadata [[TYPE_INT]], i64 4}
23450be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_A]] = metadata !{metadata !"_ZTS7StructA", metadata [[TYPE_SHORT:!.*]], i64 0, metadata [[TYPE_INT]], i64 4, metadata [[TYPE_SHORT]], i64 8, metadata [[TYPE_INT]], i64 12}
23550be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_SHORT:!.*]] = metadata !{metadata !"short", metadata [[TYPE_CHAR]]
236ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_A_f16]] = metadata !{metadata [[TYPE_A]], metadata [[TYPE_SHORT]], i64 0}
237ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_B_a_f32]] = metadata !{metadata [[TYPE_B:!.*]], metadata [[TYPE_INT]], i64 8}
23850be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_B]] = metadata !{metadata !"_ZTS7StructB", metadata [[TYPE_SHORT]], i64 0, metadata [[TYPE_A]], i64 4, metadata [[TYPE_INT]], i64 20}
239ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_B_a_f16]] = metadata !{metadata [[TYPE_B]], metadata [[TYPE_SHORT]], i64 4}
240ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_B_f32]] = metadata !{metadata [[TYPE_B]], metadata [[TYPE_INT]], i64 20}
241ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_B_a_f32_2]] = metadata !{metadata [[TYPE_B]], metadata [[TYPE_INT]], i64 16}
242ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_S_f32]] = metadata !{metadata [[TYPE_S:!.*]], metadata [[TYPE_INT]], i64 4}
24350be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_S]] = metadata !{metadata !"_ZTS7StructS", metadata [[TYPE_SHORT]], i64 0, metadata [[TYPE_INT]], i64 4}
244ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_S_f16]] = metadata !{metadata [[TYPE_S]], metadata [[TYPE_SHORT]], i64 0}
245ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_S2_f32]] = metadata !{metadata [[TYPE_S2:!.*]], metadata [[TYPE_INT]], i64 4}
24650be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_S2]] = metadata !{metadata !"_ZTS8StructS2", metadata [[TYPE_SHORT]], i64 0, metadata [[TYPE_INT]], i64 4}
247ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_S2_f16]] = metadata !{metadata [[TYPE_S2]], metadata [[TYPE_SHORT]], i64 0}
248ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_C_b_a_f32]] = metadata !{metadata [[TYPE_C:!.*]], metadata [[TYPE_INT]], i64 12}
24950be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_C]] = metadata !{metadata !"_ZTS7StructC", metadata [[TYPE_SHORT]], i64 0, metadata [[TYPE_B]], i64 4, metadata [[TYPE_INT]], i64 28}
250ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_D_b_a_f32]] = metadata !{metadata [[TYPE_D:!.*]], metadata [[TYPE_INT]], i64 12}
25150be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_D]] = metadata !{metadata !"_ZTS7StructD", metadata [[TYPE_SHORT]], i64 0, metadata [[TYPE_B]], i64 4, metadata [[TYPE_INT]], i64 28, metadata [[TYPE_CHAR]], i64 32}
252c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// PATH: [[TAG_five_b]] = metadata !{metadata [[TYPE_five:!.*]], metadata [[TYPE_CHAR]], i64 1}
253cd06f26835033e879a9278941f4f6e6a4086976dEli Friedman// PATH: [[TYPE_five]] = metadata !{metadata !"_ZTS4five", metadata [[TYPE_CHAR]], i64 0, metadata [[TYPE_INT]], i64 1, metadata [[TYPE_CHAR]], i64 1, metadata [[TYPE_CHAR]], i64 2}
254c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// PATH: [[TAG_six_b]] = metadata !{metadata [[TYPE_six:!.*]], metadata [[TYPE_CHAR]], i64 4}
25550be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_six]] = metadata !{metadata !"_ZTS3six", metadata [[TYPE_CHAR]], i64 0, metadata [[TYPE_INT]], i64 4, metadata [[TYPE_CHAR]], i64 4, metadata [[TYPE_CHAR]], i64 5}
256