@@ -116,17 +116,96 @@ void p2struct(struct S1 **ptr) {
116
116
// COMMON-LABEL: define void @p2struct(
117
117
// COMMON-SAME: ptr noundef [[PTR:%.+]])
118
118
// COMMON: [[PTR_ADDR:%.+]] = alloca ptr, align 8
119
- // ENABLED-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[P2S1_0:!.+]]
120
- // ENABLED-NEXT: [[BASE:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[P2S1_0]]
121
- // ENABLED-NEXT: store ptr null, ptr [[BASE]], align 8, !tbaa [[P1S1_:!.+]]
122
- // DEFAULT-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
123
- // DEFAULT-NEXT: [[BASE:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
124
- // DEFAULT-NEXT: store ptr null, ptr [[BASE]], align 8, !tbaa [[ANYPTR]]
119
+ // ENABLED-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[P2S1_TAG:!.+]]
120
+ // DEFAULT-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
121
+ // ENABLED-NEXT: [[BASE:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[P2S1_TAG]]
122
+ // DEFAULT-NEXT: [[BASE:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
123
+ // ENABLED-NEXT: store ptr null, ptr [[BASE]], align 8, !tbaa [[P1S1_TAG:!.+]]
124
+ // DEFAULT-NEXT: store ptr null, ptr [[BASE]], align 8, !tbaa [[ANYPTR]]
125
+ // COMMON-NEXT: ret void
126
+ //
127
+ * ptr = 0 ;
128
+ }
129
+
130
+ void p2struct_const (struct S1 const * * ptr ) {
131
+ // COMMON-LABEL: define void @p2struct_const(
132
+ // COMMON-SAME: ptr noundef [[PTR:%.+]])
133
+ // COMMON: [[PTR_ADDR:%.+]] = alloca ptr, align 8
134
+ // COMMON-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR:!.+]]
135
+ // COMMON-NEXT: [[BASE:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
136
+ // ENABLED-NEXT: store ptr null, ptr [[BASE]], align 8, !tbaa [[P1S1_TAG]]
137
+ // DEFAULT-NEXT: store ptr null, ptr [[BASE]], align 8, !tbaa [[ANYPTR]]
125
138
// COMMON-NEXT: ret void
126
139
//
127
140
* ptr = 0 ;
128
141
}
129
142
143
+ struct S2 {
144
+ struct S1 * s ;
145
+ };
146
+
147
+ void p2struct2 (struct S2 * ptr ) {
148
+ // COMMON-LABEL: define void @p2struct2(
149
+ // COMMON-SAME: ptr noundef [[PTR:%.+]])
150
+ // COMMON: [[PTR_ADDR:%.+]] = alloca ptr, align 8
151
+ // ENABLED-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[P1S2_TAG:!.+]]
152
+ // ENABLED-NEXT: [[BASE:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[P1S2_TAG]]
153
+ // ENABLED-NEXT: [[S:%.+]] = getelementptr inbounds %struct.S2, ptr [[BASE]], i32 0, i32 0
154
+ // ENABLED-NEXT: store ptr null, ptr [[S]], align 8, !tbaa [[S2_S_TAG:!.+]]
155
+ // DEFAULT-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
156
+ // DEFAULT-NEXT: [[BASE:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
157
+ // DEFAULT-NEXT: [[S:%.+]] = getelementptr inbounds %struct.S2, ptr [[BASE]], i32 0, i32 0
158
+ // DEFAULT-NEXT: store ptr null, ptr [[S]], align 8, !tbaa [[S2_S_TAG:!.+]]
159
+ // COMMON-NEXT: ret void
160
+ ptr -> s = 0 ;
161
+ }
162
+
163
+
164
+ void vla1 (int n , int ptr [][n ], int idx ) {
165
+ // COMMON-LABEL: define void @vla1(
166
+ // COMMON-SAME: i32 noundef [[N:%.+]], ptr noundef [[PTR:%.+]], i32 noundef [[IDX:%.+]])
167
+ // COMMON: [[N_ADDR:%.+]] = alloca i32, align 4
168
+ // COMMON-NEXT: [[PTR_ADDR:%.+]] = alloca ptr, align 8
169
+ // COMMON-NEXT: [[IDX_ADDR:%.+]] = alloca i32, align 4
170
+ // COMMON-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 4, !tbaa [[INT_TY:!.+]]
171
+ // ENABLED-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[P1INT0:!.+]]
172
+ // DEFAULT-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
173
+ // COMMON-NEXT: store i32 [[IDX]], ptr [[IDX_ADDR]], align 4, !tbaa [[INT_TY]]
174
+ // COMMON-NEXT: [[L:%.+]] = load i32, ptr [[N_ADDR]], align 4, !tbaa [[INT_TY]]
175
+ // COMMON-NEXT: [[L_EXT:%.+]] = zext i32 [[L]] to i64
176
+ // ENABLED-NEXT: [[L_PTR:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[P1INT0]]
177
+ // DEFAULT-NEXT: [[L_PTR:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
178
+ // COMMON-NEXT: [[L_IDX:%.+]] = load i32, ptr [[IDX_ADDR]], align 4, !tbaa [[INT_TY]]
179
+ // COMMON-NEXT: [[IDX_EXT:%.+]] = sext i32 [[L_IDX]] to i64
180
+ // COMMON-NEXT: [[MUL:%.+]] = mul nsw i64 [[IDX_EXT]], [[L_EXT]]
181
+ // COMMON-NEXT: [[GEP1:%.+]] = getelementptr inbounds i32, ptr [[L_PTR]], i64 [[MUL]]
182
+ // COMMON-NEXT: [[GEP2:%.+]] = getelementptr inbounds i32, ptr [[GEP1]], i64 0
183
+ // COMMON-NEXT: store i32 0, ptr [[GEP2]], align 4, !tbaa [[INT_TAG:!.+]]
184
+ // ENABLED-NEXT: ret void
185
+
186
+ ptr [idx ][0 ] = 0 ;
187
+ }
188
+
189
+ typedef struct {
190
+ int i1 ;
191
+ } TypedefS ;
192
+
193
+ void unamed_struct_typedef (TypedefS * ptr ) {
194
+ // COMMON-LABEL: define void @unamed_struct_typedef(
195
+ // COMMON-SAME: ptr noundef %ptr)
196
+ // COMMON-NEXT: entry:
197
+ // COMMON-NEXT: [[PTR_ADDR:%.+]] = alloca ptr, align 8
198
+ // DEFAULT-NEXT: store ptr %ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
199
+ // DEFAULT-NEXT: [[L0:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
200
+ // ENABLED-NEXT: store ptr %ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[P1TYPEDEF:!.+]]
201
+ // ENABLED-NEXT: [[L0:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[P1TYPEDEF]]
202
+ // COMMON-NEXT: [[GEP:%.+]] = getelementptr inbounds %struct.TypedefS, ptr [[L0]], i32 0, i32 0
203
+ // COMMON-NEXT: store i32 0, ptr [[GEP]], align 4
204
+ // COMMON-NEXT: ret void
205
+
206
+ ptr -> i1 = 0 ;
207
+ }
208
+
130
209
// ENABLED: [[P2INT_0]] = !{[[P2INT:!.+]], [[P2INT]], i64 0}
131
210
// ENABLED: [[P2INT]] = !{!"p2 int", [[ANY_POINTER:!.+]], i64 0}
132
211
// DEFAULT: [[ANYPTR]] = !{[[ANY_POINTER:!.+]], [[ANY_POINTER]], i64 0}
@@ -145,3 +224,17 @@ void p2struct(struct S1 **ptr) {
145
224
// ENABLED: [[P2CHAR]] = !{!"p2 omnipotent char", [[ANY_POINTER]], i64 0}
146
225
// ENABLED: [[P1CHAR_0]] = !{[[P1CHAR:!.+]], [[P1CHAR]], i64 0}
147
226
// ENABLED: [[P1CHAR]] = !{!"p1 omnipotent char", [[ANY_POINTER]], i64 0}
227
+ // ENABLED: [[P2S1_TAG]] = !{[[P2S1:!.+]], [[P2S1]], i64 0}
228
+ // ENABLED: [[P2S1]] = !{!"p2 _ZTS2S1", [[ANY_POINTER]], i64 0}
229
+ // ENABLED: [[P1S1_TAG:!.+]] = !{[[P1S1:!.+]], [[P1S1]], i64 0}
230
+ // ENABLED: [[P1S1]] = !{!"p1 _ZTS2S1", [[ANY_POINTER]], i64 0}
231
+ // ENABLED: [[P1S2_TAG]] = !{[[P1S2:!.+]], [[P1S2]], i64 0}
232
+ // ENABLED: [[P1S2]] = !{!"p1 _ZTS2S2", [[ANY_POINTER]], i64 0}
233
+
234
+ // ENABLED: [[S2_S_TAG]] = !{[[S2_TY:!.+]], [[P1S1]], i64 0}
235
+ // ENABLED: [[S2_TY]] = !{!"S2", [[P1S1]], i64 0}
236
+ // DEFAULT: [[S2_S_TAG]] = !{[[S2_TY:!.+]], [[ANY_POINTER]], i64 0}
237
+ // DEFAULT: [[S2_TY]] = !{!"S2", [[ANY_POINTER]], i64 0}
238
+ // COMMON: [[INT_TAG]] = !{[[INT_TY:!.+]], [[INT_TY]], i64 0}
239
+ // COMMON: [[INT_TY]] = !{!"int", [[CHAR]], i64 0}
240
+ // ENABLED: [[P1TYPEDEF]] = !{[[ANY_POINTER]], [[ANY_POINTER]], i64 0}
0 commit comments