brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · db85eeb Raw
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