tbaa.cpp revision c80e0314cd2e1c5e6021aeac155b8a181a27e2e1
1// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -disable-llvm-optzns %s -emit-llvm -o - | FileCheck %s
2// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -struct-path-tbaa -disable-llvm-optzns %s -emit-llvm -o - | FileCheck %s -check-prefix=PATH
3// Test TBAA metadata generated by front-end.
4
5typedef unsigned char uint8_t;
6typedef unsigned short uint16_t;
7typedef unsigned int uint32_t;
8typedef unsigned long long uint64_t;
9typedef struct
10{
11   uint16_t f16;
12   uint32_t f32;
13   uint16_t f16_2;
14   uint32_t f32_2;
15} StructA;
16typedef struct
17{
18   uint16_t f16;
19   StructA a;
20   uint32_t f32;
21} StructB;
22typedef struct
23{
24   uint16_t f16;
25   StructB b;
26   uint32_t f32;
27} StructC;
28typedef struct
29{
30   uint16_t f16;
31   StructB b;
32   uint32_t f32;
33   uint8_t f8;
34} StructD;
35
36typedef struct
37{
38   uint16_t f16;
39   uint32_t f32;
40} StructS;
41typedef struct
42{
43   uint16_t f16;
44   uint32_t f32;
45} StructS2;
46
47uint32_t g(uint32_t *s, StructA *A, uint64_t count) {
48// CHECK: define i32 @{{.*}}(
49// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
50// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
51// PATH: define i32 @{{.*}}(
52// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
53// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !5
54  *s = 1;
55  A->f32 = 4;
56  return *s;
57}
58
59uint32_t g2(uint32_t *s, StructA *A, uint64_t count) {
60// CHECK: define i32 @{{.*}}(
61// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
62// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa !5
63// PATH: define i32 @{{.*}}(
64// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
65// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa !8
66  *s = 1;
67  A->f16 = 4;
68  return *s;
69}
70
71uint32_t g3(StructA *A, StructB *B, uint64_t count) {
72// CHECK: define i32 @{{.*}}(
73// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
74// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
75// PATH: define i32 @{{.*}}(
76// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !5
77// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !9
78  A->f32 = 1;
79  B->a.f32 = 4;
80  return A->f32;
81}
82
83uint32_t g4(StructA *A, StructB *B, uint64_t count) {
84// CHECK: define i32 @{{.*}}(
85// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
86// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa !5
87// PATH: define i32 @{{.*}}(
88// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !5
89// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa !11
90  A->f32 = 1;
91  B->a.f16 = 4;
92  return A->f32;
93}
94
95uint32_t g5(StructA *A, StructB *B, uint64_t count) {
96// CHECK: define i32 @{{.*}}(
97// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
98// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
99// PATH: define i32 @{{.*}}(
100// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !5
101// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !12
102  A->f32 = 1;
103  B->f32 = 4;
104  return A->f32;
105}
106
107uint32_t g6(StructA *A, StructB *B, uint64_t count) {
108// CHECK: define i32 @{{.*}}(
109// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
110// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
111// PATH: define i32 @{{.*}}(
112// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !5
113// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !13
114  A->f32 = 1;
115  B->a.f32_2 = 4;
116  return A->f32;
117}
118
119uint32_t g7(StructA *A, StructS *S, uint64_t count) {
120// CHECK: define i32 @{{.*}}(
121// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
122// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
123// PATH: define i32 @{{.*}}(
124// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !5
125// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !14
126  A->f32 = 1;
127  S->f32 = 4;
128  return A->f32;
129}
130
131uint32_t g8(StructA *A, StructS *S, uint64_t count) {
132// CHECK: define i32 @{{.*}}(
133// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
134// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa !5
135// PATH: define i32 @{{.*}}(
136// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !5
137// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa !16
138  A->f32 = 1;
139  S->f16 = 4;
140  return A->f32;
141}
142
143uint32_t g9(StructS *S, StructS2 *S2, uint64_t count) {
144// CHECK: define i32 @{{.*}}(
145// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
146// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
147// PATH: define i32 @{{.*}}(
148// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !14
149// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !17
150  S->f32 = 1;
151  S2->f32 = 4;
152  return S->f32;
153}
154
155uint32_t g10(StructS *S, StructS2 *S2, uint64_t count) {
156// CHECK: define i32 @{{.*}}(
157// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
158// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa !5
159// PATH: define i32 @{{.*}}(
160// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !14
161// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa !19
162  S->f32 = 1;
163  S2->f16 = 4;
164  return S->f32;
165}
166
167uint32_t g11(StructC *C, StructD *D, uint64_t count) {
168// CHECK: define i32 @{{.*}}(
169// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
170// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
171// PATH: define i32 @{{.*}}(
172// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !20
173// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !22
174  C->b.a.f32 = 1;
175  D->b.a.f32 = 4;
176  return C->b.a.f32;
177}
178
179uint32_t g12(StructC *C, StructD *D, uint64_t count) {
180// CHECK: define i32 @{{.*}}(
181// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
182// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
183// TODO: differentiate the two accesses.
184// PATH: define i32 @{{.*}}(
185// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !9
186// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !9
187  StructB *b1 = &(C->b);
188  StructB *b2 = &(D->b);
189  // b1, b2 have different context.
190  b1->a.f32 = 1;
191  b2->a.f32 = 4;
192  return b1->a.f32;
193}
194
195// CHECK: !1 = metadata !{metadata !"omnipotent char", metadata !2}
196// CHECK: !2 = metadata !{metadata !"Simple C/C++ TBAA"}
197// CHECK: !4 = metadata !{metadata !"int", metadata !1}
198// CHECK: !5 = metadata !{metadata !"short", metadata !1}
199
200// PATH: !1 = metadata !{metadata !"omnipotent char", metadata !2}
201// PATH: !4 = metadata !{metadata !"int", metadata !1}
202// PATH: !5 = metadata !{metadata !6, metadata !4, i64 4}
203// PATH: !6 = metadata !{metadata !"_ZTS7StructA", i64 0, metadata !7, i64 4, metadata !4}
204// PATH: !7 = metadata !{metadata !"short", metadata !1}
205// PATH: !8 = metadata !{metadata !6, metadata !7, i64 0}
206// PATH: !9 = metadata !{metadata !10, metadata !4, i64 8}
207// PATH: !10 = metadata !{metadata !"_ZTS7StructB", i64 0, metadata !7, i64 4, metadata !6, i64 20, metadata !4}
208// PATH: !11 = metadata !{metadata !10, metadata !7, i64 4}
209// PATH: !12 = metadata !{metadata !10, metadata !4, i64 20}
210// PATH: !13 = metadata !{metadata !10, metadata !4, i64 16}
211// PATH: !14 = metadata !{metadata !15, metadata !4, i64 4}
212// PATH: !15 = metadata !{metadata !"_ZTS7StructS", i64 0, metadata !7, i64 4, metadata !4}
213// PATH: !16 = metadata !{metadata !15, metadata !7, i64 0}
214// PATH: !17 = metadata !{metadata !18, metadata !4, i64 4}
215// PATH: !18 = metadata !{metadata !"_ZTS8StructS2", i64 0, metadata !7, i64 4, metadata !4}
216// PATH: !19 = metadata !{metadata !18, metadata !7, i64 0}
217// PATH: !20 = metadata !{metadata !21, metadata !4, i64 12}
218// PATH: !21 = metadata !{metadata !"_ZTS7StructC", i64 0, metadata !7, i64 4, metadata !10, i64 28, metadata !4}
219// PATH: !22 = metadata !{metadata !23, metadata !4, i64 12}
220// PATH: !23 = metadata !{metadata !"_ZTS7StructD", i64 0, metadata !7, i64 4, metadata !10, i64 28, metadata !4, i64 32, metadata !1}
221