xref: /llvm-project/llvm/test/CodeGen/X86/code_placement_ext_tsp_size.ll (revision cb5fbd2f60a5a588bfa4668ea8269c3568cbff6e)
1; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -verify-machineinstrs -apply-ext-tsp-for-size < %s | FileCheck %s -check-prefix=CHECK-SIZE
2; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -verify-machineinstrs < %s | FileCheck %s -check-prefix=CHECK-PERF
3
4define void @func1() minsize {
5;
6; +-----+
7; | b0  | -+
8; +-----+  |
9;   |      |
10;   | 10   |
11;   v      |
12; +-----+  |
13; | b1  |  | 10000
14; +-----+  |
15;   |      |
16;   | 10   |
17;   v      |
18; +-----+  |
19; | b2  | <+
20; +-----+
21;
22; CHECK-SIZE-LABEL: func1:
23; CHECK-SIZE: %b0
24; CHECK-SIZE: %b1
25; CHECK-SIZE: %b2
26;
27; CHECK-PERF-LABEL: func1:
28; CHECK-PERF: %b0
29; CHECK-PERF: %b2
30; CHECK-PERF: %b1
31
32b0:
33  %call = call zeroext i1 @a()
34  br i1 %call, label %b1, label %b2, !prof !1
35
36b1:
37  call void @d()
38  call void @d()
39  call void @d()
40  br label %b2
41
42b2:
43  call void @e()
44  ret void
45}
46
47define void @func_loop() minsize !prof !9 {
48; Test that the algorithm can rotate loops in the presence of profile data.
49;
50;                  +--------+
51;                  | entry  |
52;                  +--------+
53;                    |
54;                    | 1
55;                    v
56; +--------+  16   +--------+
57; | if.then| <---- | header | <+
58; +--------+       +--------+  |
59;   |                |         |
60;   |                | 160     |
61;   |                v         |
62;   |              +--------+  |
63;   |              | if.else|  | 175
64;   |              +--------+  |
65;   |                |         |
66;   |                | 160     |
67;   |                v         |
68;   |        16    +--------+  |
69;   +------------> | if.end | -+
70;                  +--------+
71;                    |
72;                    | 1
73;                    v
74;                  +--------+
75;                  |  end   |
76;                  +--------+
77;
78; CHECK-SIZE-LABEL: func_loop:
79; CHECK-SIZE: %entry
80; CHECK-SIZE: %header
81; CHECK-SIZE: %if.then
82; CHECK-SIZE: %if.else
83; CHECK-SIZE: %if.end
84; CHECK-SIZE: %end
85;
86; CHECK-PERF-LABEL: func_loop:
87; CHECK-PERF: %entry
88; CHECK-PERF: %header
89; CHECK-PERF: %if.else
90; CHECK-PERF: %if.end
91; CHECK-PERF: %if.then
92; CHECK-PERF: %end
93
94entry:
95  br label %header
96
97header:
98  call void @e()
99  %call = call zeroext i1 @a()
100  br i1 %call, label %if.then, label %if.else, !prof !10
101
102if.then:
103  call void @f()
104  br label %if.end
105
106if.else:
107  call void @g()
108  br label %if.end
109
110if.end:
111  call void @h()
112  %call2 = call zeroext i1 @a()
113  br i1 %call2, label %header, label %end
114
115end:
116  ret void
117}
118
119
120declare zeroext i1 @a()
121declare void @b()
122declare void @c()
123declare void @d()
124declare void @e()
125declare void @g()
126declare void @f()
127declare void @h()
128
129!1 = !{!"branch_weights", i32 10, i32 10000}
130!9 = !{!"function_entry_count", i64 1}
131!10 = !{!"branch_weights", i32 16, i32 160}
132