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