blob: 64f8835d777d2fdf1d9681adaafb600448516710 [file] [log] [blame]
Chih-Hung Hsieh08600532019-12-19 15:55:38 -08001// RUN: %clang -target x86_64 -emit-llvm -S -g %s -o - | FileCheck %s
2
3#define _(x) (__builtin_preserve_access_index(x))
4
5const void *unit1(const void *arg) {
6 return _(arg);
7}
8// CHECK: define dso_local i8* @unit1
9// CHECK-NOT: llvm.preserve.array.access.index
10// CHECK-NOT: llvm.preserve.struct.access.index
11// CHECK-NOT: llvm.preserve.union.access.index
12
13const void *unit2(void) {
14 return _((const void *)0xffffffffFFFF0000ULL);
15}
16// CHECK: define dso_local i8* @unit2
17// CHECK-NOT: llvm.preserve.array.access.index
18// CHECK-NOT: llvm.preserve.struct.access.index
19// CHECK-NOT: llvm.preserve.union.access.index
20
21const void *unit3(const int *arg) {
22 return _(arg + 1);
23}
24// CHECK: define dso_local i8* @unit3
25// CHECK-NOT: llvm.preserve.array.access.index
26// CHECK-NOT: llvm.preserve.struct.access.index
27// CHECK-NOT: llvm.preserve.union.access.index
28
29const void *unit4(const int *arg) {
30 return _(&arg[1]);
31}
32// CHECK: define dso_local i8* @unit4
33// CHECK-NOT: getelementptr
Chris Wailesbcf972c2021-10-21 11:03:28 -070034// CHECK: call i32* @llvm.preserve.array.access.index.p0i32.p0i32(i32* elementtype(i32) %{{[0-9a-z]+}}, i32 0, i32 1), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[POINTER:[0-9]+]]
Chih-Hung Hsieh08600532019-12-19 15:55:38 -080035
36const void *unit5(const int *arg[5]) {
37 return _(&arg[1][2]);
38}
39// CHECK: define dso_local i8* @unit5
40// CHECK-NOT: getelementptr
Chris Wailesbcf972c2021-10-21 11:03:28 -070041// CHECK: call i32** @llvm.preserve.array.access.index.p0p0i32.p0p0i32(i32** elementtype(i32*) %{{[0-9a-z]+}}, i32 0, i32 1), !dbg !{{[0-9]+}}, !llvm.preserve.access.index !{{[0-9]+}}
Chih-Hung Hsieh08600532019-12-19 15:55:38 -080042// CHECK-NOT: getelementptr
Chris Wailesbcf972c2021-10-21 11:03:28 -070043// CHECK: call i32* @llvm.preserve.array.access.index.p0i32.p0i32(i32* elementtype(i32) %{{[0-9a-z]+}}, i32 0, i32 2), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[POINTER:[0-9]+]]
Chih-Hung Hsieh08600532019-12-19 15:55:38 -080044
45struct s1 {
46 char a;
47 int b;
48};
49
50struct s2 {
51 char a1:1;
52 char a2:1;
53 int b;
54};
55
56struct s3 {
57 char a1:1;
58 char a2:1;
59 char :6;
60 int b;
61};
62
63const void *unit6(struct s1 *arg) {
64 return _(&arg->a);
65}
66// CHECK: define dso_local i8* @unit6
67// CHECK-NOT: getelementptr
Chris Wailesbcf972c2021-10-21 11:03:28 -070068// CHECK: call i8* @llvm.preserve.struct.access.index.p0i8.p0s_struct.s1s(%struct.s1* elementtype(%struct.s1) %{{[0-9a-z]+}}, i32 0, i32 0), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[STRUCT_S1:[0-9]+]]
Chih-Hung Hsieh08600532019-12-19 15:55:38 -080069
70const void *unit7(struct s1 *arg) {
71 return _(&arg->b);
72}
73// CHECK: define dso_local i8* @unit7
74// CHECK-NOT: getelementptr
Chris Wailesbcf972c2021-10-21 11:03:28 -070075// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* elementtype(%struct.s1) %{{[0-9a-z]+}}, i32 1, i32 1), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[STRUCT_S1]]
Chih-Hung Hsieh08600532019-12-19 15:55:38 -080076
77const void *unit8(struct s2 *arg) {
78 return _(&arg->b);
79}
80// CHECK: define dso_local i8* @unit8
81// CHECK-NOT: getelementptr
Chris Wailesbcf972c2021-10-21 11:03:28 -070082// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s2s(%struct.s2* elementtype(%struct.s2) %{{[0-9a-z]+}}, i32 1, i32 2), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[STRUCT_S2:[0-9]+]]
Chih-Hung Hsieh08600532019-12-19 15:55:38 -080083
84const void *unit9(struct s3 *arg) {
85 return _(&arg->b);
86}
87// CHECK: define dso_local i8* @unit9
88// CHECK-NOT: getelementptr
Chris Wailesbcf972c2021-10-21 11:03:28 -070089// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s3s(%struct.s3* elementtype(%struct.s3) %{{[0-9a-z]+}}, i32 1, i32 2), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[STRUCT_S3:[0-9]+]]
Chih-Hung Hsieh08600532019-12-19 15:55:38 -080090
91union u1 {
92 char a;
93 int b;
94};
95
96union u2 {
97 char a;
98 int :32;
99 int b;
100};
101
102const void *unit10(union u1 *arg) {
103 return _(&arg->a);
104}
105// CHECK: define dso_local i8* @unit10
106// CHECK-NOT: getelementptr
107// CHECK: call %union.u1* @llvm.preserve.union.access.index.p0s_union.u1s.p0s_union.u1s(%union.u1* %{{[0-9a-z]+}}, i32 0), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[UNION_U1:[0-9]+]]
108
109const void *unit11(union u1 *arg) {
110 return _(&arg->b);
111}
112// CHECK: define dso_local i8* @unit11
113// CHECK-NOT: getelementptr
114// CHECK: call %union.u1* @llvm.preserve.union.access.index.p0s_union.u1s.p0s_union.u1s(%union.u1* %{{[0-9a-z]+}}, i32 1), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[UNION_U1]]
115
116const void *unit12(union u2 *arg) {
117 return _(&arg->b);
118}
119// CHECK: define dso_local i8* @unit12
120// CHECK-NOT: getelementptr
121// CHECK: call %union.u2* @llvm.preserve.union.access.index.p0s_union.u2s.p0s_union.u2s(%union.u2* %{{[0-9a-z]+}}, i32 1), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[UNION_U2:[0-9]+]]
122
123struct s4 {
124 char d;
125 union u {
126 int b[4];
127 char a;
128 } c;
129};
130
131union u3 {
132 struct s {
133 int b[4];
134 } c;
135 char a;
136};
137
138const void *unit13(struct s4 *arg) {
139 return _(&arg->c.b[2]);
140}
141// CHECK: define dso_local i8* @unit13
Chris Wailesbcf972c2021-10-21 11:03:28 -0700142// CHECK: call %union.u* @llvm.preserve.struct.access.index.p0s_union.us.p0s_struct.s4s(%struct.s4* elementtype(%struct.s4) %{{[0-9a-z]+}}, i32 1, i32 1), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[STRUCT_S4:[0-9]+]]
Chih-Hung Hsieh08600532019-12-19 15:55:38 -0800143// CHECK: call %union.u* @llvm.preserve.union.access.index.p0s_union.us.p0s_union.us(%union.u* %{{[0-9a-z]+}}, i32 0), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[UNION_I_U:[0-9]+]]
Chris Wailesbcf972c2021-10-21 11:03:28 -0700144// CHECK: call i32* @llvm.preserve.array.access.index.p0i32.p0a4i32([4 x i32]* elementtype([4 x i32]) %{{[0-9a-z]+}}, i32 1, i32 2), !dbg !{{[0-9]+}}, !llvm.preserve.access.index !{{[0-9]+}}
Chih-Hung Hsieh08600532019-12-19 15:55:38 -0800145
146const void *unit14(union u3 *arg) {
147 return _(&arg->c.b[2]);
148}
149// CHECK: define dso_local i8* @unit14
150// CHECK: call %union.u3* @llvm.preserve.union.access.index.p0s_union.u3s.p0s_union.u3s(%union.u3* %{{[0-9a-z]+}}, i32 0), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[UNION_U3:[0-9]+]]
Chris Wailesbcf972c2021-10-21 11:03:28 -0700151// CHECK: call [4 x i32]* @llvm.preserve.struct.access.index.p0a4i32.p0s_struct.ss(%struct.s* elementtype(%struct.s) %{{[0-9a-z]+}}, i32 0, i32 0), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[STRUCT_I_S:[0-9]+]]
152// CHECK: call i32* @llvm.preserve.array.access.index.p0i32.p0a4i32([4 x i32]* elementtype([4 x i32]) %{{[0-9a-z]+}}, i32 1, i32 2), !dbg !{{[0-9]+}}, !llvm.preserve.access.index !{{[0-9]+}}
Chih-Hung Hsieh08600532019-12-19 15:55:38 -0800153
154const void *unit15(struct s4 *arg) {
155 return _(&arg[2].c.a);
156}
157// CHECK: define dso_local i8* @unit15
Chris Wailesbcf972c2021-10-21 11:03:28 -0700158// CHECK: call %struct.s4* @llvm.preserve.array.access.index.p0s_struct.s4s.p0s_struct.s4s(%struct.s4* elementtype(%struct.s4) %{{[0-9a-z]+}}, i32 0, i32 2), !dbg !{{[0-9]+}}, !llvm.preserve.access.index !{{[0-9]+}}
159// CHECK: call %union.u* @llvm.preserve.struct.access.index.p0s_union.us.p0s_struct.s4s(%struct.s4* elementtype(%struct.s4) %{{[0-9a-z]+}}, i32 1, i32 1), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[STRUCT_S4]]
Chih-Hung Hsieh08600532019-12-19 15:55:38 -0800160// CHECK: call %union.u* @llvm.preserve.union.access.index.p0s_union.us.p0s_union.us(%union.u* %{{[0-9a-z]+}}, i32 1), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[UNION_I_U]]
161
162const void *unit16(union u3 *arg) {
163 return _(&arg[2].a);
164}
165// CHECK: define dso_local i8* @unit16
Chris Wailesbcf972c2021-10-21 11:03:28 -0700166// CHECK: call %union.u3* @llvm.preserve.array.access.index.p0s_union.u3s.p0s_union.u3s(%union.u3* elementtype(%union.u3) %{{[0-9a-z]+}}, i32 0, i32 2), !dbg !{{[0-9]+}}, !llvm.preserve.access.index !{{[0-9]+}}
Chih-Hung Hsieh08600532019-12-19 15:55:38 -0800167// CHECK: call %union.u3* @llvm.preserve.union.access.index.p0s_union.u3s.p0s_union.u3s(%union.u3* %{{[0-9a-z]+}}, i32 1), !dbg !{{[0-9]+}}, !llvm.preserve.access.index ![[UNION_U3]]
168
Jeff Vander Stoep247d86b2020-08-11 14:27:44 +0200169// CHECK: ![[POINTER]] = !DIDerivedType(tag: DW_TAG_pointer_type
170// CHECK: ![[STRUCT_S4]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "s4"
171// CHECK: ![[UNION_I_U]] = distinct !DICompositeType(tag: DW_TAG_union_type, name: "u"
172// CHECK: ![[UNION_U3]] = distinct !DICompositeType(tag: DW_TAG_union_type, name: "u3"
173// CHECK: ![[STRUCT_I_S]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "s"
Chih-Hung Hsieh08600532019-12-19 15:55:38 -0800174// CHECK: ![[STRUCT_S1]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "s1"
175// CHECK: ![[STRUCT_S2]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "s2"
176// CHECK: ![[STRUCT_S3]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "s3"
177// CHECK: ![[UNION_U1]] = distinct !DICompositeType(tag: DW_TAG_union_type, name: "u1"
178// CHECK: ![[UNION_U2]] = distinct !DICompositeType(tag: DW_TAG_union_type, name: "u2"