xref: /llvm-project/llvm/test/Transforms/LowerConstantIntrinsics/builtin-object-size-phi.ll (revision e4db3f0d97681a10a76e71465f1379801cd45f54)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=lower-constant-intrinsics  -S < %s | FileCheck %s
3
4
5target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
6target triple = "x86_64-unknown-linux-gnu"
7
8declare dso_local noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr allocsize(0)
9declare i64 @llvm.objectsize.i64.p0(ptr, i1 immarg, i1 immarg, i1 immarg)
10
11@buffer = dso_local global [4 x i8] zeroinitializer, align 1
12
13define dso_local i64 @pick_max(i32 noundef %n) local_unnamed_addr {
14; CHECK-LABEL: @pick_max(
15; CHECK-NEXT:  entry:
16; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[N:%.*]], 0
17; CHECK-NEXT:    br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_END:%.*]]
18; CHECK:       if.else:
19; CHECK-NEXT:    [[MALLOCED:%.*]] = call noalias dereferenceable_or_null(8) ptr @malloc(i64 noundef 8)
20; CHECK-NEXT:    br label [[IF_END]]
21; CHECK:       if.end:
22; CHECK-NEXT:    [[P:%.*]] = phi ptr [ [[MALLOCED]], [[IF_ELSE]] ], [ @buffer, [[ENTRY:%.*]] ]
23; CHECK-NEXT:    ret i64 8
24;
25entry:
26  %cond = icmp eq i32 %n, 0
27  br i1 %cond, label %if.else, label %if.end
28
29if.else:
30  %malloced = call noalias dereferenceable_or_null(8) ptr @malloc(i64 noundef 8)
31  br label %if.end
32
33if.end:
34  %p = phi ptr [ %malloced, %if.else ], [ @buffer, %entry ]
35  %size = call i64 @llvm.objectsize.i64.p0(ptr %p, i1 false, i1 true, i1 false)
36  ret i64 %size
37}
38
39define dso_local i64 @pick_min(i32 noundef %n) local_unnamed_addr {
40; CHECK-LABEL: @pick_min(
41; CHECK-NEXT:  entry:
42; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[N:%.*]], 0
43; CHECK-NEXT:    br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_END:%.*]]
44; CHECK:       if.else:
45; CHECK-NEXT:    [[MALLOCED:%.*]] = call noalias dereferenceable_or_null(8) ptr @malloc(i64 noundef 8)
46; CHECK-NEXT:    br label [[IF_END]]
47; CHECK:       if.end:
48; CHECK-NEXT:    [[P:%.*]] = phi ptr [ [[MALLOCED]], [[IF_ELSE]] ], [ @buffer, [[ENTRY:%.*]] ]
49; CHECK-NEXT:    ret i64 4
50;
51entry:
52  %cond = icmp eq i32 %n, 0
53  br i1 %cond, label %if.else, label %if.end
54
55if.else:
56  %malloced = call noalias dereferenceable_or_null(8) ptr @malloc(i64 noundef 8)
57  br label %if.end
58
59if.end:
60  %p = phi ptr [ %malloced, %if.else ], [ @buffer, %entry ]
61  %size = call i64 @llvm.objectsize.i64.p0(ptr %p, i1 true, i1 true, i1 false)
62  ret i64 %size
63}
64
65define i64 @pick_max_same(i32 %n) {
66; CHECK-LABEL: @pick_max_same(
67; CHECK-NEXT:  entry:
68; CHECK-NEXT:    [[BUFFER:%.*]] = alloca i8, i64 20, align 1
69; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[N:%.*]], 0
70; CHECK-NEXT:    br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_END:%.*]]
71; CHECK:       if.else:
72; CHECK-NEXT:    [[OFFSETED:%.*]] = getelementptr i8, ptr [[BUFFER]], i64 10
73; CHECK-NEXT:    br label [[IF_END]]
74; CHECK:       if.end:
75; CHECK-NEXT:    [[P:%.*]] = phi ptr [ [[OFFSETED]], [[IF_ELSE]] ], [ [[BUFFER]], [[ENTRY:%.*]] ]
76; CHECK-NEXT:    ret i64 20
77;
78entry:
79  %buffer = alloca i8, i64 20
80  %cond = icmp eq i32 %n, 0
81  br i1 %cond, label %if.else, label %if.end
82
83if.else:
84  %offseted = getelementptr i8, ptr %buffer, i64 10
85  br label %if.end
86
87if.end:
88  %p = phi ptr [ %offseted, %if.else ], [ %buffer, %entry ]
89  %size = call i64 @llvm.objectsize.i64.p0(ptr %p, i1 false, i1 true, i1 false)
90  ret i64 %size
91}
92
93define i64 @pick_min_same(i32 %n) {
94; CHECK-LABEL: @pick_min_same(
95; CHECK-NEXT:  entry:
96; CHECK-NEXT:    [[BUFFER:%.*]] = alloca i8, i64 20, align 1
97; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[N:%.*]], 0
98; CHECK-NEXT:    br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_END:%.*]]
99; CHECK:       if.else:
100; CHECK-NEXT:    [[OFFSETED:%.*]] = getelementptr i8, ptr [[BUFFER]], i64 10
101; CHECK-NEXT:    br label [[IF_END]]
102; CHECK:       if.end:
103; CHECK-NEXT:    [[P:%.*]] = phi ptr [ [[OFFSETED]], [[IF_ELSE]] ], [ [[BUFFER]], [[ENTRY:%.*]] ]
104; CHECK-NEXT:    ret i64 10
105;
106entry:
107  %buffer = alloca i8, i64 20
108  %cond = icmp eq i32 %n, 0
109  br i1 %cond, label %if.else, label %if.end
110
111if.else:
112  %offseted = getelementptr i8, ptr %buffer, i64 10
113  br label %if.end
114
115if.end:
116  %p = phi ptr [ %offseted, %if.else ], [ %buffer, %entry ]
117  %size = call i64 @llvm.objectsize.i64.p0(ptr %p, i1 true, i1 true, i1 false)
118  ret i64 %size
119}
120
121define dso_local i64 @pick_max_large(i1 %c) local_unnamed_addr {
122; CHECK-LABEL: @pick_max_large(
123; CHECK-NEXT:    [[BUFFER:%.*]] = alloca i8, i64 -7, align 1
124; CHECK-NEXT:    [[S:%.*]] = select i1 [[C:%.*]], ptr null, ptr [[BUFFER]]
125; CHECK-NEXT:    ret i64 -1
126;
127  %buffer = alloca i8, i64 -7 ; Actually a very large positive integer
128  %s = select i1 %c, ptr null, ptr %buffer
129  %objsize = tail call i64 @llvm.objectsize.i64.p0(ptr %s, i1 false, i1 false, i1 false)
130  ret i64 %objsize
131
132}
133
134define dso_local i64 @pick_max_one_oob(i1 %c0, i1 %c1) {
135; CHECK-LABEL: @pick_max_one_oob(
136; CHECK-NEXT:    [[P:%.*]] = alloca [2 x i8], align 1
137; CHECK-NEXT:    br i1 [[C0:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
138; CHECK:       if.then:
139; CHECK-NEXT:    [[P_THEN:%.*]] = getelementptr inbounds [2 x i8], ptr [[P]], i64 0, i64 1
140; CHECK-NEXT:    br label [[IF_END:%.*]]
141; CHECK:       if.else:
142; CHECK-NEXT:    [[P_ELSE:%.*]] = getelementptr inbounds [2 x i8], ptr [[P]], i64 0, i64 -1
143; CHECK-NEXT:    br label [[IF_END]]
144; CHECK:       if.end:
145; CHECK-NEXT:    [[P_END:%.*]] = phi ptr [ [[P_ELSE]], [[IF_ELSE]] ], [ [[P_THEN]], [[IF_THEN]] ]
146; CHECK-NEXT:    [[OBJSIZE:%.*]] = select i1 [[C1:%.*]], i64 -1, i64 0
147; CHECK-NEXT:    ret i64 [[OBJSIZE]]
148;
149  %p = alloca [2 x i8], align 1
150  br i1 %c0, label %if.then, label %if.else
151
152if.then:
153  %p.then = getelementptr inbounds [2 x i8], ptr %p, i64 0, i64 1
154  br label %if.end
155
156if.else:
157  %p.else = getelementptr inbounds [2 x i8], ptr %p, i64 0, i64 -1
158  br label %if.end
159
160if.end:
161  %p.end = phi ptr [%p.else, %if.else], [%p.then, %if.then]
162  %objsize.max = call i64 @llvm.objectsize.i64.p0(ptr %p.end, i1 false, i1 true, i1 false)
163  %objsize.min = call i64 @llvm.objectsize.i64.p0(ptr %p.end, i1 true, i1 true, i1 false)
164  %objsize = select i1 %c1, i64 %objsize.max, i64 %objsize.min
165  ret i64 %objsize
166}
167
168
169define i64 @pick_negative_offset(i32 %n) {
170; CHECK-LABEL: @pick_negative_offset(
171; CHECK-NEXT:  entry:
172; CHECK-NEXT:    [[BUFFER0:%.*]] = alloca i8, i64 20, align 1
173; CHECK-NEXT:    [[OFFSETED0:%.*]] = getelementptr i8, ptr [[BUFFER0]], i64 20
174; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[N:%.*]], 0
175; CHECK-NEXT:    br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_END:%.*]]
176; CHECK:       if.else:
177; CHECK-NEXT:    [[BUFFER1:%.*]] = alloca i8, i64 20, align 1
178; CHECK-NEXT:    [[OFFSETED1:%.*]] = getelementptr i8, ptr [[BUFFER1]], i64 20
179; CHECK-NEXT:    br label [[IF_END]]
180; CHECK:       if.end:
181; CHECK-NEXT:    [[P:%.*]] = phi ptr [ [[OFFSETED1]], [[IF_ELSE]] ], [ [[OFFSETED0]], [[ENTRY:%.*]] ]
182; CHECK-NEXT:    [[POFFSETED:%.*]] = getelementptr i8, ptr [[P]], i64 -4
183; CHECK-NEXT:    ret i64 4
184;
185entry:
186  %buffer0 = alloca i8, i64 20
187  %offseted0 = getelementptr i8, ptr %buffer0, i64 20
188  %cond = icmp eq i32 %n, 0
189  br i1 %cond, label %if.else, label %if.end
190
191if.else:
192  %buffer1 = alloca i8, i64 20
193  %offseted1 = getelementptr i8, ptr %buffer1, i64 20
194  br label %if.end
195
196if.end:
197  %p = phi ptr [ %offseted1, %if.else ], [ %offseted0, %entry ]
198  %poffseted = getelementptr i8, ptr %p, i64 -4
199  %size = call i64 @llvm.objectsize.i64.p0(ptr %poffseted, i1 false, i1 false, i1 false)
200  ret i64 %size
201}
202
203define i64 @pick_negative_offset_different_width(i32 %n) {
204; CHECK-LABEL: @pick_negative_offset_different_width(
205; CHECK-NEXT:  entry:
206; CHECK-NEXT:    [[BUFFER0:%.*]] = alloca i8, i64 4, align 1
207; CHECK-NEXT:    [[BUFFER1:%.*]] = alloca i8, i64 8, align 1
208; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[N:%.*]], 0
209; CHECK-NEXT:    br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_END:%.*]]
210; CHECK:       if.then:
211; CHECK-NEXT:    [[OFFSETED0:%.*]] = getelementptr i8, ptr [[BUFFER0]], i64 1
212; CHECK-NEXT:    br label [[IF_END1:%.*]]
213; CHECK:       if.else:
214; CHECK-NEXT:    [[OFFSETED1:%.*]] = getelementptr i8, ptr [[BUFFER1]], i64 6
215; CHECK-NEXT:    br label [[IF_END1]]
216; CHECK:       if.end:
217; CHECK-NEXT:    [[P:%.*]] = phi ptr [ [[OFFSETED0]], [[IF_ELSE]] ], [ [[OFFSETED1]], [[IF_END]] ]
218; CHECK-NEXT:    [[POFFSETED:%.*]] = getelementptr i8, ptr [[P]], i64 -2
219; CHECK-NEXT:    ret i64 5
220;
221entry:
222  %buffer0 = alloca i8, i64 4
223  %buffer1 = alloca i8, i64 8
224  %cond = icmp eq i32 %n, 0
225  br i1 %cond, label %if.then, label %if.else
226
227if.then:
228  %offseted0 = getelementptr i8, ptr %buffer0, i64 1
229  br label %if.end
230
231if.else:
232  %offseted1 = getelementptr i8, ptr %buffer1, i64 6
233  br label %if.end
234
235if.end:
236  %p = phi ptr [ %offseted0, %if.then ], [ %offseted1, %if.else ]
237  %poffseted = getelementptr i8, ptr %p, i64 -2
238  %size = call i64 @llvm.objectsize.i64.p0(ptr %poffseted, i1 false, i1 false, i1 false)
239  ret i64 %size
240}
241
242define i64 @pick_negative_offset_with_nullptr(i32 %n) {
243; CHECK-LABEL: @pick_negative_offset_with_nullptr(
244; CHECK-NEXT:  entry:
245; CHECK-NEXT:    [[BUFFER0:%.*]] = alloca i8, i64 20, align 1
246; CHECK-NEXT:    [[OFFSETED0:%.*]] = getelementptr i8, ptr [[BUFFER0]], i64 20
247; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[N:%.*]], 0
248; CHECK-NEXT:    br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_END:%.*]]
249; CHECK:       if.else:
250; CHECK-NEXT:    br label [[IF_END]]
251; CHECK:       if.end:
252; CHECK-NEXT:    [[P0:%.*]] = phi ptr [ [[OFFSETED0]], [[ENTRY:%.*]] ], [ null, [[IF_ELSE]] ]
253; CHECK-NEXT:    [[P1:%.*]] = phi ptr [ null, [[IF_ELSE]] ], [ [[OFFSETED0]], [[ENTRY]] ]
254; CHECK-NEXT:    [[P0OFFSETED:%.*]] = getelementptr i8, ptr [[P0]], i64 -4
255; CHECK-NEXT:    [[P1OFFSETED:%.*]] = getelementptr i8, ptr [[P1]], i64 -4
256; CHECK-NEXT:    ret i64 4
257;
258entry:
259  %buffer0 = alloca i8, i64 20
260  %offseted0 = getelementptr i8, ptr %buffer0, i64 20
261  %cond = icmp eq i32 %n, 0
262  br i1 %cond, label %if.else, label %if.end
263
264if.else:
265  br label %if.end
266
267if.end:
268  %p0 = phi ptr [ %offseted0, %entry ], [ null, %if.else ]
269  %p1 = phi ptr [ null, %if.else ], [ %offseted0, %entry ]
270  %p0offseted = getelementptr i8, ptr %p0, i64 -4
271  %p1offseted = getelementptr i8, ptr %p1, i64 -4
272  %size0 = call i64 @llvm.objectsize.i64.p0(ptr %p0offseted, i1 false, i1 false, i1 false)
273  %size1 = call i64 @llvm.objectsize.i64.p0(ptr %p1offseted, i1 false, i1 false, i1 false)
274  %size = select i1 %cond, i64 %size0, i64 %size1
275  ret i64 %size
276}
277
278define i64 @pick_negative_offset_with_unsized_nullptr(i32 %n) {
279; CHECK-LABEL: @pick_negative_offset_with_unsized_nullptr(
280; CHECK-NEXT:  entry:
281; CHECK-NEXT:    [[BUFFER0:%.*]] = alloca i8, i64 20, align 1
282; CHECK-NEXT:    [[OFFSETED0:%.*]] = getelementptr i8, ptr [[BUFFER0]], i64 20
283; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[N:%.*]], 0
284; CHECK-NEXT:    br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_END:%.*]]
285; CHECK:       if.else:
286; CHECK-NEXT:    br label [[IF_END]]
287; CHECK:       if.end:
288; CHECK-NEXT:    [[P0:%.*]] = phi ptr [ [[OFFSETED0]], [[ENTRY:%.*]] ], [ null, [[IF_ELSE]] ]
289; CHECK-NEXT:    [[P1:%.*]] = phi ptr [ null, [[IF_ELSE]] ], [ [[OFFSETED0]], [[ENTRY]] ]
290; CHECK-NEXT:    [[P0OFFSETED:%.*]] = getelementptr i8, ptr [[P0]], i64 -4
291; CHECK-NEXT:    [[P1OFFSETED:%.*]] = getelementptr i8, ptr [[P1]], i64 -4
292; CHECK-NEXT:    ret i64 -1
293;
294entry:
295  %buffer0 = alloca i8, i64 20
296  %offseted0 = getelementptr i8, ptr %buffer0, i64 20
297  %cond = icmp eq i32 %n, 0
298  br i1 %cond, label %if.else, label %if.end
299
300if.else:
301  br label %if.end
302
303if.end:
304  %p0 = phi ptr [ %offseted0, %entry ], [ null, %if.else ]
305  %p1 = phi ptr [ null, %if.else ], [ %offseted0, %entry ]
306  %p0offseted = getelementptr i8, ptr %p0, i64 -4
307  %p1offseted = getelementptr i8, ptr %p1, i64 -4
308  %size0 = call i64 @llvm.objectsize.i64.p0(ptr %p0offseted, i1 false, i1 true, i1 false)
309  %size1 = call i64 @llvm.objectsize.i64.p0(ptr %p1offseted, i1 false, i1 true, i1 false)
310  %size = select i1 %cond, i64 %size0, i64 %size1
311  ret i64 %size
312}
313
314define i64 @chain_pick_negative_offset_with_nullptr(i32 %x) {
315; CHECK-LABEL: @chain_pick_negative_offset_with_nullptr(
316; CHECK-NEXT:  entry:
317; CHECK-NEXT:    [[ARRAY:%.*]] = alloca [4 x i32], align 4
318; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[X:%.*]], 0
319; CHECK-NEXT:    [[P:%.*]] = getelementptr i8, ptr [[ARRAY]], i64 8
320; CHECK-NEXT:    [[COND:%.*]] = select i1 [[C]], ptr [[P]], ptr null
321; CHECK-NEXT:    [[P4:%.*]] = getelementptr i8, ptr [[COND]], i64 8
322; CHECK-NEXT:    [[COND6:%.*]] = select i1 [[C]], ptr [[P4]], ptr null
323; CHECK-NEXT:    [[P7:%.*]] = getelementptr i8, ptr [[COND6]], i64 -4
324; CHECK-NEXT:    ret i64 4
325;
326entry:
327  %array = alloca [4 x i32]
328  %c = icmp eq i32 %x, 0
329  %p = getelementptr i8, ptr %array, i64 8
330  %cond = select i1 %c, ptr %p, ptr null
331  %p4 = getelementptr i8, ptr %cond, i64 8
332  %cond6 = select i1 %c, ptr %p4, ptr null
333  %p7 = getelementptr i8, ptr %cond6, i64 -4
334  %size = call i64 @llvm.objectsize.i64.p0(ptr %p7, i1 false, i1 false, i1 false)
335  ret i64 %size
336}
337
338
339define i64 @negative_offset_dynamic_eval(i32 %x, i64 %i) {
340; CHECK-LABEL: @negative_offset_dynamic_eval(
341; CHECK-NEXT:  entry:
342; CHECK-NEXT:    [[ARRAY1:%.*]] = alloca [4 x i32], align 16
343; CHECK-NEXT:    [[ARRAY2:%.*]] = alloca [8 x i32], align 16
344; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X:%.*]], 0
345; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
346; CHECK:       if.then:
347; CHECK-NEXT:    br label [[IF_END:%.*]]
348; CHECK:       if.else:
349; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[ARRAY2]], i64 16
350; CHECK-NEXT:    br label [[IF_END]]
351; CHECK:       if.end:
352; CHECK-NEXT:    [[TMP0:%.*]] = phi i64 [ 16, [[IF_THEN]] ], [ 32, [[IF_ELSE]] ]
353; CHECK-NEXT:    [[TMP5:%.*]] = phi i64 [ 0, [[IF_THEN]] ], [ 16, [[IF_ELSE]] ]
354; CHECK-NEXT:    [[PTR:%.*]] = phi ptr [ [[ARRAY1]], [[IF_THEN]] ], [ [[ADD_PTR]], [[IF_ELSE]] ]
355; CHECK-NEXT:    [[ADD_PTR2_IDX:%.*]] = mul i64 [[I:%.*]], 4
356; CHECK-NEXT:    [[TMP6:%.*]] = add i64 [[TMP5]], [[ADD_PTR2_IDX]]
357; CHECK-NEXT:    [[ADD_PTR2:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i64 [[I]]
358; CHECK-NEXT:    [[TMP1:%.*]] = sub i64 [[TMP0]], [[TMP6]]
359; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i64 [[TMP0]], [[TMP6]]
360; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP2]], i64 0, i64 [[TMP1]]
361; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i64 [[TMP3]], -1
362; CHECK-NEXT:    call void @llvm.assume(i1 [[TMP4]])
363; CHECK-NEXT:    ret i64 [[TMP3]]
364;
365entry:
366  %array1 = alloca [4 x i32], align 16
367  %array2 = alloca [8 x i32], align 16
368  %tobool.not = icmp eq i32 %x, 0
369  br i1 %tobool.not, label %if.else, label %if.then
370
371if.then:
372  br label %if.end
373
374if.else:
375  %add.ptr = getelementptr inbounds i8, ptr %array2, i64 16
376  br label %if.end
377
378if.end:
379  %ptr = phi ptr [ %array1, %if.then ], [ %add.ptr, %if.else ]
380  %add.ptr2 = getelementptr inbounds i32, ptr %ptr, i64 %i
381  %objsize = call i64 @llvm.objectsize.i64.p0(ptr %add.ptr2, i1 false, i1 true, i1 true)
382  ret i64 %objsize
383}
384
385
386define i64 @outofbound_offset_eval(i32 %x) {
387; CHECK-LABEL: @outofbound_offset_eval(
388; CHECK-NEXT:  entry:
389; CHECK-NEXT:    [[ARRAY:%.*]] = alloca [4 x i8], align 16
390; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X:%.*]], 0
391; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
392; CHECK:       if.then:
393; CHECK-NEXT:    [[ADD_PTR0:%.*]] = getelementptr i8, ptr [[ARRAY]], i64 10
394; CHECK-NEXT:    br label [[IF_END:%.*]]
395; CHECK:       if.else:
396; CHECK-NEXT:    [[ADD_PTR1:%.*]] = getelementptr i8, ptr [[ARRAY]], i64 12
397; CHECK-NEXT:    br label [[IF_END]]
398; CHECK:       if.end:
399; CHECK-NEXT:    [[PTR:%.*]] = phi ptr [ [[ADD_PTR0]], [[IF_THEN]] ], [ [[ADD_PTR1]], [[IF_ELSE]] ]
400; CHECK-NEXT:    [[ADD_PTR2:%.*]] = getelementptr i8, ptr [[PTR]], i64 -10
401; CHECK-NEXT:    ret i64 4
402;
403entry:
404  %array = alloca [4 x i8], align 16
405  %tobool.not = icmp eq i32 %x, 0
406  br i1 %tobool.not, label %if.else, label %if.then
407
408if.then:
409  %add.ptr0 = getelementptr i8, ptr %array, i64 10
410  br label %if.end
411
412if.else:
413  %add.ptr1 = getelementptr i8, ptr %array, i64 12
414  br label %if.end
415
416if.end:
417  %ptr = phi ptr [ %add.ptr0, %if.then ], [ %add.ptr1, %if.else ]
418  %add.ptr2 = getelementptr i8, ptr %ptr, i64 -10
419  %objsize = call i64 @llvm.objectsize.i64.p0(ptr %add.ptr2, i1 false, i1 false, i1 false)
420  ret i64 %objsize
421}
422