xref: /llvm-project/llvm/test/CodeGen/X86/gc-empty-basic-blocks.ll (revision 61785ffcfc4d1167cfe860ed13faf9ba6fbfe340)
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
4
5;; This function has a regular empty block.
6define void @foo(i1 zeroext %0) nounwind {
7  br i1 %0, label %2, label %empty_block
8
9; CHECK:        .text
10; CHECK-LABEL: foo:
11; CHECK:         jne .LBB0_1
12; CHECK-NEXT:    jmp .LBB0_3
13
142:                                               ; preds = %1
15  %3 = call i32 @baz()
16  br label %4
17
18; CHECK-LABEL: .LBB0_1:
19; CHECK:	 jmp .LBB0_3
20
21empty_block:                                     ; preds = %1
22  unreachable
23
24; CHECK-NOT:     %empty_block
25; CHECK-NOT:   .LBB0_2
26
274:                                               ; preds = %2, %empty_block
28  ret void
29
30; CHECK-LABEL: .LBB0_3:
31; CHECK:         retq
32
33}
34
35;; This function has an empty block which has its address taken. Check that it
36;; is not removed by -gc-empty-basic-blocks.
37define void @bar(i1 zeroext %0) nounwind {
38entry:
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]
41
42; CHECK-LABEL: bar:
43
44empty_block:                                                ; preds = %entry
45  unreachable
46
47; CHECK-LABEL: .LBB1_1: # %empty_block
48
49bb2:                                                ; preds = %entry
50  %2 = call i32 @baz()
51  ret void
52}
53
54declare i32 @baz()
55