xref: /llvm-project/llvm/test/CodeGen/AArch64/basic-block-sections-unsafe.ll (revision ea06384bf667c635f78660f0bcfaa01372735b99)
1;; Check if basic blocks without unique sections are only placed in cold sections if it is safe
2;; to do so.
3;;
4;; Profile for version 0.
5; RUN: echo 'v1' > %t1
6; RUN: echo 'f _Z3asm_goto' >> %t1
7; RUN: echo 'c 0' >> %t1
8; RUN: echo 'f _Z3jump_table' >> %t1
9; RUN: echo 'c 0' >> %t1
10; RUN: echo 'f _Z3red_zone' >> %t1
11; RUN: echo 'c 0' >> %t1
12;;
13; RUN: llc < %s -mtriple=aarch64 -function-sections -basic-block-sections=%t1 -unique-basic-block-section-names -bbsections-cold-text-prefix=".text.unlikely." | FileCheck %s
14; RUN: llc < %s -mtriple=aarch64 -function-sections -aarch64-min-jump-table-entries=4 -basic-block-sections=%t1 -unique-basic-block-section-names -bbsections-cold-text-prefix=".text.unlikely." | FileCheck %s -check-prefix=JUMP-TABLES
15; RUN: llc < %s -mtriple=aarch64 -function-sections -basic-block-sections=%t1 -unique-basic-block-section-names -bbsections-cold-text-prefix=".text.unlikely." | FileCheck %s -check-prefix=RED-ZONE
16
17define void @_Z3asm_goto(i1 zeroext %0, i1 zeroext %1) nounwind {
18  ;; Check that blocks containing or targeted by asm goto aren't split.
19  ; CHECK-LABEL:  _Z3asm_goto
20  ; CHECK:        .section	.text.unlikely._Z3asm_goto,"ax",@progbits
21  ; CHECK-NEXT:     _Z3asm_goto.cold:
22  ; CHECK-NEXT:       bl bam
23  ; CHECK:          .LBB0_4:
24  ; CHECK:            ret
25  ; CHECK:          .LBB_END0_4:
26
27  br i1 %0, label %3, label %5
28
293:                                                ; preds = %2
30  %4 = call i32 @bar()
31  callbr void asm sideeffect "nop", "!i"() #3
32          to label %asm.fallthrough [label %5]
33
34
35asm.fallthrough:                                  ; preds = %3
36    br label %5
37
385:                                                ; preds = %2, %asm.fallthrough
39  %6 = call i32 @bar()
40  br i1 %1, label %7, label %9
41
427:
43  %8 = call i32 @bam()
44  br label %9
45
469:                                                ; preds = %7
47  ret void
48}
49
50define i32 @_Z3jump_table(i32 %in) nounwind {
51  ;; Check that a cold block that contains a jump table dispatch or
52  ;; that is targeted by a jump table is not split.
53  ; JUMP-TABLES-LABEL:  _Z3jump_table
54  ; JUMP-TABLES:        .section	.text.unlikely._Z3jump_table,"ax",@progbits
55  ; JUMP-TABLES-NEXT:     _Z3jump_table.cold:
56  ; JUMP-TABLES-SAME:                         %common.ret
57  ; JUMP-TABLES-NOT:        b       bar
58  ; JUMP-TABLES-NOT:        b       baz
59  ; JUMP-TABLES-NOT:        b       qux
60  ; JUMP-TABLES-NOT:        b       bam
61
62  switch i32 %in, label %common.ret [
63    i32 0, label %cold1
64    i32 1, label %cold2
65    i32 2, label %cold3
66    i32 3, label %cold4
67  ]
68
69  common.ret:                                       ; preds = %0
70    ret i32 0
71
72  cold1:                                            ; preds = %0
73    %1 = tail call i32 @bar()
74    ret i32 %1
75
76  cold2:                                            ; preds = %0
77    %2 = tail call i32 @baz()
78    ret i32 %2
79
80  cold3:                                            ; preds = %0
81    %3 = tail call i32 @bam()
82    ret i32 %3
83
84  cold4:                                            ; preds = %0
85    %4 = tail call i32 @qux()
86    ret i32 %4
87}
88
89define i32 @_Z3red_zone(i1 zeroext %0, i32 %a, i32 %b) nounwind {
90;; Check that cold blocks in functions with red zones aren't split.
91; RED-ZONE-LABEL:        _Z3red_zone
92; MFS-REDZONE-AARCH64-NOT:   _Z3red_zone.cold:
93  %a.addr = alloca i32, align 4
94  %b.addr = alloca i32, align 4
95  %x = alloca i32, align 4
96
97  br i1 %0, label %2, label %3
98
992:                                                ; preds = %1
100  store i32 %a, ptr %a.addr, align 4
101  store i32 %b, ptr %b.addr, align 4
102  br label %4
103
1043:                                                ; preds = %1
105  store i32 %a, ptr %b.addr, align 4
106  store i32 %b, ptr %a.addr, align 4
107  br label %4
108
1094:                                                ; preds = %3, %2
110  %tmp = load i32, ptr %a.addr, align 4
111  %tmp1 = load i32, ptr %b.addr, align 4
112  %add = add nsw i32 %tmp, %tmp1
113  store i32 %add, ptr %x, align 4
114  %tmp2 = load i32, ptr %x, align 4
115  ret i32 %tmp2
116}
117
118declare i32 @bar()
119declare i32 @baz()
120declare i32 @bam()
121declare i32 @qux()
122