1; RUN: llc -mcpu=corei7 -no-stack-coloring=false -stackcoloring-lifetime-start-on-first-use=true < %s | FileCheck %s --check-prefix=FIRSTUSE --check-prefix=CHECK 2; RUN: llc -mcpu=corei7 -no-stack-coloring=false < %s | FileCheck %s --check-prefix=YESCOLOR --check-prefix=CHECK 3; RUN: llc -mcpu=corei7 -no-stack-coloring=true < %s | FileCheck %s --check-prefix=NOCOLOR --check-prefix=CHECK 4 5target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 6target triple = "x86_64-apple-macosx10.8.0" 7 8;CHECK-LABEL: myCall_w2: 9;YESCOLOR: subq $144, %rsp 10;NOCOLOR: subq $272, %rsp 11 12define i32 @myCall_w2(i32 %in) { 13entry: 14 %a = alloca [17 x i8*], align 8 15 %a2 = alloca [16 x i8*], align 8 16 %b = bitcast [17 x i8*]* %a to i8* 17 %b2 = bitcast [16 x i8*]* %a2 to i8* 18 call void @llvm.lifetime.start(i64 -1, i8* %b) 19 %t1 = call i32 @foo(i32 %in, i8* %b) 20 %t2 = call i32 @foo(i32 %in, i8* %b) 21 call void @llvm.lifetime.end(i64 -1, i8* %b) 22 call void @llvm.lifetime.start(i64 -1, i8* %b2) 23 %t3 = call i32 @foo(i32 %in, i8* %b2) 24 %t4 = call i32 @foo(i32 %in, i8* %b2) 25 call void @llvm.lifetime.end(i64 -1, i8* %b2) 26 %t5 = add i32 %t1, %t2 27 %t6 = add i32 %t3, %t4 28 %t7 = add i32 %t5, %t6 29 ret i32 %t7 30} 31 32 33;CHECK-LABEL: myCall2_no_merge 34;YESCOLOR: subq $272, %rsp 35;NOCOLOR: subq $272, %rsp 36 37define i32 @myCall2_no_merge(i32 %in, i1 %d) { 38entry: 39 %a = alloca [17 x i8*], align 8 40 %a2 = alloca [16 x i8*], align 8 41 %b = bitcast [17 x i8*]* %a to i8* 42 %b2 = bitcast [16 x i8*]* %a2 to i8* 43 call void @llvm.lifetime.start(i64 -1, i8* %b) 44 %t1 = call i32 @foo(i32 %in, i8* %b) 45 %t2 = call i32 @foo(i32 %in, i8* %b) 46 br i1 %d, label %bb2, label %bb3 47bb2: 48 call void @llvm.lifetime.start(i64 -1, i8* %b2) 49 %t3 = call i32 @foo(i32 %in, i8* %b2) 50 %t4 = call i32 @foo(i32 %in, i8* %b2) 51 call void @llvm.lifetime.end(i64 -1, i8* %b2) 52 %t5 = add i32 %t1, %t2 53 %t6 = add i32 %t3, %t4 54 %t7 = add i32 %t5, %t6 55 call void @llvm.lifetime.end(i64 -1, i8* %b) 56 ret i32 %t7 57bb3: 58 call void @llvm.lifetime.end(i64 -1, i8* %b) 59 ret i32 0 60} 61 62;CHECK-LABEL: myCall2_w2 63;YESCOLOR: subq $144, %rsp 64;NOCOLOR: subq $272, %rsp 65 66define i32 @myCall2_w2(i32 %in, i1 %d) { 67entry: 68 %a = alloca [17 x i8*], align 8 69 %a2 = alloca [16 x i8*], align 8 70 %b = bitcast [17 x i8*]* %a to i8* 71 %b2 = bitcast [16 x i8*]* %a2 to i8* 72 call void @llvm.lifetime.start(i64 -1, i8* %b) 73 %t1 = call i32 @foo(i32 %in, i8* %b) 74 %t2 = call i32 @foo(i32 %in, i8* %b) 75 call void @llvm.lifetime.end(i64 -1, i8* %b) 76 br i1 %d, label %bb2, label %bb3 77bb2: 78 call void @llvm.lifetime.start(i64 -1, i8* %b2) 79 %t3 = call i32 @foo(i32 %in, i8* %b2) 80 %t4 = call i32 @foo(i32 %in, i8* %b2) 81 call void @llvm.lifetime.end(i64 -1, i8* %b2) 82 %t5 = add i32 %t1, %t2 83 %t6 = add i32 %t3, %t4 84 %t7 = add i32 %t5, %t6 85 ret i32 %t7 86bb3: 87 ret i32 0 88} 89 90;CHECK-LABEL: myCall_w4: 91;FIRSTUSE: subq $120, %rsp 92;YESCOLOR: subq $200, %rsp 93;NOCOLOR: subq $408, %rsp 94 95define i32 @myCall_w4(i32 %in) { 96entry: 97 %a1 = alloca [14 x i8*], align 8 98 %a2 = alloca [13 x i8*], align 8 99 %a3 = alloca [12 x i8*], align 8 100 %a4 = alloca [11 x i8*], align 8 101 %b1 = bitcast [14 x i8*]* %a1 to i8* 102 %b2 = bitcast [13 x i8*]* %a2 to i8* 103 %b3 = bitcast [12 x i8*]* %a3 to i8* 104 %b4 = bitcast [11 x i8*]* %a4 to i8* 105 call void @llvm.lifetime.start(i64 -1, i8* %b4) 106 call void @llvm.lifetime.start(i64 -1, i8* %b1) 107 %t1 = call i32 @foo(i32 %in, i8* %b1) 108 %t2 = call i32 @foo(i32 %in, i8* %b1) 109 call void @llvm.lifetime.end(i64 -1, i8* %b1) 110 call void @llvm.lifetime.start(i64 -1, i8* %b2) 111 %t9 = call i32 @foo(i32 %in, i8* %b2) 112 %t8 = call i32 @foo(i32 %in, i8* %b2) 113 call void @llvm.lifetime.end(i64 -1, i8* %b2) 114 call void @llvm.lifetime.start(i64 -1, i8* %b3) 115 %t3 = call i32 @foo(i32 %in, i8* %b3) 116 %t4 = call i32 @foo(i32 %in, i8* %b3) 117 call void @llvm.lifetime.end(i64 -1, i8* %b3) 118 %t11 = call i32 @foo(i32 %in, i8* %b4) 119 call void @llvm.lifetime.end(i64 -1, i8* %b4) 120 %t5 = add i32 %t1, %t2 121 %t6 = add i32 %t3, %t4 122 %t7 = add i32 %t5, %t6 123 ret i32 %t7 124} 125 126;CHECK-LABEL: myCall2_w4: 127;YESCOLOR: subq $112, %rsp 128;NOCOLOR: subq $400, %rsp 129 130define i32 @myCall2_w4(i32 %in) { 131entry: 132 %a1 = alloca [14 x i8*], align 8 133 %a2 = alloca [13 x i8*], align 8 134 %a3 = alloca [12 x i8*], align 8 135 %a4 = alloca [11 x i8*], align 8 136 %b1 = bitcast [14 x i8*]* %a1 to i8* 137 %b2 = bitcast [13 x i8*]* %a2 to i8* 138 %b3 = bitcast [12 x i8*]* %a3 to i8* 139 %b4 = bitcast [11 x i8*]* %a4 to i8* 140 call void @llvm.lifetime.start(i64 -1, i8* %b1) 141 %t1 = call i32 @foo(i32 %in, i8* %b1) 142 %t2 = call i32 @foo(i32 %in, i8* %b1) 143 call void @llvm.lifetime.end(i64 -1, i8* %b1) 144 call void @llvm.lifetime.start(i64 -1, i8* %b2) 145 %t9 = call i32 @foo(i32 %in, i8* %b2) 146 %t8 = call i32 @foo(i32 %in, i8* %b2) 147 call void @llvm.lifetime.end(i64 -1, i8* %b2) 148 call void @llvm.lifetime.start(i64 -1, i8* %b3) 149 %t3 = call i32 @foo(i32 %in, i8* %b3) 150 %t4 = call i32 @foo(i32 %in, i8* %b3) 151 call void @llvm.lifetime.end(i64 -1, i8* %b3) 152 br i1 undef, label %bb2, label %bb3 153bb2: 154 call void @llvm.lifetime.start(i64 -1, i8* %b4) 155 %t11 = call i32 @foo(i32 %in, i8* %b4) 156 call void @llvm.lifetime.end(i64 -1, i8* %b4) 157 %t5 = add i32 %t1, %t2 158 %t6 = add i32 %t3, %t4 159 %t7 = add i32 %t5, %t6 160 ret i32 %t7 161bb3: 162 ret i32 0 163} 164 165 166;CHECK-LABEL: myCall2_noend: 167;YESCOLOR: subq $144, %rsp 168;NOCOLOR: subq $272, %rsp 169 170 171define i32 @myCall2_noend(i32 %in, i1 %d) { 172entry: 173 %a = alloca [17 x i8*], align 8 174 %a2 = alloca [16 x i8*], align 8 175 %b = bitcast [17 x i8*]* %a to i8* 176 %b2 = bitcast [16 x i8*]* %a2 to i8* 177 call void @llvm.lifetime.start(i64 -1, i8* %b) 178 %t1 = call i32 @foo(i32 %in, i8* %b) 179 %t2 = call i32 @foo(i32 %in, i8* %b) 180 call void @llvm.lifetime.end(i64 -1, i8* %b) 181 br i1 %d, label %bb2, label %bb3 182bb2: 183 call void @llvm.lifetime.start(i64 -1, i8* %b2) 184 %t3 = call i32 @foo(i32 %in, i8* %b2) 185 %t4 = call i32 @foo(i32 %in, i8* %b2) 186 %t5 = add i32 %t1, %t2 187 %t6 = add i32 %t3, %t4 188 %t7 = add i32 %t5, %t6 189 ret i32 %t7 190bb3: 191 ret i32 0 192} 193 194;CHECK-LABEL: myCall2_noend2: 195;YESCOLOR: subq $144, %rsp 196;NOCOLOR: subq $272, %rsp 197define i32 @myCall2_noend2(i32 %in, i1 %d) { 198entry: 199 %a = alloca [17 x i8*], align 8 200 %a2 = alloca [16 x i8*], align 8 201 %b = bitcast [17 x i8*]* %a to i8* 202 %b2 = bitcast [16 x i8*]* %a2 to i8* 203 call void @llvm.lifetime.start(i64 -1, i8* %b) 204 %t1 = call i32 @foo(i32 %in, i8* %b) 205 %t2 = call i32 @foo(i32 %in, i8* %b) 206 br i1 %d, label %bb2, label %bb3 207bb2: 208 call void @llvm.lifetime.end(i64 -1, i8* %b) 209 call void @llvm.lifetime.start(i64 -1, i8* %b2) 210 %t3 = call i32 @foo(i32 %in, i8* %b2) 211 %t4 = call i32 @foo(i32 %in, i8* %b2) 212 %t5 = add i32 %t1, %t2 213 %t6 = add i32 %t3, %t4 214 %t7 = add i32 %t5, %t6 215 ret i32 %t7 216bb3: 217 ret i32 0 218} 219 220 221;CHECK-LABEL: myCall2_nostart: 222;YESCOLOR: subq $272, %rsp 223;NOCOLOR: subq $272, %rsp 224define i32 @myCall2_nostart(i32 %in, i1 %d) { 225entry: 226 %a = alloca [17 x i8*], align 8 227 %a2 = alloca [16 x i8*], align 8 228 %b = bitcast [17 x i8*]* %a to i8* 229 %b2 = bitcast [16 x i8*]* %a2 to i8* 230 %t1 = call i32 @foo(i32 %in, i8* %b) 231 %t2 = call i32 @foo(i32 %in, i8* %b) 232 call void @llvm.lifetime.end(i64 -1, i8* %b) 233 br i1 %d, label %bb2, label %bb3 234bb2: 235 call void @llvm.lifetime.start(i64 -1, i8* %b2) 236 %t3 = call i32 @foo(i32 %in, i8* %b2) 237 %t4 = call i32 @foo(i32 %in, i8* %b2) 238 %t5 = add i32 %t1, %t2 239 %t6 = add i32 %t3, %t4 240 %t7 = add i32 %t5, %t6 241 ret i32 %t7 242bb3: 243 ret i32 0 244} 245 246; Adopt the test from Transforms/Inline/array_merge.ll' 247;CHECK-LABEL: array_merge: 248;YESCOLOR: subq $808, %rsp 249;NOCOLOR: subq $1608, %rsp 250define void @array_merge() nounwind ssp { 251entry: 252 %A.i1 = alloca [100 x i32], align 4 253 %B.i2 = alloca [100 x i32], align 4 254 %A.i = alloca [100 x i32], align 4 255 %B.i = alloca [100 x i32], align 4 256 %0 = bitcast [100 x i32]* %A.i to i8* 257 call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind 258 %1 = bitcast [100 x i32]* %B.i to i8* 259 call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind 260 call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind 261 call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind 262 call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind 263 %2 = bitcast [100 x i32]* %A.i1 to i8* 264 call void @llvm.lifetime.start(i64 -1, i8* %2) nounwind 265 %3 = bitcast [100 x i32]* %B.i2 to i8* 266 call void @llvm.lifetime.start(i64 -1, i8* %3) nounwind 267 call void @bar([100 x i32]* %A.i1, [100 x i32]* %B.i2) nounwind 268 call void @llvm.lifetime.end(i64 -1, i8* %2) nounwind 269 call void @llvm.lifetime.end(i64 -1, i8* %3) nounwind 270 ret void 271} 272 273;CHECK-LABEL: func_phi_lifetime: 274;YESCOLOR: subq $272, %rsp 275;NOCOLOR: subq $272, %rsp 276define i32 @func_phi_lifetime(i32 %in, i1 %d) { 277entry: 278 %a = alloca [17 x i8*], align 8 279 %a2 = alloca [16 x i8*], align 8 280 %b = bitcast [17 x i8*]* %a to i8* 281 %b2 = bitcast [16 x i8*]* %a2 to i8* 282 %t1 = call i32 @foo(i32 %in, i8* %b) 283 %t2 = call i32 @foo(i32 %in, i8* %b) 284 call void @llvm.lifetime.end(i64 -1, i8* %b) 285 br i1 %d, label %bb0, label %bb1 286 287bb0: 288 %I1 = bitcast [17 x i8*]* %a to i8* 289 br label %bb2 290 291bb1: 292 %I2 = bitcast [16 x i8*]* %a2 to i8* 293 br label %bb2 294 295bb2: 296 %split = phi i8* [ %I1, %bb0 ], [ %I2, %bb1 ] 297 call void @llvm.lifetime.start(i64 -1, i8* %split) 298 %t3 = call i32 @foo(i32 %in, i8* %b2) 299 %t4 = call i32 @foo(i32 %in, i8* %b2) 300 %t5 = add i32 %t1, %t2 301 %t6 = add i32 %t3, %t4 302 %t7 = add i32 %t5, %t6 303 call void @llvm.lifetime.end(i64 -1, i8* %split) 304 ret i32 %t7 305bb3: 306 ret i32 0 307} 308 309 310;CHECK-LABEL: multi_region_bb: 311define void @multi_region_bb() nounwind ssp { 312entry: 313 %A.i1 = alloca [100 x i32], align 4 314 %B.i2 = alloca [100 x i32], align 4 315 %A.i = alloca [100 x i32], align 4 316 %B.i = alloca [100 x i32], align 4 317 %0 = bitcast [100 x i32]* %A.i to i8* 318 call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind ; <---- start #1 319 %1 = bitcast [100 x i32]* %B.i to i8* 320 call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind 321 call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind 322 call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind 323 call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind 324 %2 = bitcast [100 x i32]* %A.i1 to i8* 325 call void @llvm.lifetime.start(i64 -1, i8* %2) nounwind 326 %3 = bitcast [100 x i32]* %B.i2 to i8* 327 call void @llvm.lifetime.start(i64 -1, i8* %3) nounwind 328 call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind ; <---- start #2 329 call void @bar([100 x i32]* %A.i1, [100 x i32]* %B.i2) nounwind 330 call void @llvm.lifetime.end(i64 -1, i8* %2) nounwind 331 call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind 332 call void @llvm.lifetime.end(i64 -1, i8* %3) nounwind 333 ret void 334} 335;YESCOLOR: subq $272, %rsp 336;NOCOLOR: subq $272, %rsp 337 338define i32 @myCall_end_before_begin(i32 %in, i1 %d) { 339entry: 340 %a = alloca [17 x i8*], align 8 341 %a2 = alloca [16 x i8*], align 8 342 %b = bitcast [17 x i8*]* %a to i8* 343 %b2 = bitcast [16 x i8*]* %a2 to i8* 344 %t1 = call i32 @foo(i32 %in, i8* %b) 345 %t2 = call i32 @foo(i32 %in, i8* %b) 346 call void @llvm.lifetime.end(i64 -1, i8* %b) 347 call void @llvm.lifetime.start(i64 -1, i8* %b) 348 br i1 %d, label %bb2, label %bb3 349bb2: 350 call void @llvm.lifetime.start(i64 -1, i8* %b2) 351 %t3 = call i32 @foo(i32 %in, i8* %b2) 352 %t4 = call i32 @foo(i32 %in, i8* %b2) 353 %t5 = add i32 %t1, %t2 354 %t6 = add i32 %t3, %t4 355 %t7 = add i32 %t5, %t6 356 ret i32 %t7 357bb3: 358 ret i32 0 359} 360 361 362; Regression test for PR15707. %buf1 and %buf2 should not be merged 363; in this test case. 364;CHECK-LABEL: myCall_pr15707: 365;YESCOLOR: subq $200008, %rsp 366;NOCOLOR: subq $200008, %rsp 367define void @myCall_pr15707() { 368 %buf1 = alloca i8, i32 100000, align 16 369 %buf2 = alloca i8, i32 100000, align 16 370 371 call void @llvm.lifetime.start(i64 -1, i8* %buf1) 372 call void @llvm.lifetime.end(i64 -1, i8* %buf1) 373 374 call void @llvm.lifetime.start(i64 -1, i8* %buf1) 375 call void @llvm.lifetime.start(i64 -1, i8* %buf2) 376 %result1 = call i32 @foo(i32 0, i8* %buf1) 377 %result2 = call i32 @foo(i32 0, i8* %buf2) 378 ret void 379} 380 381 382; Check that we don't assert and crash even when there are allocas 383; outside the declared lifetime regions. 384;CHECK-LABEL: bad_range: 385define void @bad_range() nounwind ssp { 386entry: 387 %A.i1 = alloca [100 x i32], align 4 388 %B.i2 = alloca [100 x i32], align 4 389 %A.i = alloca [100 x i32], align 4 390 %B.i = alloca [100 x i32], align 4 391 %0 = bitcast [100 x i32]* %A.i to i8* 392 call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind 393 %1 = bitcast [100 x i32]* %B.i to i8* 394 call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind 395 call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind 396 call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind 397 call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind 398 br label %block2 399 400block2: 401 ; I am used outside the marked lifetime. 402 call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind 403 ret void 404} 405 406 407; Check that we don't assert and crash even when there are usages 408; of allocas which do not read or write outside the declared lifetime regions. 409;CHECK-LABEL: shady_range: 410 411%struct.Klass = type { i32, i32 } 412 413define i32 @shady_range(i32 %argc, i8** nocapture %argv) uwtable { 414 %a.i = alloca [4 x %struct.Klass], align 16 415 %b.i = alloca [4 x %struct.Klass], align 16 416 %a8 = bitcast [4 x %struct.Klass]* %a.i to i8* 417 %b8 = bitcast [4 x %struct.Klass]* %b.i to i8* 418 ; I am used outside the lifetime zone below: 419 %z2 = getelementptr inbounds [4 x %struct.Klass], [4 x %struct.Klass]* %a.i, i64 0, i64 0, i32 0 420 call void @llvm.lifetime.start(i64 -1, i8* %a8) 421 call void @llvm.lifetime.start(i64 -1, i8* %b8) 422 %z3 = load i32, i32* %z2, align 16 423 %r = call i32 @foo(i32 %z3, i8* %a8) 424 %r2 = call i32 @foo(i32 %z3, i8* %b8) 425 call void @llvm.lifetime.end(i64 -1, i8* %a8) 426 call void @llvm.lifetime.end(i64 -1, i8* %b8) 427 ret i32 9 428} 429 430; In this case 'itar1' and 'itar2' can't be overlapped if we treat 431; lifetime.start as the beginning of the lifetime, but we can 432; overlap if we consider first use of the slot as lifetime 433; start. See llvm bug 25776. 434 435;CHECK-LABEL: ifthen_twoslots: 436;FIRSTUSE: subq $536, %rsp 437;YESCOLOR: subq $1048, %rsp 438;NOCOLOR: subq $1048, %rsp 439 440define i32 @ifthen_twoslots(i32 %x) #0 { 441entry: 442 %retval = alloca i32, align 4 443 %x.addr = alloca i32, align 4 444 %itar1 = alloca [128 x i32], align 16 445 %itar2 = alloca [128 x i32], align 16 446 %cleanup.dest.slot = alloca i32 447 store i32 %x, i32* %x.addr, align 4 448 %itar1_start_8 = bitcast [128 x i32]* %itar1 to i8* 449 call void @llvm.lifetime.start(i64 512, i8* %itar1_start_8) #3 450 %itar2_start_8 = bitcast [128 x i32]* %itar2 to i8* 451 call void @llvm.lifetime.start(i64 512, i8* %itar2_start_8) #3 452 %xval = load i32, i32* %x.addr, align 4 453 %and = and i32 %xval, 1 454 %tobool = icmp ne i32 %and, 0 455 br i1 %tobool, label %if.then, label %if.else 456 457if.then: ; preds = %entry 458 %arraydecay = getelementptr inbounds [128 x i32], [128 x i32]* %itar1, i32 0, i32 0 459 call void @inita(i32* %arraydecay) 460 store i32 1, i32* %retval, align 4 461 store i32 1, i32* %cleanup.dest.slot, align 4 462 %itar2_end_8 = bitcast [128 x i32]* %itar2 to i8* 463 call void @llvm.lifetime.end(i64 512, i8* %itar2_end_8) #3 464 %itar1_end_8 = bitcast [128 x i32]* %itar1 to i8* 465 call void @llvm.lifetime.end(i64 512, i8* %itar1_end_8) #3 466 br label %cleanup 467 468if.else: ; preds = %entry 469 %arraydecay1 = getelementptr inbounds [128 x i32], [128 x i32]* %itar2, i32 0, i32 0 470 call void @inita(i32* %arraydecay1) 471 store i32 0, i32* %retval, align 4 472 store i32 1, i32* %cleanup.dest.slot, align 4 473 %itar2_end2_8 = bitcast [128 x i32]* %itar2 to i8* 474 call void @llvm.lifetime.end(i64 512, i8* %itar2_end2_8) #3 475 %itar1_end2_8 = bitcast [128 x i32]* %itar1 to i8* 476 call void @llvm.lifetime.end(i64 512, i8* %itar1_end2_8) #3 477 br label %cleanup 478 479cleanup: ; preds = %if.else, %if.then 480 %final_retval = load i32, 481 i32* %retval, align 4 482 ret i32 %final_retval 483} 484 485; This function is intended to test the case where you 486; have a reference to a stack slot that lies outside of 487; the START/END lifetime markers-- the flow analysis 488; should catch this and build the lifetime based on the 489; markers only. 490 491;CHECK-LABEL: while_loop: 492;FIRSTUSE: subq $1032, %rsp 493;YESCOLOR: subq $1544, %rsp 494;NOCOLOR: subq $1544, %rsp 495 496define i32 @while_loop(i32 %x) #0 { 497entry: 498 %b1 = alloca [128 x i32], align 16 499 %b2 = alloca [128 x i32], align 16 500 %b3 = alloca [128 x i32], align 16 501 %tmp = bitcast [128 x i32]* %b1 to i8* 502 call void @llvm.lifetime.start(i64 512, i8* %tmp) #3 503 %tmp1 = bitcast [128 x i32]* %b2 to i8* 504 call void @llvm.lifetime.start(i64 512, i8* %tmp1) #3 505 %and = and i32 %x, 1 506 %tobool = icmp eq i32 %and, 0 507 br i1 %tobool, label %if.else, label %if.then 508 509if.then: ; preds = %entry 510 %arraydecay = getelementptr inbounds [128 x i32], [128 x i32]* %b2, i64 0, i64 0 511 call void @inita(i32* %arraydecay) #3 512 br label %if.end 513 514if.else: ; preds = %entry 515 %arraydecay1 = getelementptr inbounds [128 x i32], [128 x i32]* %b1, i64 0, i64 0 516 call void @inita(i32* %arraydecay1) #3 517 %arraydecay3 = getelementptr inbounds [128 x i32], [128 x i32]* %b3, i64 0, i64 0 518 call void @inita(i32* %arraydecay3) #3 519 %tobool25 = icmp eq i32 %x, 0 520 br i1 %tobool25, label %if.end, label %while.body.lr.ph 521 522while.body.lr.ph: ; preds = %if.else 523 %tmp2 = bitcast [128 x i32]* %b3 to i8* 524 br label %while.body 525 526while.body: ; preds = %while.body.lr.ph, %while.body 527 %x.addr.06 = phi i32 [ %x, %while.body.lr.ph ], [ %dec, %while.body ] 528 %dec = add nsw i32 %x.addr.06, -1 529 call void @llvm.lifetime.start(i64 512, i8* %tmp2) #3 530 call void @inita(i32* %arraydecay3) #3 531 call void @llvm.lifetime.end(i64 512, i8* %tmp2) #3 532 %tobool2 = icmp eq i32 %dec, 0 533 br i1 %tobool2, label %if.end.loopexit, label %while.body 534 535if.end.loopexit: ; preds = %while.body 536 br label %if.end 537 538if.end: ; preds = %if.end.loopexit, %if.else, %if.then 539 call void @llvm.lifetime.end(i64 512, i8* %tmp1) #3 540 call void @llvm.lifetime.end(i64 512, i8* %tmp) #3 541 ret i32 0 542} 543 544; Test case motivated by PR27903. Same routine inlined multiple times 545; into a caller results in a multi-segment lifetime, but the second 546; lifetime has no explicit references to the stack slot. 547; 548; FIXME: the "FIRSTUSE" stack size (56) below represents buggy/incorrect 549; behavior not currently exposed on trunk, due to the fact that 550; the "stackcoloring-lifetime-start-on-first-use" now defaults to 551; false. When a better fix for PR27903 is checked in, this result 552; will change to 96. 553 554;CHECK-LABEL: twobod_b27903: 555;FIRSTUSE: subq $56, %rsp 556;YESCOLOR: subq $96, %rsp 557;NOCOLOR: subq $96, %rsp 558 559define i32 @twobod_b27903(i32 %y, i32 %x) { 560entry: 561 %buffer.i = alloca [12 x i32], align 16 562 %abc = alloca [12 x i32], align 16 563 %tmp = bitcast [12 x i32]* %buffer.i to i8* 564 call void @llvm.lifetime.start(i64 48, i8* %tmp) 565 %idxprom.i = sext i32 %y to i64 566 %arrayidx.i = getelementptr inbounds [12 x i32], [12 x i32]* %buffer.i, i64 0, i64 %idxprom.i 567 call void @inita(i32* %arrayidx.i) 568 %add.i = add nsw i32 %x, %y 569 call void @llvm.lifetime.end(i64 48, i8* %tmp) 570 %tobool = icmp eq i32 %y, 0 571 br i1 %tobool, label %if.end, label %if.then 572 573if.then: ; preds = %entry 574 %tmp1 = bitcast [12 x i32]* %abc to i8* 575 call void @llvm.lifetime.start(i64 48, i8* %tmp1) 576 %arrayidx = getelementptr inbounds [12 x i32], [12 x i32]* %abc, i64 0, i64 %idxprom.i 577 call void @inita(i32* %arrayidx) 578 call void @llvm.lifetime.start(i64 48, i8* %tmp) 579 call void @inita(i32* %arrayidx.i) 580 %add.i9 = add nsw i32 %add.i, %y 581 call void @llvm.lifetime.end(i64 48, i8* %tmp) 582 call void @llvm.lifetime.end(i64 48, i8* %tmp1) 583 br label %if.end 584 585if.end: ; preds = %if.then, %entry 586 %x.addr.0 = phi i32 [ %add.i9, %if.then ], [ %add.i, %entry ] 587 ret i32 %x.addr.0 588} 589 590declare void @inita(i32*) #2 591 592declare void @bar([100 x i32]* , [100 x i32]*) nounwind 593 594declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind 595 596declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind 597 598declare i32 @foo(i32, i8*) 599