diff --git a/llvm/test/Transforms/PhaseOrdering/dae-dce.ll b/llvm/test/Transforms/PhaseOrdering/dae-dce.ll new file mode 100644 index 0000000000000..8a0a36ef6cff9 --- /dev/null +++ b/llvm/test/Transforms/PhaseOrdering/dae-dce.ll @@ -0,0 +1,64 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes='default' < %s | FileCheck %s --check-prefixes=CHECK,DEFAULT +; RUN: opt -S -passes='lto' < %s | FileCheck %s --check-prefixes=CHECK,LTO + +declare void @llvm.trap() + +define void @do_trap(ptr %ptr) { +; CHECK-LABEL: @do_trap( +; CHECK-NEXT: tail call void @llvm.trap() +; CHECK-NEXT: unreachable +; + call void @llvm.trap() + unreachable +} + +define internal void @capture_and_trap(ptr %ptr) noinline { +; CHECK-LABEL: @capture_and_trap( +; CHECK-NEXT: tail call void @llvm.trap() +; CHECK-NEXT: unreachable +; + %alloca = alloca ptr, align 4 + store ptr %ptr, ptr %alloca, align 4 + call void @do_trap(ptr noundef nonnull %alloca) + unreachable +} + +define internal void @dead_fn1() { +; LTO-LABEL: @dead_fn1( +; LTO-NEXT: ret void +; + ret void +} + +define internal void @dead_fn2() { +; LTO-LABEL: @dead_fn2( +; LTO-NEXT: ret void +; + ret void +} + +define void @test(i1 %c) { +; DEFAULT-LABEL: @test( +; DEFAULT-NEXT: tail call fastcc void @capture_and_trap() +; DEFAULT-NEXT: unreachable +; +; LTO-LABEL: @test( +; LTO-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]] +; LTO: if: +; LTO-NEXT: tail call fastcc void @capture_and_trap(ptr nonnull @dead_fn1) +; LTO-NEXT: unreachable +; LTO: else: +; LTO-NEXT: tail call fastcc void @capture_and_trap(ptr nonnull @dead_fn2) +; LTO-NEXT: unreachable +; + br i1 %c, label %if, label %else + +if: + call void @capture_and_trap(ptr @dead_fn1) + unreachable + +else: + call void @capture_and_trap(ptr @dead_fn2) + unreachable +}