blob: 066d7c9e9ff8184b8536d881d884105d07316cbc [file] [log] [blame]
Ivan A. Kosarevda342472017-11-30 09:26:39 +00001// RUN: %clang_cc1 -triple x86_64-linux -O1 -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s
2//
3// Check that we generate correct TBAA information for accesses to union
4// members.
5
6struct X {
7 int a, b;
8 int arr[3];
9 int c, d;
10};
11
12union U {
13 int i;
14 X x;
15 int j;
16};
17
18struct S {
19 U u, v;
20};
21
22union N {
23 int i;
24 S s;
25 int j;
26};
27
28struct R {
29 N n, m;
30};
31
32int f1(U *p) {
33// CHECK-LABEL: _Z2f1P1U
34// CHECK: load i32, i32* {{.*}}, !tbaa [[TAG_U_j:!.*]]
35 return p->j;
36}
37
38int f2(S *p) {
39// CHECK-LABEL: _Z2f2P1S
40// CHECK: load i32, i32* {{.*}}, !tbaa [[TAG_S_u_i:!.*]]
41 return p->u.i;
42}
43
44int f3(S *p) {
45// CHECK-LABEL: _Z2f3P1S
46// CHECK: load i32, i32* {{.*}}, !tbaa [[TAG_S_v_j:!.*]]
47 return p->v.j;
48}
49
50int f4(S *p) {
51// CHECK-LABEL: _Z2f4P1S
52// CHECK: load i32, i32* {{.*}}, !tbaa [[TAG_S_u_x_b:!.*]]
53 return p->u.x.b;
54}
55
56int f5(S *p) {
57// CHECK-LABEL: _Z2f5P1S
58// CHECK: load i32, i32* {{.*}}, !tbaa [[TAG_S_v_x_b:!.*]]
59 return p->v.x.b;
60}
61
62int f6(S *p) {
63// CHECK-LABEL: _Z2f6P1S
64// CHECK: load i32, i32* {{.*}}, !tbaa [[TAG_S_u_x_arr:!.*]]
65 return p->u.x.arr[1];
66}
67
68int f7(S *p) {
69// CHECK-LABEL: _Z2f7P1S
70// CHECK: load i32, i32* {{.*}}, !tbaa [[TAG_S_v_x_arr:!.*]]
71 return p->v.x.arr[1];
72}
73
74int f8(N *p) {
75// CHECK-LABEL: _Z2f8P1N
76// CHECK: load i32, i32* {{.*}}, !tbaa [[TAG_N_s_v_x_c:!.*]]
77 return p->s.v.x.c;
78}
79
80int f9(R *p) {
81// CHECK-LABEL: _Z2f9P1R
82// CHECK: load i32, i32* {{.*}}, !tbaa [[TAG_R_m_s_v_x_c:!.*]]
83 return p->m.s.v.x.c;
84}
85
86// CHECK-DAG: [[TAG_U_j]] = !{[[TYPE_U:!.*]], [[TYPE_union_member:!.*]], i64 0}
87// CHECK-DAG: [[TAG_S_u_i]] = !{[[TYPE_S:!.*]], [[TYPE_union_member]], i64 0}
88// CHECK-DAG: [[TAG_S_u_x_b]] = !{[[TYPE_S:!.*]], [[TYPE_union_member]], i64 0}
89// CHECK-DAG: [[TAG_S_u_x_arr]] = !{[[TYPE_S:!.*]], [[TYPE_union_member]], i64 0}
90// CHECK-DAG: [[TAG_S_v_j]] = !{[[TYPE_S:!.*]], [[TYPE_union_member]], i64 28}
91// CHECK-DAG: [[TAG_S_v_x_b]] = !{[[TYPE_S:!.*]], [[TYPE_union_member]], i64 28}
92// CHECK-DAG: [[TAG_S_v_x_arr]] = !{[[TYPE_S:!.*]], [[TYPE_union_member]], i64 28}
93// CHECK-DAG: [[TAG_N_s_v_x_c]] = !{[[TYPE_N:!.*]], [[TYPE_union_member]], i64 0}
94// CHECK-DAG: [[TAG_R_m_s_v_x_c]] = !{[[TYPE_R:!.*]], [[TYPE_union_member]], i64 56}
95// CHECK-DAG: [[TYPE_U]] = !{!"_ZTS1U", [[TYPE_union_member]], i64 0}
96// CHECK-DAG: [[TYPE_S]] = !{!"_ZTS1S", [[TYPE_U]], i64 0, [[TYPE_U]], i64 28}
97// CHECK-DAG: [[TYPE_N]] = !{!"_ZTS1N", [[TYPE_union_member]], i64 0}
98// CHECK-DAG: [[TYPE_R]] = !{!"_ZTS1R", [[TYPE_N]], i64 0, [[TYPE_N]], i64 56}
99// CHECK-DAG: [[TYPE_union_member]] = !{!"union member", [[TYPE_char:!.*]], i64 0}
100// CHECK-DAG: [[TYPE_char]] = !{!"omnipotent char", {{.*}}, i64 0}