@@ -230,4 +230,96 @@ define i1 @mixed_alloca_size4() {
230230 ret i1 %res
231231}
232232
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+
233325attributes #0 = { null_pointer_is_valid }
0 commit comments