brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.9 KiB · 51bfa15 Raw
958 lines · plain
1; RUN: opt -passes='print<stack-lifetime><may>' -disable-output %s 2>&1 | FileCheck %s --check-prefixes=CHECK,MAY2; RUN: opt -passes='print<stack-lifetime><must>' -disable-output %s 2>&1 | FileCheck %s --check-prefixes=CHECK,MUST3 4define void @f() {5; CHECK-LABEL: define void @f()6entry:7; CHECK: entry:8; CHECK-NEXT: Alive: <>9  %x = alloca i32, align 410  %y = alloca i32, align 411; CHECK: %y = alloca i32, align 412; CHECK-NEXT: Alive: <>13  %z = alloca i32, align 414  call void @llvm.lifetime.start.p0(ptr %z)15; CHECK: call void @llvm.lifetime.start.p0(ptr %z)16; CHECK-NEXT: Alive: <z>17 18  call void @llvm.lifetime.start.p0(ptr %x)19; CHECK: call void @llvm.lifetime.start.p0(ptr %x)20; CHECK-NEXT: Alive: <x z>21 22  call void @capture32(ptr %x)23  call void @llvm.lifetime.end.p0(ptr %x)24; CHECK: call void @llvm.lifetime.end.p0(ptr %x)25; CHECK-NEXT: Alive: <z>26 27  call void @llvm.lifetime.start.p0(ptr %y)28; CHECK: call void @llvm.lifetime.start.p0(ptr %y)29; CHECK-NEXT: Alive: <y z>30 31  call void @capture32(ptr %y)32  call void @llvm.lifetime.end.p0(ptr %y)33; CHECK: call void @llvm.lifetime.end.p0(ptr %y)34; CHECK-NEXT: Alive: <z>35 36  call void @capture32(ptr %z)37  call void @llvm.lifetime.end.p0(ptr %z)38; CHECK: call void @llvm.lifetime.end.p0(ptr %z)39; CHECK-NEXT: Alive: <>40 41  ret void42}43 44define void @no_markers() {45; CHECK-LABEL: define void @no_markers()46entry:47; CHECK: entry:48; CHECK-NEXT: Alive: <y>49  %x = alloca i32, align 450  %y = alloca i32, align 451  call void @llvm.lifetime.start.p0(ptr %x)52; CHECK: call void @llvm.lifetime.start.p0(ptr %x)53; CHECK-NEXT: Alive: <x y>54 55  call void @capture32(ptr %x)56  call void @llvm.lifetime.end.p0(ptr %x)57; CHECK: call void @llvm.lifetime.end.p0(ptr %x)58; CHECK-NEXT: Alive: <y>59 60  call void @capture32(ptr %y)61  ret void62}63 64define void @g() {65; CHECK-LABEL: define void @g()66entry:67; CHECK: entry:68; CHECK-NEXT: Alive: <>69  %x = alloca i32, align 470  %y = alloca i32, align 471  %z = alloca i64, align 472  call void @llvm.lifetime.start.p0(ptr %x)73; CHECK: call void @llvm.lifetime.start.p0(ptr %x)74; CHECK-NEXT: Alive: <x>75 76  call void @llvm.lifetime.start.p0(ptr %y)77; CHECK: call void @llvm.lifetime.start.p0(ptr %y)78; CHECK-NEXT: Alive: <x y>79 80  call void @capture32(ptr %x)81  call void @llvm.lifetime.end.p0(ptr %x)82; CHECK: call void @llvm.lifetime.end.p0(ptr %x)83; CHECK-NEXT: Alive: <y>84 85  call void @capture32(ptr %y)86  call void @llvm.lifetime.end.p0(ptr %y)87; CHECK: call void @llvm.lifetime.end.p0(ptr %y)88; CHECK-NEXT: Alive: <>89 90  call void @llvm.lifetime.start.p0(ptr %z)91; CHECK: call void @llvm.lifetime.start.p0(ptr %z)92; CHECK-NEXT: Alive: <z>93 94  call void @capture64(ptr %z)95  call void @llvm.lifetime.end.p0(ptr %z)96; CHECK: call void @llvm.lifetime.end.p0(ptr %z)97; CHECK-NEXT: Alive: <>98 99  ret void100; CHECK: ret void101; CHECK-NEXT: Alive: <>102}103 104define void @h() {105; CHECK-LABEL: define void @h()106entry:107; CHECK: entry:108; CHECK-NEXT: Alive: <>109  %x = alloca i32, align 16110; CHECK: %x = alloca i32, align 16111; CHECK-NEXT: Alive: <>112  %z = alloca i64, align 4113  %y = alloca i32, align 4114  call void @llvm.lifetime.start.p0(ptr %x)115; CHECK: call void @llvm.lifetime.start.p0(ptr %x)116; CHECK-NEXT: Alive: <x>117 118  call void @llvm.lifetime.start.p0(ptr %y)119; CHECK: call void @llvm.lifetime.start.p0(ptr %y)120; CHECK-NEXT: Alive: <x y>121 122  call void @llvm.lifetime.start.p0(ptr %z)123; CHECK: call void @llvm.lifetime.start.p0(ptr %z)124; CHECK-NEXT: Alive: <x y z>125 126  call void @capture32(ptr %x)127  call void @capture32(ptr %y)128  call void @capture64(ptr %z)129  call void @llvm.lifetime.end.p0(ptr %x)130; CHECK: call void @llvm.lifetime.end.p0(ptr %x)131; CHECK-NEXT: Alive: <y z>132 133  call void @llvm.lifetime.end.p0(ptr %y)134; CHECK: call void @llvm.lifetime.end.p0(ptr %y)135; CHECK-NEXT: Alive: <z>136 137  call void @llvm.lifetime.end.p0(ptr %z)138; CHECK: call void @llvm.lifetime.end.p0(ptr %z)139; CHECK-NEXT: Alive: <>140 141  ret void142}143 144define void @i(i1 zeroext %a, i1 zeroext %b) {145; CHECK-LABEL: define void @i(i1 zeroext %a, i1 zeroext %b)146entry:147; CHECK: entry:148; CHECK-NEXT: Alive: <>149  %x1 = alloca i64, align 8150  %x2 = alloca i64, align 8151  %y = alloca i64, align 8152  %y1 = alloca i64, align 8153  %y2 = alloca i64, align 8154  %z = alloca i64, align 8155  %z1 = alloca i64, align 8156  %z2 = alloca i64, align 8157  call void @llvm.lifetime.start.p0(ptr %x1)158; CHECK: call void @llvm.lifetime.start.p0(ptr %x1)159; CHECK-NEXT: Alive: <x1>160 161  call void @llvm.lifetime.start.p0(ptr %x2)162; CHECK: call void @llvm.lifetime.start.p0(ptr %x2)163; CHECK-NEXT: Alive: <x1 x2>164 165  call void @capture64(ptr nonnull %x1)166  call void @capture64(ptr nonnull %x2)167  br i1 %a, label %if.then, label %if.else4168; CHECK: br i1 %a, label %if.then, label %if.else4169; CHECK-NEXT: Alive: <x1 x2>170 171if.then:                                          ; preds = %entry172; CHECK: if.then:173; CHECK-NEXT: Alive: <x1 x2>174  call void @llvm.lifetime.start.p0(ptr %y)175; CHECK: call void @llvm.lifetime.start.p0(ptr %y)176; CHECK-NEXT: Alive: <x1 x2 y>177 178  call void @capture64(ptr nonnull %y)179  br i1 %b, label %if.then3, label %if.else180 181if.then3:                                         ; preds = %if.then182; CHECK: if.then3:183; CHECK-NEXT: Alive: <x1 x2 y>184  call void @llvm.lifetime.start.p0(ptr %y1)185; CHECK: call void @llvm.lifetime.start.p0(ptr %y1)186; CHECK-NEXT: Alive: <x1 x2 y y1>187 188  call void @capture64(ptr nonnull %y1)189  call void @llvm.lifetime.end.p0(ptr %y1)190; CHECK: call void @llvm.lifetime.end.p0(ptr %y1)191; CHECK-NEXT: Alive: <x1 x2 y>192 193  br label %if.end194 195if.else:                                          ; preds = %if.then196; CHECK: if.else:197; CHECK-NEXT: Alive: <x1 x2 y>198  call void @llvm.lifetime.start.p0(ptr %y2)199; CHECK: call void @llvm.lifetime.start.p0(ptr %y2)200; CHECK-NEXT: Alive: <x1 x2 y y2>201 202  call void @capture64(ptr nonnull %y2)203  call void @llvm.lifetime.end.p0(ptr %y2)204; CHECK: call void @llvm.lifetime.end.p0(ptr %y2)205; CHECK-NEXT: Alive: <x1 x2 y>206 207  br label %if.end208 209if.end:                                           ; preds = %if.else, %if.then3210; CHECK: if.end:211; CHECK-NEXT: Alive: <x1 x2 y>212  call void @llvm.lifetime.end.p0(ptr %y)213; CHECK: call void @llvm.lifetime.end.p0(ptr %y)214; CHECK-NEXT: Alive: <x1 x2>215 216  br label %if.end9217 218if.else4:                                         ; preds = %entry219; CHECK: if.else4:220; CHECK-NEXT: Alive: <x1 x2>221  %z.cast = bitcast ptr %z to ptr222; CHECK: %z.cast = bitcast ptr %z to ptr223; CHECK-NEXT: Alive: <x1 x2>224 225  call void @llvm.lifetime.start.p0(ptr %z)226; CHECK: call void @llvm.lifetime.start.p0(ptr %z)227; CHECK-NEXT: Alive: <x1 x2 z>228 229  call void @capture64(ptr nonnull %z)230  br i1 %b, label %if.then6, label %if.else7231 232if.then6:                                         ; preds = %if.else4233; CHECK: if.then6:234; CHECK-NEXT: Alive: <x1 x2 z>235  call void @llvm.lifetime.start.p0(ptr %z1)236; CHECK: call void @llvm.lifetime.start.p0(ptr %z1)237; CHECK-NEXT: Alive: <x1 x2 z z1>238 239  call void @capture64(ptr nonnull %z1)240  call void @llvm.lifetime.end.p0(ptr %z1)241; CHECK: call void @llvm.lifetime.end.p0(ptr %z1)242; CHECK-NEXT: Alive: <x1 x2 z>243 244  br label %if.end8245 246if.else7:                                         ; preds = %if.else4247; CHECK: if.else7:248; CHECK-NEXT: Alive: <x1 x2 z>249  call void @llvm.lifetime.start.p0(ptr %z2)250; CHECK: call void @llvm.lifetime.start.p0(ptr %z2)251; CHECK-NEXT: Alive: <x1 x2 z z2>252 253  call void @capture64(ptr nonnull %z2)254  call void @llvm.lifetime.end.p0(ptr %z2)255; CHECK: call void @llvm.lifetime.end.p0(ptr %z2)256; CHECK-NEXT: Alive: <x1 x2 z>257 258  br label %if.end8259 260if.end8:                                          ; preds = %if.else7, %if.then6261; CHECK: if.end8:262; CHECK-NEXT: Alive: <x1 x2 z>263  call void @llvm.lifetime.end.p0(ptr %z)264; CHECK: call void @llvm.lifetime.end.p0(ptr %z)265; CHECK-NEXT: Alive: <x1 x2>266 267  br label %if.end9268 269if.end9:                                          ; preds = %if.end8, %if.end270; CHECK: if.end9:271; CHECK-NEXT: Alive: <x1 x2>272  call void @llvm.lifetime.end.p0(ptr %x2)273; CHECK: call void @llvm.lifetime.end.p0(ptr %x2)274; CHECK-NEXT: Alive: <x1>275 276  call void @llvm.lifetime.end.p0(ptr %x1)277; CHECK: call void @llvm.lifetime.end.p0(ptr %x1)278; CHECK-NEXT: Alive: <>279 280  ret void281}282 283define void @no_merge1(i1 %d) {284; CHECK-LABEL: define void @no_merge1(i1 %d)285entry:286; CHECK: entry:287; CHECK-NEXT: Alive: <>288  %x = alloca i32, align 4289  %y = alloca i32, align 4290  call void @llvm.lifetime.start.p0(ptr %x)291; CHECK: call void @llvm.lifetime.start.p0(ptr %x)292; CHECK-NEXT: Alive: <x>293 294  call void @capture32(ptr %x)295  br i1 %d, label %bb2, label %bb3296 297bb2:                                              ; preds = %entry298; CHECK: bb2:299; CHECK-NEXT: Alive: <x>300  call void @llvm.lifetime.start.p0(ptr %y)301; CHECK: call void @llvm.lifetime.start.p0(ptr %y)302; CHECK-NEXT: Alive: <x y>303 304  call void @capture32(ptr %y)305  call void @llvm.lifetime.end.p0(ptr %y)306; CHECK: call void @llvm.lifetime.end.p0(ptr %y)307; CHECK-NEXT: Alive: <x>308 309  call void @llvm.lifetime.end.p0(ptr %x)310; CHECK: call void @llvm.lifetime.end.p0(ptr %x)311; CHECK-NEXT: Alive: <>312 313  ret void314 315bb3:                                              ; preds = %entry316; CHECK: bb3:317; CHECK-NEXT: Alive: <x>318  call void @llvm.lifetime.end.p0(ptr %x)319; CHECK: call void @llvm.lifetime.end.p0(ptr %x)320; CHECK-NEXT: Alive: <>321 322  ret void323}324 325define void @merge1(i1 %d) {326; CHECK-LABEL: define void @merge1(i1 %d)327entry:328; CHECK: entry:329; CHECK-NEXT: Alive: <>330  %x = alloca i32, align 4331  %y = alloca i32, align 4332  call void @llvm.lifetime.start.p0(ptr %x)333; CHECK: call void @llvm.lifetime.start.p0(ptr %x)334; CHECK-NEXT: Alive: <x>335 336  call void @capture32(ptr %x)337  call void @llvm.lifetime.end.p0(ptr %x)338; CHECK: call void @llvm.lifetime.end.p0(ptr %x)339; CHECK-NEXT: Alive: <>340 341  br i1 %d, label %bb2, label %bb3342 343bb2:                                              ; preds = %entry344; CHECK: bb2:345; CHECK-NEXT: Alive: <>346  call void @llvm.lifetime.start.p0(ptr %y)347; CHECK: call void @llvm.lifetime.start.p0(ptr %y)348; CHECK-NEXT: Alive: <y>349 350  call void @capture32(ptr %y)351  call void @llvm.lifetime.end.p0(ptr %y)352; CHECK: call void @llvm.lifetime.end.p0(ptr %y)353; CHECK-NEXT: Alive: <>354 355  ret void356 357bb3:                                              ; preds = %entry358; CHECK: bb3:359; CHECK-NEXT: Alive: <>360  ret void361}362 363define void @merge2_noend(i1 %d) {364; CHECK-LABEL: define void @merge2_noend(i1 %d)365entry:366; CHECK: entry:367; CHECK-NEXT: Alive: <>368  %x = alloca i32, align 4369  %y = alloca i32, align 4370  call void @llvm.lifetime.start.p0(ptr %x)371; CHECK: call void @llvm.lifetime.start.p0(ptr %x)372; CHECK-NEXT: Alive: <x>373 374  call void @capture32(ptr %x)375  call void @llvm.lifetime.end.p0(ptr %x)376; CHECK: call void @llvm.lifetime.end.p0(ptr %x)377; CHECK-NEXT: Alive: <>378 379  br i1 %d, label %bb2, label %bb3380 381bb2:                                              ; preds = %entry382; CHECK: bb2:383; CHECK-NEXT: Alive: <>384  call void @llvm.lifetime.start.p0(ptr %y)385; CHECK: call void @llvm.lifetime.start.p0(ptr %y)386; CHECK-NEXT: Alive: <y>387 388  call void @capture32(ptr %y)389  ret void390 391bb3:                                              ; preds = %entry392; CHECK: bb3:393; CHECK-NEXT: Alive: <>394  ret void395}396 397define void @merge3_noend(i1 %d) {398; CHECK-LABEL: define void @merge3_noend(i1 %d)399entry:400; CHECK: entry:401; CHECK-NEXT: Alive: <>402  %x = alloca i32, align 4403  %y = alloca i32, align 4404  call void @llvm.lifetime.start.p0(ptr %x)405; CHECK: call void @llvm.lifetime.start.p0(ptr %x)406; CHECK-NEXT: Alive: <x>407 408  call void @capture32(ptr %x)409  br i1 %d, label %bb2, label %bb3410 411bb2:                                              ; preds = %entry412; CHECK: bb2:413; CHECK-NEXT: Alive: <x>414  call void @llvm.lifetime.end.p0(ptr %x)415; CHECK: call void @llvm.lifetime.end.p0(ptr %x)416; CHECK-NEXT: Alive: <>417 418  call void @llvm.lifetime.start.p0(ptr %y)419; CHECK: call void @llvm.lifetime.start.p0(ptr %y)420; CHECK-NEXT: Alive: <y>421 422  call void @capture32(ptr %y)423  ret void424 425bb3:                                              ; preds = %entry426; CHECK: bb3:427; CHECK-NEXT: Alive: <x>428  ret void429}430 431define void @nomerge4_nostart(i1 %d) {432; CHECK-LABEL: define void @nomerge4_nostart(i1 %d)433entry:434; CHECK: entry:435; CHECK-NEXT: Alive: <x>436  %x = alloca i32, align 4437  %y = alloca i32, align 4438  call void @capture32(ptr %x)439  call void @llvm.lifetime.end.p0(ptr %x)440; CHECK: call void @llvm.lifetime.end.p0(ptr %x)441; CHECK-NEXT: Alive: <x>442 443  br i1 %d, label %bb2, label %bb3444 445bb2:                                              ; preds = %entry446; CHECK: bb2:447; CHECK-NEXT: Alive: <x>448  call void @llvm.lifetime.start.p0(ptr %y)449; CHECK: call void @llvm.lifetime.start.p0(ptr %y)450; CHECK-NEXT: Alive: <x y>451 452  call void @capture32(ptr %y)453  ret void454 455bb3:                                              ; preds = %entry456; CHECK: bb3:457; CHECK-NEXT: Alive: <x>458  ret void459}460 461define void @array_merge() {462; CHECK-LABEL: define void @array_merge()463entry:464; CHECK: entry:465; CHECK-NEXT: Alive: <>466  %A.i1 = alloca [100 x i32], align 4467  %B.i2 = alloca [100 x i32], align 4468  %A.i = alloca [100 x i32], align 4469  %B.i = alloca [100 x i32], align 4470  call void @llvm.lifetime.start.p0(ptr %A.i)471; CHECK: call void @llvm.lifetime.start.p0(ptr %A.i)472; CHECK-NEXT: Alive: <A.i>473 474  call void @llvm.lifetime.start.p0(ptr %B.i)475; CHECK: call void @llvm.lifetime.start.p0(ptr %B.i)476; CHECK-NEXT: Alive: <A.i B.i>477 478  call void @capture100x32(ptr %A.i)479; CHECK: call void @capture100x32(ptr %A.i)480; CHECK-NEXT: Alive: <A.i B.i>481 482  call void @capture100x32(ptr %B.i)483  call void @llvm.lifetime.end.p0(ptr %A.i)484; CHECK: call void @llvm.lifetime.end.p0(ptr %A.i)485; CHECK-NEXT: Alive: <B.i>486 487  call void @llvm.lifetime.end.p0(ptr %B.i)488; CHECK: call void @llvm.lifetime.end.p0(ptr %B.i)489; CHECK-NEXT: Alive: <>490 491  call void @llvm.lifetime.start.p0(ptr %A.i1)492; CHECK: call void @llvm.lifetime.start.p0(ptr %A.i1)493; CHECK-NEXT: Alive: <A.i1>494 495  call void @llvm.lifetime.start.p0(ptr %B.i2)496; CHECK: call void @llvm.lifetime.start.p0(ptr %B.i2)497; CHECK-NEXT: Alive: <A.i1 B.i2>498 499  call void @capture100x32(ptr %A.i1)500  call void @capture100x32(ptr %B.i2)501  call void @llvm.lifetime.end.p0(ptr %A.i1)502; CHECK: call void @llvm.lifetime.end.p0(ptr %A.i1)503; CHECK-NEXT: Alive: <B.i2>504 505  call void @llvm.lifetime.end.p0(ptr %B.i2)506; CHECK: call void @llvm.lifetime.end.p0(ptr %B.i2)507; CHECK-NEXT: Alive: <>508 509  ret void510}511 512define void @myCall_pr15707() {513; CHECK-LABEL: define void @myCall_pr15707()514entry:515; CHECK: entry:516; CHECK-NEXT: Alive: <>517  %buf1 = alloca i8, i32 100000, align 16518  %buf2 = alloca i8, i32 100000, align 16519  call void @llvm.lifetime.start.p0(ptr %buf1)520; CHECK: call void @llvm.lifetime.start.p0(ptr %buf1)521; CHECK-NEXT: Alive: <buf1>522 523  call void @llvm.lifetime.end.p0(ptr %buf1)524; CHECK: call void @llvm.lifetime.end.p0(ptr %buf1)525; CHECK-NEXT: Alive: <>526 527  call void @llvm.lifetime.start.p0(ptr %buf1)528; CHECK: call void @llvm.lifetime.start.p0(ptr %buf1)529; CHECK-NEXT: Alive: <buf1>530 531  call void @llvm.lifetime.start.p0(ptr %buf2)532; CHECK: call void @llvm.lifetime.start.p0(ptr %buf2)533; CHECK-NEXT: Alive: <buf1 buf2>534 535  call void @capture8(ptr %buf1)536  call void @capture8(ptr %buf2)537  ret void538}539 540define void @bad_range() {541; CHECK-LABEL: define void @bad_range()542entry:543; CHECK: entry:544; CHECK-NEXT: Alive: <A.i1 B.i2>545  %A.i1 = alloca [100 x i32], align 4546  %B.i2 = alloca [100 x i32], align 4547  %A.i = alloca [100 x i32], align 4548  %B.i = alloca [100 x i32], align 4549  call void @llvm.lifetime.start.p0(ptr %A.i)550; CHECK: call void @llvm.lifetime.start.p0(ptr %A.i)551; CHECK-NEXT: Alive: <A.i A.i1 B.i2>552 553  call void @llvm.lifetime.start.p0(ptr %B.i)554; CHECK: call void @llvm.lifetime.start.p0(ptr %B.i)555; CHECK-NEXT: Alive: <A.i A.i1 B.i B.i2>556 557  call void @capture100x32(ptr %A.i)558  call void @capture100x32(ptr %B.i)559  call void @llvm.lifetime.end.p0(ptr %A.i)560; CHECK: call void @llvm.lifetime.end.p0(ptr %A.i)561; CHECK-NEXT: Alive: <A.i1 B.i B.i2>562 563  call void @llvm.lifetime.end.p0(ptr %B.i)564; CHECK: call void @llvm.lifetime.end.p0(ptr %B.i)565; CHECK-NEXT: Alive: <A.i1 B.i2>566 567  br label %block2568 569block2:                                           ; preds = %entry570; CHECK: block2:571; CHECK-NEXT: Alive: <A.i1 B.i2>572  call void @capture100x32(ptr %A.i)573  call void @capture100x32(ptr %B.i)574  ret void575}576 577%struct.Klass = type { i32, i32 }578 579define i32 @shady_range(i32 %argc, ptr captures(none) %argv) {580; CHECK-LABEL: define i32 @shady_range(i32 %argc, ptr captures(none) %argv)581entry:582; CHECK: entry:583; CHECK-NEXT: Alive: <>584  %a.i = alloca [4 x %struct.Klass], align 16585  %b.i = alloca [4 x %struct.Klass], align 16586  call void @llvm.lifetime.start.p0(ptr %a.i)587; CHECK: call void @llvm.lifetime.start.p0(ptr %a.i)588; CHECK-NEXT: Alive: <a.i>589 590  call void @llvm.lifetime.start.p0(ptr %b.i)591; CHECK: call void @llvm.lifetime.start.p0(ptr %b.i)592; CHECK-NEXT: Alive: <a.i b.i>593 594  call void @capture8(ptr %a.i)595  call void @capture8(ptr %b.i)596  %z3 = load i32, ptr %a.i, align 16597  call void @llvm.lifetime.end.p0(ptr %a.i)598; CHECK: call void @llvm.lifetime.end.p0(ptr %a.i)599; CHECK-NEXT: Alive: <b.i>600 601  call void @llvm.lifetime.end.p0(ptr %b.i)602; CHECK: call void @llvm.lifetime.end.p0(ptr %b.i)603; CHECK-NEXT: Alive: <>604 605  ret i32 %z3606}607 608define void @end_loop() {609; CHECK-LABEL: define void @end_loop()610entry:611; CHECK: entry:612; CHECK-NEXT: Alive: <>613  %x = alloca i8, align 4614  call void @llvm.lifetime.start.p0(ptr %x)615; CHECK: call void @llvm.lifetime.start.p0(ptr %x)616; CHECK-NEXT: Alive: <x>617 618  br label %l2619 620l2:                                               ; preds = %l2, %entry621; CHECK: l2:622; MAY-NEXT: Alive: <x>623; MUST-NEXT: Alive: <>624  call void @capture8(ptr %x)625  call void @llvm.lifetime.end.p0(ptr %x)626; CHECK: call void @llvm.lifetime.end.p0(ptr %x)627; CHECK-NEXT: Alive: <>628 629  br label %l2630}631 632define void @start_loop() {633; CHECK-LABEL: define void @start_loop()634entry:635; CHECK: entry:636; CHECK-NEXT: Alive: <>637  %x = alloca i8, align 4638  %y = alloca i8, align 4639  call void @llvm.lifetime.start.p0(ptr %x)640; CHECK: call void @llvm.lifetime.start.p0(ptr %x)641; CHECK-NEXT: Alive: <x>642 643  br label %l2644 645l2:                                               ; preds = %l2, %entry646; CHECK: l2:647; CHECK-NEXT: Alive: <x>648  call void @llvm.lifetime.start.p0(ptr %y)649; CHECK: call void @llvm.lifetime.start.p0(ptr %y)650; CHECK-NEXT: Alive: <x y>651 652  call void @capture8(ptr %y)653  call void @llvm.lifetime.end.p0(ptr %y)654; CHECK: call void @llvm.lifetime.end.p0(ptr %y)655; CHECK-NEXT: Alive: <x>656 657  call void @llvm.lifetime.start.p0(ptr %x)658; CHECK: call void @llvm.lifetime.start.p0(ptr %x)659; CHECK-NEXT: Alive: <x>660 661  call void @capture8(ptr %x)662  br label %l2663}664 665%struct.char_array = type { [500 x i8] }666 667define dso_local void @gep_test(i32 %cond)  {668; CHECK-LABEL: define dso_local void @gep_test669entry:670; CHECK: entry:671; CHECK-NEXT: Alive: <>672  %a = alloca %struct.char_array, align 8673  %b = alloca %struct.char_array, align 8674  %tobool.not = icmp eq i32 %cond, 0675  br i1 %tobool.not, label %if.else, label %if.then676 677if.then:                                          ; preds = %entry678; CHECK: if.then:679; CHECK-NEXT: Alive: <>680  call void @llvm.lifetime.start.p0(ptr nonnull %a)681; CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %a)682; CHECK-NEXT: Alive: <a>683  tail call void @capture8(ptr %a)684  call void @llvm.lifetime.end.p0(ptr nonnull %a)685; CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %a)686; CHECK-NEXT: Alive: <>687  br label %if.end688 689if.else:                                          ; preds = %entry690; CHECK: if.else:691; CHECK-NEXT: Alive: <>692  call void @llvm.lifetime.start.p0(ptr nonnull %b)693; CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %b)694; CHECK-NEXT: Alive: <b>695  tail call void @capture8(ptr %b)696  call void @llvm.lifetime.end.p0(ptr nonnull %b)697; CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %b)698; CHECK-NEXT: Alive: <>699  br label %if.end700 701if.end:                                           ; preds = %if.else, %if.then702; CHECK: if.end:703; CHECK-NEXT: Alive: <>704  ret void705}706 707define void @if_must(i1 %a) {708; CHECK-LABEL: define void @if_must709entry:710; CHECK: entry:711; CHECK-NEXT: Alive: <>712  %x = alloca i8, align 4713  %y = alloca i8, align 4714 715  br i1 %a, label %if.then, label %if.else716; CHECK: br i1 %a, label %if.then, label %if.else717; CHECK-NEXT: Alive: <>718 719if.then:720; CHECK: if.then:721; CHECK-NEXT: Alive: <>722  call void @llvm.lifetime.start.p0(ptr %y)723; CHECK: call void @llvm.lifetime.start.p0(ptr %y)724; CHECK-NEXT: Alive: <y>725 726  br label %if.end727; CHECK: br label %if.end728; CHECK-NEXT: Alive: <y>729 730if.else:731; CHECK: if.else:732; CHECK-NEXT: Alive: <>733  call void @llvm.lifetime.start.p0(ptr %y)734; CHECK: call void @llvm.lifetime.start.p0(ptr %y)735; CHECK-NEXT: Alive: <y>736 737  call void @llvm.lifetime.start.p0(ptr %x)738; CHECK: call void @llvm.lifetime.start.p0(ptr %x)739; CHECK-NEXT: Alive: <x y>740 741  br label %if.end742; CHECK: br label %if.end743; CHECK-NEXT: Alive: <x y>744 745if.end:746; CHECK: if.end:747; MAY-NEXT: Alive: <x y>748; MUST-NEXT: Alive: <y>749 750  ret void751}752 753define void @unreachable() {754; CHECK-LABEL: define void @unreachable755entry:756; CHECK: entry:757; CHECK-NEXT: Alive: <>758  %x = alloca i8, align 4759  %y = alloca i8, align 4760 761  call void @llvm.lifetime.start.p0(ptr %y)762; CHECK: call void @llvm.lifetime.start.p0(ptr %y)763; CHECK-NEXT: Alive: <y>764 765  call void @llvm.lifetime.start.p0(ptr %x)766; CHECK: call void @llvm.lifetime.start.p0(ptr %x)767; CHECK-NEXT: Alive: <x y>768 769  br label %end770; CHECK: br label %end771; CHECK-NEXT: Alive: <x y>772 773dead:774; CHECK: dead:775; CHECK-NOT: Alive:776  call void @llvm.lifetime.start.p0(ptr %y)777 778  br label %end779; CHECK: br label %end780; CHECK-NOT: Alive:781 782end:783; CHECK: end:784; CHECK-NEXT: Alive: <x y>785 786  ret void787}788 789define void @multiple_start_end() {790; CHECK-LABEL: define void @multiple_start_end791entry:792; CHECK: entry:793; CHECK-NEXT: Alive: <>794  %x = alloca i8795  call void @llvm.lifetime.start.p0(ptr %x)796; CHECK: call void @llvm.lifetime.start.p0(ptr %x)797; CHECK-NEXT: Alive: <x>798 799  call void @llvm.lifetime.start.p0(ptr %x)800; CHECK: call void @llvm.lifetime.start.p0(ptr %x)801; CHECK-NEXT: Alive: <x>802 803  call void @llvm.lifetime.end.p0(ptr %x)804; CHECK: call void @llvm.lifetime.end.p0(ptr %x)805; CHECK-NEXT: Alive: <>806 807  call void @llvm.lifetime.end.p0(ptr %x)808; CHECK: call void @llvm.lifetime.end.p0(ptr %x)809; CHECK-NEXT: Alive: <>810 811  ret void812}813 814define void @if_must1(i1 %a) {815; CHECK-LABEL: define void @if_must1816entry:817; CHECK: entry:818; CHECK-NEXT: Alive: <>819  %x = alloca i8, align 4820  %y = alloca i8, align 4821 822  br i1 %a, label %if.then, label %if.else823; CHECK: br i1 %a, label %if.then, label %if.else824; CHECK-NEXT: Alive: <>825 826if.then:827; CHECK: if.then:828; MAY-NEXT: Alive: <x y>829; MUST-NEXT: Alive: <>830  call void @llvm.lifetime.end.p0(ptr %y)831; CHECK: call void @llvm.lifetime.end.p0(ptr %y)832; MAY-NEXT: Alive: <x>833; MUST-NEXT: Alive: <>834 835  br label %if.end836; CHECK: br label %if.end837; MAY-NEXT: Alive: <x>838; MUST-NEXT: Alive: <>839 840if.else:841; CHECK: if.else:842; CHECK-NEXT: Alive: <>843  call void @llvm.lifetime.start.p0(ptr %y)844; CHECK: call void @llvm.lifetime.start.p0(ptr %y)845; CHECK-NEXT: Alive: <y>846 847  call void @llvm.lifetime.start.p0(ptr %x)848; CHECK: call void @llvm.lifetime.start.p0(ptr %x)849; CHECK-NEXT: Alive: <x y>850 851  br label %if.then852; CHECK: br label %if.then853; CHECK-NEXT: Alive: <x y>854 855if.end:856; CHECK: if.end:857; MAY-NEXT: Alive: <x>858; MUST-NEXT: Alive: <>859 860  ret void861}862 863define void @if_must2(i1 %a) {864; CHECK-LABEL: define void @if_must2865entry:866; CHECK: entry:867; CHECK-NEXT: Alive: <>868  %x = alloca i8, align 4869  %y = alloca i8, align 4870 871  call void @llvm.lifetime.start.p0(ptr %x)872; CHECK: call void @llvm.lifetime.start.p0(ptr %x)873; CHECK-NEXT: Alive: <x>874 875  br i1 %a, label %if.then, label %if.else876; CHECK: br i1 %a, label %if.then, label %if.else877; CHECK-NEXT: Alive: <x>878 879if.then:880; CHECK: if.then:881; MAY-NEXT: Alive: <x>882; MUST-NEXT: Alive: <>883  call void @llvm.lifetime.start.p0(ptr %y)884; CHECK: call void @llvm.lifetime.start.p0(ptr %y)885; MAY-NEXT: Alive: <x y>886; MUST-NEXT: Alive: <y>887 888  br label %if.end889; CHECK: br label %if.end890; MAY-NEXT: Alive: <x y>891; MUST-NEXT: Alive: <y>892 893if.else:894; CHECK: if.else:895; CHECK-NEXT: Alive: <x>896  call void @llvm.lifetime.end.p0(ptr %y)897; CHECK: call void @llvm.lifetime.end.p0(ptr %y)898; CHECK-NEXT: Alive: <x>899 900  call void @llvm.lifetime.end.p0(ptr %x)901; CHECK: call void @llvm.lifetime.end.p0(ptr %x)902; CHECK-NEXT: Alive: <>903 904  br label %if.then905; CHECK: br label %if.then906; CHECK-NEXT: Alive: <>907 908if.end:909; CHECK: if.end:910; MAY-NEXT: Alive: <x y>911; MUST-NEXT: Alive: <y>912 913  ret void914}915 916define void @cycle(i1 %a) {917; CHECK-LABEL: define void @cycle918entry:919; CHECK: entry:920; CHECK-NEXT: Alive: <>921  %x = alloca i8, align 4922  %y = alloca i8, align 4923 924  call void @llvm.lifetime.start.p0(ptr %x)925; CHECK: call void @llvm.lifetime.start.p0(ptr %x)926; CHECK-NEXT: Alive: <x>927 928  br i1 %a, label %if.then, label %if.end929; CHECK: br i1 %a, label %if.then, label %if.end930; CHECK-NEXT: Alive: <x>931 932if.then:933; CHECK: if.then:934; MAY-NEXT: Alive: <x y>935; MUST-NEXT: Alive: <x>936  call void @llvm.lifetime.start.p0(ptr %y)937; CHECK: call void @llvm.lifetime.start.p0(ptr %y)938; CHECK-NEXT: Alive: <x y>939 940  br i1 %a, label %if.then, label %if.end941; CHECK: br i1 %a, label %if.then, label %if.end942; CHECK-NEXT: Alive: <x y>943 944if.end:945; CHECK: if.end:946; MAY-NEXT: Alive: <x y>947; MUST-NEXT: Alive: <x>948 949  ret void950}951 952declare void @llvm.lifetime.start.p0(ptr captures(none))953declare void @llvm.lifetime.end.p0(ptr captures(none))954declare void @capture8(ptr)955declare void @capture32(ptr)956declare void @capture64(ptr)957declare void @capture100x32(ptr)958