599 lines · plain
1; RUN: llc -mcpu=corei7 -no-stack-coloring=false < %s | FileCheck %s --check-prefix=YESCOLOR --check-prefix=CHECK2; RUN: llc -mcpu=corei7 -no-stack-coloring=false -stackcoloring-lifetime-start-on-first-use=false < %s | FileCheck %s --check-prefix=NOFIRSTUSE --check-prefix=CHECK3; RUN: llc -mcpu=corei7 -no-stack-coloring=true < %s | FileCheck %s --check-prefix=NOCOLOR --check-prefix=CHECK4 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, %rsp10;NOCOLOR: subq $272, %rsp11 12define i32 @myCall_w2(i32 %in) {13entry:14 %a = alloca [17 x ptr], align 815 %a2 = alloca [16 x ptr], align 816 call void @llvm.lifetime.start.p0(i64 -1, ptr %a)17 %t1 = call i32 @foo(i32 %in, ptr %a)18 %t2 = call i32 @foo(i32 %in, ptr %a)19 call void @llvm.lifetime.end.p0(i64 -1, ptr %a)20 call void @llvm.lifetime.start.p0(i64 -1, ptr %a2)21 %t3 = call i32 @foo(i32 %in, ptr %a2)22 %t4 = call i32 @foo(i32 %in, ptr %a2)23 call void @llvm.lifetime.end.p0(i64 -1, ptr %a2)24 %t5 = add i32 %t1, %t225 %t6 = add i32 %t3, %t426 %t7 = add i32 %t5, %t627 ret i32 %t728}29 30 31;CHECK-LABEL: myCall2_no_merge32;YESCOLOR: subq $272, %rsp33;NOCOLOR: subq $272, %rsp34 35define i32 @myCall2_no_merge(i32 %in, i1 %d) {36entry:37 %a = alloca [17 x ptr], align 838 %a2 = alloca [16 x ptr], align 839 call void @llvm.lifetime.start.p0(i64 -1, ptr %a)40 %t1 = call i32 @foo(i32 %in, ptr %a)41 %t2 = call i32 @foo(i32 %in, ptr %a)42 br i1 %d, label %bb2, label %bb343bb2:44 call void @llvm.lifetime.start.p0(i64 -1, ptr %a2)45 %t3 = call i32 @foo(i32 %in, ptr %a2)46 %t4 = call i32 @foo(i32 %in, ptr %a2)47 call void @llvm.lifetime.end.p0(i64 -1, ptr %a2)48 %t5 = add i32 %t1, %t249 %t6 = add i32 %t3, %t450 %t7 = add i32 %t5, %t651 call void @llvm.lifetime.end.p0(i64 -1, ptr %a)52 ret i32 %t753bb3:54 call void @llvm.lifetime.end.p0(i64 -1, ptr %a)55 ret i32 056}57 58;CHECK-LABEL: myCall2_w259;YESCOLOR: subq $144, %rsp60;NOCOLOR: subq $272, %rsp61 62define i32 @myCall2_w2(i32 %in, i1 %d) {63entry:64 %a = alloca [17 x ptr], align 865 %a2 = alloca [16 x ptr], align 866 call void @llvm.lifetime.start.p0(i64 -1, ptr %a)67 %t1 = call i32 @foo(i32 %in, ptr %a)68 %t2 = call i32 @foo(i32 %in, ptr %a)69 call void @llvm.lifetime.end.p0(i64 -1, ptr %a)70 br i1 %d, label %bb2, label %bb371bb2:72 call void @llvm.lifetime.start.p0(i64 -1, ptr %a2)73 %t3 = call i32 @foo(i32 %in, ptr %a2)74 %t4 = call i32 @foo(i32 %in, ptr %a2)75 call void @llvm.lifetime.end.p0(i64 -1, ptr %a2)76 %t5 = add i32 %t1, %t277 %t6 = add i32 %t3, %t478 %t7 = add i32 %t5, %t679 ret i32 %t780bb3:81 ret i32 082}83 84;CHECK-LABEL: myCall_w4:85;YESCOLOR: subq $112, %rsp86;NOFIRSTUSE: subq $208, %rsp87;NOCOLOR: subq $400, %rsp88 89define i32 @myCall_w4(i32 %in) {90entry:91 %a1 = alloca [14 x ptr], align 892 %a2 = alloca [13 x ptr], align 893 %a3 = alloca [12 x ptr], align 894 %a4 = alloca [11 x ptr], align 895 call void @llvm.lifetime.start.p0(i64 -1, ptr %a4)96 call void @llvm.lifetime.start.p0(i64 -1, ptr %a1)97 %t1 = call i32 @foo(i32 %in, ptr %a1)98 %t2 = call i32 @foo(i32 %in, ptr %a1)99 call void @llvm.lifetime.end.p0(i64 -1, ptr %a1)100 call void @llvm.lifetime.start.p0(i64 -1, ptr %a2)101 %t9 = call i32 @foo(i32 %in, ptr %a2)102 %t8 = call i32 @foo(i32 %in, ptr %a2)103 call void @llvm.lifetime.end.p0(i64 -1, ptr %a2)104 call void @llvm.lifetime.start.p0(i64 -1, ptr %a3)105 %t3 = call i32 @foo(i32 %in, ptr %a3)106 %t4 = call i32 @foo(i32 %in, ptr %a3)107 call void @llvm.lifetime.end.p0(i64 -1, ptr %a3)108 %t11 = call i32 @foo(i32 %in, ptr %a4)109 call void @llvm.lifetime.end.p0(i64 -1, ptr %a4)110 %t5 = add i32 %t1, %t2111 %t6 = add i32 %t3, %t4112 %t7 = add i32 %t5, %t6113 ret i32 %t7114}115 116;CHECK-LABEL: myCall2_w4:117;YESCOLOR: subq $112, %rsp118;NOCOLOR: subq $400, %rsp119 120define i32 @myCall2_w4(i32 %in) {121entry:122 %a1 = alloca [14 x ptr], align 8123 %a2 = alloca [13 x ptr], align 8124 %a3 = alloca [12 x ptr], align 8125 %a4 = alloca [11 x ptr], align 8126 call void @llvm.lifetime.start.p0(i64 -1, ptr %a1)127 %t1 = call i32 @foo(i32 %in, ptr %a1)128 %t2 = call i32 @foo(i32 %in, ptr %a1)129 call void @llvm.lifetime.end.p0(i64 -1, ptr %a1)130 call void @llvm.lifetime.start.p0(i64 -1, ptr %a2)131 %t9 = call i32 @foo(i32 %in, ptr %a2)132 %t8 = call i32 @foo(i32 %in, ptr %a2)133 call void @llvm.lifetime.end.p0(i64 -1, ptr %a2)134 call void @llvm.lifetime.start.p0(i64 -1, ptr %a3)135 %t3 = call i32 @foo(i32 %in, ptr %a3)136 %t4 = call i32 @foo(i32 %in, ptr %a3)137 call void @llvm.lifetime.end.p0(i64 -1, ptr %a3)138 br i1 poison, label %bb2, label %bb3139bb2:140 call void @llvm.lifetime.start.p0(i64 -1, ptr %a4)141 %t11 = call i32 @foo(i32 %in, ptr %a4)142 call void @llvm.lifetime.end.p0(i64 -1, ptr %a4)143 %t5 = add i32 %t1, %t2144 %t6 = add i32 %t3, %t4145 %t7 = add i32 %t5, %t6146 ret i32 %t7147bb3:148 ret i32 0149}150 151 152;CHECK-LABEL: myCall2_noend:153;YESCOLOR: subq $144, %rsp154;NOCOLOR: subq $272, %rsp155 156 157define i32 @myCall2_noend(i32 %in, i1 %d) {158entry:159 %a = alloca [17 x ptr], align 8160 %a2 = alloca [16 x ptr], align 8161 call void @llvm.lifetime.start.p0(i64 -1, ptr %a)162 %t1 = call i32 @foo(i32 %in, ptr %a)163 %t2 = call i32 @foo(i32 %in, ptr %a)164 call void @llvm.lifetime.end.p0(i64 -1, ptr %a)165 br i1 %d, label %bb2, label %bb3166bb2:167 call void @llvm.lifetime.start.p0(i64 -1, ptr %a2)168 %t3 = call i32 @foo(i32 %in, ptr %a2)169 %t4 = call i32 @foo(i32 %in, ptr %a2)170 %t5 = add i32 %t1, %t2171 %t6 = add i32 %t3, %t4172 %t7 = add i32 %t5, %t6173 ret i32 %t7174bb3:175 ret i32 0176}177 178;CHECK-LABEL: myCall2_noend2:179;YESCOLOR: subq $144, %rsp180;NOCOLOR: subq $272, %rsp181define i32 @myCall2_noend2(i32 %in, i1 %d) {182entry:183 %a = alloca [17 x ptr], align 8184 %a2 = alloca [16 x ptr], align 8185 call void @llvm.lifetime.start.p0(i64 -1, ptr %a)186 %t1 = call i32 @foo(i32 %in, ptr %a)187 %t2 = call i32 @foo(i32 %in, ptr %a)188 br i1 %d, label %bb2, label %bb3189bb2:190 call void @llvm.lifetime.end.p0(i64 -1, ptr %a)191 call void @llvm.lifetime.start.p0(i64 -1, ptr %a2)192 %t3 = call i32 @foo(i32 %in, ptr %a2)193 %t4 = call i32 @foo(i32 %in, ptr %a2)194 %t5 = add i32 %t1, %t2195 %t6 = add i32 %t3, %t4196 %t7 = add i32 %t5, %t6197 ret i32 %t7198bb3:199 ret i32 0200}201 202 203;CHECK-LABEL: myCall2_nostart:204;YESCOLOR: subq $272, %rsp205;NOCOLOR: subq $272, %rsp206define i32 @myCall2_nostart(i32 %in, i1 %d) {207entry:208 %a = alloca [17 x ptr], align 8209 %a2 = alloca [16 x ptr], align 8210 %t1 = call i32 @foo(i32 %in, ptr %a)211 %t2 = call i32 @foo(i32 %in, ptr %a)212 call void @llvm.lifetime.end.p0(i64 -1, ptr %a)213 br i1 %d, label %bb2, label %bb3214bb2:215 call void @llvm.lifetime.start.p0(i64 -1, ptr %a2)216 %t3 = call i32 @foo(i32 %in, ptr %a2)217 %t4 = call i32 @foo(i32 %in, ptr %a2)218 %t5 = add i32 %t1, %t2219 %t6 = add i32 %t3, %t4220 %t7 = add i32 %t5, %t6221 ret i32 %t7222bb3:223 ret i32 0224}225 226; Adopt the test from Transforms/Inline/array_merge.ll'227;CHECK-LABEL: array_merge:228;YESCOLOR: subq $808, %rsp229;NOCOLOR: subq $1608, %rsp230define void @array_merge() nounwind ssp {231entry:232 %A.i1 = alloca [100 x i32], align 4233 %B.i2 = alloca [100 x i32], align 4234 %A.i = alloca [100 x i32], align 4235 %B.i = alloca [100 x i32], align 4236 call void @llvm.lifetime.start.p0(i64 -1, ptr %A.i) nounwind237 call void @llvm.lifetime.start.p0(i64 -1, ptr %B.i) nounwind238 call void @bar(ptr %A.i, ptr %B.i) nounwind239 call void @llvm.lifetime.end.p0(i64 -1, ptr %A.i) nounwind240 call void @llvm.lifetime.end.p0(i64 -1, ptr %B.i) nounwind241 call void @llvm.lifetime.start.p0(i64 -1, ptr %A.i1) nounwind242 call void @llvm.lifetime.start.p0(i64 -1, ptr %B.i2) nounwind243 call void @bar(ptr %A.i1, ptr %B.i2) nounwind244 call void @llvm.lifetime.end.p0(i64 -1, ptr %A.i1) nounwind245 call void @llvm.lifetime.end.p0(i64 -1, ptr %B.i2) nounwind246 ret void247}248 249;CHECK-LABEL: func_phi_lifetime:250;YESCOLOR: subq $272, %rsp251;NOCOLOR: subq $272, %rsp252define i32 @func_phi_lifetime(i32 %in, i1 %d) {253entry:254 %a = alloca [17 x ptr], align 8255 %a2 = alloca [16 x ptr], align 8256 %t1 = call i32 @foo(i32 %in, ptr %a)257 %t2 = call i32 @foo(i32 %in, ptr %a)258 call void @llvm.lifetime.end.p0(i64 -1, ptr %a)259 br i1 %d, label %bb0, label %bb1260 261bb0:262 br label %bb2263 264bb1:265 br label %bb2266 267bb2:268 %split = phi ptr [ %a, %bb0 ], [ %a2, %bb1 ]269 call void @llvm.lifetime.start.p0(i64 -1, ptr %split)270 %t3 = call i32 @foo(i32 %in, ptr %a2)271 %t4 = call i32 @foo(i32 %in, ptr %a2)272 %t5 = add i32 %t1, %t2273 %t6 = add i32 %t3, %t4274 %t7 = add i32 %t5, %t6275 call void @llvm.lifetime.end.p0(i64 -1, ptr %split)276 ret i32 %t7277bb3:278 ret i32 0279}280 281 282;CHECK-LABEL: multi_region_bb:283;YESCOLOR: subq $272, %rsp284;NOCOLOR: subq $272, %rsp285 286define void @multi_region_bb() nounwind ssp {287entry:288 %A.i1 = alloca [100 x i32], align 4289 %B.i2 = alloca [100 x i32], align 4290 %A.i = alloca [100 x i32], align 4291 %B.i = alloca [100 x i32], align 4292 call void @llvm.lifetime.start.p0(i64 -1, ptr %A.i) nounwind ; <---- start #1293 call void @llvm.lifetime.start.p0(i64 -1, ptr %B.i) nounwind294 call void @bar(ptr %A.i, ptr %B.i) nounwind295 call void @llvm.lifetime.end.p0(i64 -1, ptr %A.i) nounwind296 call void @llvm.lifetime.end.p0(i64 -1, ptr %B.i) nounwind297 call void @llvm.lifetime.start.p0(i64 -1, ptr %A.i1) nounwind298 call void @llvm.lifetime.start.p0(i64 -1, ptr %B.i2) nounwind299 call void @llvm.lifetime.start.p0(i64 -1, ptr %A.i) nounwind ; <---- start #2300 call void @bar(ptr %A.i1, ptr %B.i2) nounwind301 call void @llvm.lifetime.end.p0(i64 -1, ptr %A.i1) nounwind302 call void @llvm.lifetime.end.p0(i64 -1, ptr %A.i) nounwind303 call void @llvm.lifetime.end.p0(i64 -1, ptr %B.i2) nounwind304 ret void305}306 307define i32 @myCall_end_before_begin(i32 %in, i1 %d) {308entry:309 %a = alloca [17 x ptr], align 8310 %a2 = alloca [16 x ptr], align 8311 %t1 = call i32 @foo(i32 %in, ptr %a)312 %t2 = call i32 @foo(i32 %in, ptr %a)313 call void @llvm.lifetime.end.p0(i64 -1, ptr %a)314 call void @llvm.lifetime.start.p0(i64 -1, ptr %a)315 br i1 %d, label %bb2, label %bb3316bb2:317 call void @llvm.lifetime.start.p0(i64 -1, ptr %a2)318 %t3 = call i32 @foo(i32 %in, ptr %a2)319 %t4 = call i32 @foo(i32 %in, ptr %a2)320 %t5 = add i32 %t1, %t2321 %t6 = add i32 %t3, %t4322 %t7 = add i32 %t5, %t6323 ret i32 %t7324bb3:325 ret i32 0326}327 328 329; Regression test for PR15707. %buf1 and %buf2 should not be merged330; in this test case.331;CHECK-LABEL: myCall_pr15707:332;NOFIRSTUSE: subq $200008, %rsp333;NOCOLOR: subq $200008, %rsp334define void @myCall_pr15707() {335 %buf1 = alloca i8, i32 100000, align 16336 %buf2 = alloca i8, i32 100000, align 16337 338 call void @llvm.lifetime.start.p0(i64 -1, ptr %buf1)339 call void @llvm.lifetime.end.p0(i64 -1, ptr %buf1)340 341 call void @llvm.lifetime.start.p0(i64 -1, ptr %buf1)342 call void @llvm.lifetime.start.p0(i64 -1, ptr %buf2)343 %result1 = call i32 @foo(i32 0, ptr %buf1)344 %result2 = call i32 @foo(i32 0, ptr %buf2)345 ret void346}347 348 349; Check that we don't assert and crash even when there are allocas350; outside the declared lifetime regions.351;CHECK-LABEL: bad_range:352define void @bad_range() nounwind ssp {353entry:354 %A.i1 = alloca [100 x i32], align 4355 %B.i2 = alloca [100 x i32], align 4356 %A.i = alloca [100 x i32], align 4357 %B.i = alloca [100 x i32], align 4358 call void @llvm.lifetime.start.p0(i64 -1, ptr %A.i) nounwind359 call void @llvm.lifetime.start.p0(i64 -1, ptr %B.i) nounwind360 call void @bar(ptr %A.i, ptr %B.i) nounwind361 call void @llvm.lifetime.end.p0(i64 -1, ptr %A.i) nounwind362 call void @llvm.lifetime.end.p0(i64 -1, ptr %B.i) nounwind363 br label %block2364 365block2:366 ; I am used outside the marked lifetime.367 call void @bar(ptr %A.i, ptr %B.i) nounwind368 ret void369}370 371 372; Check that we don't assert and crash even when there are usages373; of allocas which do not read or write outside the declared lifetime regions.374;CHECK-LABEL: shady_range:375 376%struct.Klass = type { i32, i32 }377 378define i32 @shady_range(i32 %argc, ptr nocapture %argv) uwtable {379 %a.i = alloca [4 x %struct.Klass], align 16380 %b.i = alloca [4 x %struct.Klass], align 16381 ; I am used outside the lifetime zone below:382 call void @llvm.lifetime.start.p0(i64 -1, ptr %a.i)383 call void @llvm.lifetime.start.p0(i64 -1, ptr %b.i)384 %z3 = load i32, ptr %a.i, align 16385 %r = call i32 @foo(i32 %z3, ptr %a.i)386 %r2 = call i32 @foo(i32 %z3, ptr %b.i)387 call void @llvm.lifetime.end.p0(i64 -1, ptr %a.i)388 call void @llvm.lifetime.end.p0(i64 -1, ptr %b.i)389 ret i32 9390}391 392; In this case 'itar1' and 'itar2' can't be overlapped if we treat393; lifetime.start as the beginning of the lifetime, but we can394; overlap if we consider first use of the slot as lifetime395; start. See llvm bug 25776.396 397;CHECK-LABEL: ifthen_twoslots:398;YESCOLOR: subq $1544, %rsp399;NOFIRSTUSE: subq $2056, %rsp400;NOCOLOR: subq $2568, %rsp401 402define i32 @ifthen_twoslots(i32 %x) #0 {403entry:404 %b1 = alloca [128 x i32], align 16405 %b2 = alloca [128 x i32], align 16406 %b3 = alloca [128 x i32], align 16407 %b4 = alloca [128 x i32], align 16408 %b5 = alloca [128 x i32], align 16409 call void @llvm.lifetime.start.p0(i64 512, ptr %b1)410 call void @llvm.lifetime.start.p0(i64 512, ptr %b2)411 %and = and i32 %x, 1412 %tobool = icmp eq i32 %and, 0413 br i1 %tobool, label %if.else, label %if.then414 415if.then: ; preds = %entry416 call void @llvm.lifetime.start.p0(i64 512, ptr %b3)417 call void @initb(ptr %b1, ptr %b3, ptr null)418 call void @llvm.lifetime.end.p0(i64 512, ptr %b3)419 br label %if.end420 421if.else: ; preds = %entry422 call void @llvm.lifetime.start.p0(i64 512, ptr %b4)423 call void @llvm.lifetime.start.p0(i64 512, ptr %b5)424 call void @initb(ptr %b2, ptr %b4, ptr %b5) #3425 call void @llvm.lifetime.end.p0(i64 512, ptr %b5)426 call void @llvm.lifetime.end.p0(i64 512, ptr %b4)427 br label %if.end428 429if.end: ; preds = %if.else, %if.then430 call void @llvm.lifetime.end.p0(i64 512, ptr %b2)431 call void @llvm.lifetime.end.p0(i64 512, ptr %b1)432 ret i32 0433 434}435 436; This function is intended to test the case where you437; have a reference to a stack slot that lies outside of438; the START/END lifetime markers-- the flow analysis439; should catch this and build the lifetime based on the440; markers only.441 442;CHECK-LABEL: while_loop:443;YESCOLOR: subq $1032, %rsp444;NOFIRSTUSE: subq $1544, %rsp445;NOCOLOR: subq $1544, %rsp446 447define i32 @while_loop(i32 %x) #0 {448entry:449 %b1 = alloca [128 x i32], align 16450 %b2 = alloca [128 x i32], align 16451 %b3 = alloca [128 x i32], align 16452 call void @llvm.lifetime.start.p0(i64 512, ptr %b1) #3453 call void @llvm.lifetime.start.p0(i64 512, ptr %b2) #3454 %and = and i32 %x, 1455 %tobool = icmp eq i32 %and, 0456 br i1 %tobool, label %if.else, label %if.then457 458if.then: ; preds = %entry459 call void @inita(ptr %b2) #3460 br label %if.end461 462if.else: ; preds = %entry463 call void @inita(ptr %b1) #3464 call void @inita(ptr %b3) #3465 %tobool25 = icmp eq i32 %x, 0466 br i1 %tobool25, label %if.end, label %while.body.lr.ph467 468while.body.lr.ph: ; preds = %if.else469 br label %while.body470 471while.body: ; preds = %while.body.lr.ph, %while.body472 %x.addr.06 = phi i32 [ %x, %while.body.lr.ph ], [ %dec, %while.body ]473 %dec = add nsw i32 %x.addr.06, -1474 call void @llvm.lifetime.start.p0(i64 512, ptr %b3) #3475 call void @inita(ptr %b3) #3476 call void @llvm.lifetime.end.p0(i64 512, ptr %b3) #3477 %tobool2 = icmp eq i32 %dec, 0478 br i1 %tobool2, label %if.end.loopexit, label %while.body479 480if.end.loopexit: ; preds = %while.body481 br label %if.end482 483if.end: ; preds = %if.end.loopexit, %if.else, %if.then484 call void @llvm.lifetime.end.p0(i64 512, ptr %b2) #3485 call void @llvm.lifetime.end.p0(i64 512, ptr %b1) #3486 ret i32 0487}488 489; Test case motivated by PR27903. Same routine inlined multiple times490; into a caller results in a multi-segment lifetime, but the second491; lifetime has no explicit references to the stack slot. Such slots492; have to be treated conservatively.493 494;CHECK-LABEL: twobod_b27903:495;YESCOLOR: subq $96, %rsp496;NOFIRSTUSE: subq $96, %rsp497;NOCOLOR: subq $96, %rsp498 499define i32 @twobod_b27903(i32 %y, i32 %x) {500entry:501 %buffer.i = alloca [12 x i32], align 16502 %abc = alloca [12 x i32], align 16503 call void @llvm.lifetime.start.p0(i64 48, ptr %buffer.i)504 %idxprom.i = sext i32 %y to i64505 %arrayidx.i = getelementptr inbounds [12 x i32], ptr %buffer.i, i64 0, i64 %idxprom.i506 call void @inita(ptr %arrayidx.i)507 %add.i = add nsw i32 %x, %y508 call void @llvm.lifetime.end.p0(i64 48, ptr %buffer.i)509 %tobool = icmp eq i32 %y, 0510 br i1 %tobool, label %if.end, label %if.then511 512if.then: ; preds = %entry513 call void @llvm.lifetime.start.p0(i64 48, ptr %abc)514 %arrayidx = getelementptr inbounds [12 x i32], ptr %abc, i64 0, i64 %idxprom.i515 call void @inita(ptr %arrayidx)516 call void @llvm.lifetime.start.p0(i64 48, ptr %buffer.i)517 call void @inita(ptr %arrayidx.i)518 %add.i9 = add nsw i32 %add.i, %y519 call void @llvm.lifetime.end.p0(i64 48, ptr %buffer.i)520 call void @llvm.lifetime.end.p0(i64 48, ptr %abc)521 br label %if.end522 523if.end: ; preds = %if.then, %entry524 %x.addr.0 = phi i32 [ %add.i9, %if.then ], [ %add.i, %entry ]525 ret i32 %x.addr.0526}527 528;CHECK-LABEL: multi_segment:529;YESCOLOR: subq $256, %rsp530;NOFIRSTUSE: subq $256, %rsp531;NOCOLOR: subq $512, %rsp532define i1 @multi_segment(i1, i1)533{534entry-block:535 %foo = alloca [32 x i64]536 %bar = alloca [32 x i64]537 call void @llvm.lifetime.start.p0(i64 256, ptr %bar)538 call void @baz(ptr %bar, i32 1)539 call void @llvm.lifetime.end.p0(i64 256, ptr %bar)540 call void @llvm.lifetime.start.p0(i64 256, ptr %foo)541 call void @baz(ptr %foo, i32 1)542 call void @llvm.lifetime.end.p0(i64 256, ptr %foo)543 call void @llvm.lifetime.start.p0(i64 256, ptr %bar)544 call void @baz(ptr %bar, i32 1)545 call void @llvm.lifetime.end.p0(i64 256, ptr %bar)546 ret i1 true547}548 549;CHECK-LABEL: pr32488:550;YESCOLOR: subq $256, %rsp551;NOFIRSTUSE: subq $256, %rsp552;NOCOLOR: subq $512, %rsp553define i1 @pr32488(i1, i1)554{555entry-block:556 %foo = alloca [32 x i64]557 %bar = alloca [32 x i64]558 br i1 %0, label %if_false, label %if_true559if_false:560 call void @llvm.lifetime.start.p0(i64 256, ptr %bar)561 call void @baz(ptr %bar, i32 0)562 br i1 %1, label %if_false.1, label %onerr563if_false.1:564 call void @llvm.lifetime.end.p0(i64 256, ptr %bar)565 br label %merge566if_true:567 call void @llvm.lifetime.start.p0(i64 256, ptr %foo)568 call void @baz(ptr %foo, i32 1)569 br i1 %1, label %if_true.1, label %onerr570if_true.1:571 call void @llvm.lifetime.end.p0(i64 256, ptr %foo)572 br label %merge573merge:574 ret i1 false575onerr:576 call void @llvm.lifetime.end.p0(i64 256, ptr %foo)577 call void @llvm.lifetime.end.p0(i64 256, ptr %bar)578 call void @destructor()579 ret i1 true580}581 582%Data = type { [32 x i64] }583 584declare void @destructor()585 586declare void @inita(ptr)587 588declare void @initb(ptr,ptr,ptr)589 590declare void @bar(ptr , ptr) nounwind591 592declare void @baz(ptr, i32)593 594declare void @llvm.lifetime.start.p0(i64, ptr nocapture) nounwind595 596declare void @llvm.lifetime.end.p0(i64, ptr nocapture) nounwind597 598declare i32 @foo(i32, ptr)599