brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.8 KiB · db3e7dc Raw
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