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