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