Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / gc-empty-basic-blocks.ll
blob54ed34b2eae4e515beec7c36522f6f527af3a015
1 ;; This test verifies that -gc-empty-basic-blocks removes regular empty blocks
2 ;; but does not remove empty blocks which have their address taken.
3 ; RUN: llc < %s -mtriple=x86_64 -O0 -gc-empty-basic-blocks | FileCheck %s
5 ;; This function has a regular empty block.
6 define void @foo(i1 zeroext %0) nounwind {
7   br i1 %0, label %2, label %empty_block
9 ; CHECK:        .text
10 ; CHECK-LABEL: foo:
11 ; CHECK:         jne .LBB0_1
12 ; CHECK-NEXT:    jmp .LBB0_3
14 2:                                               ; preds = %1
15   %3 = call i32 @baz()
16   br label %4
18 ; CHECK-LABEL: .LBB0_1:
19 ; CHECK:         jmp .LBB0_3
21 empty_block:                                     ; preds = %1
22   unreachable
24 ; CHECK-NOT:     %empty_block
25 ; CHECK-NOT:   .LBB0_2
27 4:                                               ; preds = %2, %empty_block
28   ret void
30 ; CHECK-LABEL: .LBB0_3:
31 ; CHECK:         retq
35 ;; This function has an empty block which has its address taken. Check that it
36 ;; is not removed by -gc-empty-basic-blocks.
37 define void @bar(i1 zeroext %0) nounwind {
38 entry:
39   %1 = select i1 %0, ptr blockaddress(@bar, %empty_block), ptr blockaddress(@bar, %bb2) ; <ptr> [#uses=1]
40   indirectbr ptr %1, [label %empty_block, label %bb2]
42 ; CHECK-LABEL: bar:
44 empty_block:                                                ; preds = %entry
45   unreachable
47 ; CHECK-LABEL: .LBB1_1: # %empty_block
49 bb2:                                                ; preds = %entry
50   %2 = call i32 @baz()
51   ret void
54 declare i32 @baz()