xref: /llvm-project/llvm/test/Transforms/SCCP/dangling-block-address.ll (revision 0991da36906bdb29b8f1030d5123bafb58fee79e)
16ede09b6SNick Desaulniers; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
26ede09b6SNick Desaulniers; RUN: opt -S -passes=internalize,ipsccp %s | FileCheck %s
39477d39eSFlorian Hahn; PR5569
49477d39eSFlorian Hahn
5e1bae23fSNick Desaulniers; If BasicBlocks are unreachable, IPSCCP should convert them to unreachable.
6e1bae23fSNick Desaulniers; Unless they have their address taken, delete them. If they do have their
7e1bae23fSNick Desaulniers; address taken, let other passes replace these "dead" blockaddresses with some
8e1bae23fSNick Desaulniers; other Constant.
99477d39eSFlorian Hahn
10*0991da36SNikita Popov; CHECK: @bar.l = internal constant [2 x ptr] [ptr blockaddress(@bar, %lab0), ptr blockaddress(@bar, %end)]
11e1bae23fSNick Desaulniers
129477d39eSFlorian Hahn
13*0991da36SNikita Popov@code = global [5 x i32] [i32 0, i32 0, i32 0, i32 0, i32 1], align 4 ; <ptr> [#uses=0]
14*0991da36SNikita Popov@bar.l = internal constant [2 x ptr] [ptr blockaddress(@bar, %lab0), ptr blockaddress(@bar, %end)] ; <ptr> [#uses=1]
159477d39eSFlorian Hahn
169477d39eSFlorian Hahndefine void @foo(i32 %x) nounwind readnone {
176ede09b6SNick Desaulniers; CHECK-LABEL: @foo(
186ede09b6SNick Desaulniers; CHECK-NEXT:  entry:
196ede09b6SNick Desaulniers; CHECK-NEXT:    unreachable
206ede09b6SNick Desaulniers;
219477d39eSFlorian Hahnentry:
22*0991da36SNikita Popov  %b = alloca i32, align 4                        ; <ptr> [#uses=1]
23*0991da36SNikita Popov  store volatile i32 -1, ptr %b
249477d39eSFlorian Hahn  ret void
259477d39eSFlorian Hahn}
269477d39eSFlorian Hahn
27*0991da36SNikita Popovdefine void @bar(ptr nocapture %pc) nounwind readonly {
286ede09b6SNick Desaulniers; CHECK-LABEL: @bar(
296ede09b6SNick Desaulniers; CHECK-NEXT:  entry:
306ede09b6SNick Desaulniers; CHECK-NEXT:    unreachable
31e1bae23fSNick Desaulniers; CHECK:       lab0:
32e1bae23fSNick Desaulniers; CHECK-NEXT:    unreachable
33e1bae23fSNick Desaulniers; CHECK:       end:
34e1bae23fSNick Desaulniers; CHECK-NEXT:    unreachable
356ede09b6SNick Desaulniers;
369477d39eSFlorian Hahnentry:
379477d39eSFlorian Hahn  br label %indirectgoto
389477d39eSFlorian Hahn
399477d39eSFlorian Hahnlab0:                                             ; preds = %indirectgoto
409477d39eSFlorian Hahn  %indvar.next = add i32 %indvar, 1               ; <i32> [#uses=1]
419477d39eSFlorian Hahn  br label %indirectgoto
429477d39eSFlorian Hahn
439477d39eSFlorian Hahnend:                                              ; preds = %indirectgoto
449477d39eSFlorian Hahn  ret void
459477d39eSFlorian Hahn
469477d39eSFlorian Hahnindirectgoto:                                     ; preds = %lab0, %entry
479477d39eSFlorian Hahn  %indvar = phi i32 [ %indvar.next, %lab0 ], [ 0, %entry ] ; <i32> [#uses=2]
48*0991da36SNikita Popov  %pc.addr.0 = getelementptr i32, ptr %pc, i32 %indvar ; <ptr> [#uses=1]
49*0991da36SNikita Popov  %tmp1.pn = load i32, ptr %pc.addr.0                 ; <i32> [#uses=1]
50*0991da36SNikita Popov  %indirect.goto.dest.in = getelementptr inbounds [2 x ptr], ptr @bar.l, i32 0, i32 %tmp1.pn ; <ptr> [#uses=1]
51*0991da36SNikita Popov  %indirect.goto.dest = load ptr, ptr %indirect.goto.dest.in ; <ptr> [#uses=1]
52*0991da36SNikita Popov  indirectbr ptr %indirect.goto.dest, [label %lab0, label %end]
539477d39eSFlorian Hahn}
549477d39eSFlorian Hahn
559477d39eSFlorian Hahndefine i32 @main() nounwind readnone {
566ede09b6SNick Desaulniers; CHECK-LABEL: @main(
576ede09b6SNick Desaulniers; CHECK-NEXT:  entry:
586ede09b6SNick Desaulniers; CHECK-NEXT:    unreachable
596ede09b6SNick Desaulniers;
609477d39eSFlorian Hahnentry:
619477d39eSFlorian Hahn  ret i32 0
629477d39eSFlorian Hahn}
63e1bae23fSNick Desaulniers
64e1bae23fSNick Desaulniers; https://github.com/llvm/llvm-project/issues/54238
65e1bae23fSNick Desaulniers; https://github.com/llvm/llvm-project/issues/54251
66e1bae23fSNick Desaulniers; https://github.com/llvm/llvm-project/issues/54328
67e1bae23fSNick Desaulniersdefine i32 @test1() {
68e1bae23fSNick Desaulniers; CHECK-LABEL: @test1(
69e1bae23fSNick Desaulniers; CHECK-NEXT:    unreachable
70e1bae23fSNick Desaulniers; CHECK:       redirected:
71e1bae23fSNick Desaulniers; CHECK-NEXT:    unreachable
72e1bae23fSNick Desaulniers;
73*0991da36SNikita Popov  %1 = bitcast ptr blockaddress(@test1, %redirected) to ptr
74*0991da36SNikita Popov  call void @set_return_addr(ptr %1)
75e1bae23fSNick Desaulniers  ret i32 0
76e1bae23fSNick Desaulniers
77e1bae23fSNick Desaulniersredirected:
78e1bae23fSNick Desaulniers  ret i32 0
79e1bae23fSNick Desaulniers}
80e1bae23fSNick Desaulniers
81*0991da36SNikita Popovdefine internal void @set_return_addr(ptr %addr) {
82e1bae23fSNick Desaulniers; CHECK-LABEL: @set_return_addr(
83e1bae23fSNick Desaulniers; CHECK-NEXT:    unreachable
84e1bae23fSNick Desaulniers;
85*0991da36SNikita Popov  %addr.addr = alloca ptr, i32 0, align 8
86*0991da36SNikita Popov  store ptr %addr, ptr %addr.addr, align 8
87e1bae23fSNick Desaulniers  ret void
88e1bae23fSNick Desaulniers}
89