@@ -230,4 +230,96 @@ define i1 @mixed_alloca_size4() {
230
230
ret i1 %res
231
231
}
232
232
233
+ define i1 @zst_alloca_start () {
234
+ ; CHECK-LABEL: @zst_alloca_start(
235
+ ; CHECK-NEXT: [[A:%.*]] = alloca i64, align 8
236
+ ; CHECK-NEXT: [[A2:%.*]] = alloca {}, align 8
237
+ ; CHECK-NEXT: call void @escape(ptr [[A]], ptr [[A2]])
238
+ ; CHECK-NEXT: ret i1 false
239
+ ;
240
+ %a = alloca i64
241
+ %a2 = alloca {}
242
+ %gep = getelementptr i8 , ptr %a , i64 0
243
+ %cmp = icmp eq ptr %gep , %a2
244
+ call void @escape (ptr %a , ptr %a2 )
245
+ ret i1 %cmp
246
+ }
247
+
248
+ define i1 @zst_alloca_middle () {
249
+ ; CHECK-LABEL: @zst_alloca_middle(
250
+ ; CHECK-NEXT: [[A:%.*]] = alloca i64, align 8
251
+ ; CHECK-NEXT: [[A2:%.*]] = alloca {}, align 8
252
+ ; CHECK-NEXT: call void @escape(ptr [[A]], ptr [[A2]])
253
+ ; CHECK-NEXT: ret i1 false
254
+ ;
255
+ %a = alloca i64
256
+ %a2 = alloca {}
257
+ %gep = getelementptr i8 , ptr %a , i64 4
258
+ %cmp = icmp eq ptr %gep , %a2
259
+ call void @escape (ptr %a , ptr %a2 )
260
+ ret i1 %cmp
261
+ }
262
+
263
+ define i1 @zst_alloca_end () {
264
+ ; CHECK-LABEL: @zst_alloca_end(
265
+ ; CHECK-NEXT: [[A:%.*]] = alloca i64, align 8
266
+ ; CHECK-NEXT: [[A2:%.*]] = alloca {}, align 8
267
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 8
268
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP]], [[A2]]
269
+ ; CHECK-NEXT: call void @escape(ptr [[A]], ptr [[A2]])
270
+ ; CHECK-NEXT: ret i1 [[CMP]]
271
+ ;
272
+ %a = alloca i64
273
+ %a2 = alloca {}
274
+ %gep = getelementptr i8 , ptr %a , i64 8
275
+ %cmp = icmp eq ptr %gep , %a2
276
+ call void @escape (ptr %a , ptr %a2 )
277
+ ret i1 %cmp
278
+ }
279
+
280
+ @gz = external global {}
281
+
282
+ define i1 @zst_global_start () {
283
+ ; CHECK-LABEL: @zst_global_start(
284
+ ; CHECK-NEXT: [[A:%.*]] = alloca i64, align 8
285
+ ; CHECK-NEXT: call void @escape(ptr [[A]], ptr @gz)
286
+ ; CHECK-NEXT: ret i1 false
287
+ ;
288
+ %a = alloca i64
289
+ %gep = getelementptr i8 , ptr %a , i64 0
290
+ %cmp = icmp eq ptr %gep , @gz
291
+ call void @escape (ptr %a , ptr @gz )
292
+ ret i1 %cmp
293
+ }
294
+
295
+ define i1 @zst_global_middle () {
296
+ ; CHECK-LABEL: @zst_global_middle(
297
+ ; CHECK-NEXT: [[A:%.*]] = alloca i64, align 8
298
+ ; CHECK-NEXT: call void @escape(ptr [[A]], ptr @gz)
299
+ ; CHECK-NEXT: ret i1 false
300
+ ;
301
+ %a = alloca i64
302
+ %gep = getelementptr i8 , ptr %a , i64 4
303
+ %cmp = icmp eq ptr %gep , @gz
304
+ call void @escape (ptr %a , ptr @gz )
305
+ ret i1 %cmp
306
+ }
307
+
308
+ define i1 @zst_global_end () {
309
+ ; CHECK-LABEL: @zst_global_end(
310
+ ; CHECK-NEXT: [[A:%.*]] = alloca i64, align 8
311
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 8
312
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP]], @gz
313
+ ; CHECK-NEXT: call void @escape(ptr [[A]], ptr @gz)
314
+ ; CHECK-NEXT: ret i1 [[CMP]]
315
+ ;
316
+ %a = alloca i64
317
+ %gep = getelementptr i8 , ptr %a , i64 8
318
+ %cmp = icmp eq ptr %gep , @gz
319
+ call void @escape (ptr %a , ptr @gz )
320
+ ret i1 %cmp
321
+ }
322
+
323
+ declare void @escape (ptr , ptr )
324
+
233
325
attributes #0 = { null_pointer_is_valid }
0 commit comments