89 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=internalize,ipsccp %s | FileCheck %s3; PR55694 5; If BasicBlocks are unreachable, IPSCCP should convert them to unreachable.6; Unless they have their address taken, delete them. If they do have their7; address taken, let other passes replace these "dead" blockaddresses with some8; other Constant.9 10; CHECK: @bar.l = internal constant [2 x ptr] [ptr blockaddress(@bar, %lab0), ptr blockaddress(@bar, %end)]11 12 13@code = global [5 x i32] [i32 0, i32 0, i32 0, i32 0, i32 1], align 4 ; <ptr> [#uses=0]14@bar.l = internal constant [2 x ptr] [ptr blockaddress(@bar, %lab0), ptr blockaddress(@bar, %end)] ; <ptr> [#uses=1]15 16define void @foo(i32 %x) nounwind readnone {17; CHECK-LABEL: @foo(18; CHECK-NEXT: entry:19; CHECK-NEXT: unreachable20;21entry:22 %b = alloca i32, align 4 ; <ptr> [#uses=1]23 store volatile i32 -1, ptr %b24 ret void25}26 27define void @bar(ptr nocapture %pc) nounwind readonly {28; CHECK-LABEL: @bar(29; CHECK-NEXT: entry:30; CHECK-NEXT: unreachable31; CHECK: lab0:32; CHECK-NEXT: unreachable33; CHECK: end:34; CHECK-NEXT: unreachable35;36entry:37 br label %indirectgoto38 39lab0: ; preds = %indirectgoto40 %indvar.next = add i32 %indvar, 1 ; <i32> [#uses=1]41 br label %indirectgoto42 43end: ; preds = %indirectgoto44 ret void45 46indirectgoto: ; preds = %lab0, %entry47 %indvar = phi i32 [ %indvar.next, %lab0 ], [ 0, %entry ] ; <i32> [#uses=2]48 %pc.addr.0 = getelementptr i32, ptr %pc, i32 %indvar ; <ptr> [#uses=1]49 %tmp1.pn = load i32, ptr %pc.addr.0 ; <i32> [#uses=1]50 %indirect.goto.dest.in = getelementptr inbounds [2 x ptr], ptr @bar.l, i32 0, i32 %tmp1.pn ; <ptr> [#uses=1]51 %indirect.goto.dest = load ptr, ptr %indirect.goto.dest.in ; <ptr> [#uses=1]52 indirectbr ptr %indirect.goto.dest, [label %lab0, label %end]53}54 55define i32 @main() nounwind readnone {56; CHECK-LABEL: @main(57; CHECK-NEXT: entry:58; CHECK-NEXT: unreachable59;60entry:61 ret i32 062}63 64; https://github.com/llvm/llvm-project/issues/5423865; https://github.com/llvm/llvm-project/issues/5425166; https://github.com/llvm/llvm-project/issues/5432867define i32 @test1() {68; CHECK-LABEL: @test1(69; CHECK-NEXT: unreachable70; CHECK: redirected:71; CHECK-NEXT: unreachable72;73 %1 = bitcast ptr blockaddress(@test1, %redirected) to ptr74 call void @set_return_addr(ptr %1)75 ret i32 076 77redirected:78 ret i32 079}80 81define internal void @set_return_addr(ptr %addr) {82; CHECK-LABEL: @set_return_addr(83; CHECK-NEXT: unreachable84;85 %addr.addr = alloca ptr, i32 0, align 886 store ptr %addr, ptr %addr.addr, align 887 ret void88}89