1; RUN: opt < %s -inline -S -inlinecold-threshold=75 | FileCheck %s
2; Test that functions with attribute Cold are not inlined while the
3; same function without attribute Cold will be inlined.
4
5; RUN: opt < %s -inline -S -inline-threshold=600 | FileCheck %s -check-prefix=OVERRIDE
6; The command line argument for inline-threshold should override
7; the default cold threshold, so a cold function with size bigger
8; than the default cold threshold (225) will be inlined.
9
10; RUN: opt < %s -inline -S | FileCheck %s -check-prefix=DEFAULT
11; The same cold function will not be inlined with the default behavior.
12
13@a = global i32 4
14
15; This function should be larger than the cold threshold (75), but smaller
16; than the regular threshold.
17; Function Attrs: nounwind readnone uwtable
18define i32 @simpleFunction(i32 %a) #0 {
19entry:
20  call void @extern()
21  %a1 = load volatile i32, i32* @a
22  %x1 = add i32 %a1,  %a1
23  %a2 = load volatile i32, i32* @a
24  %x2 = add i32 %x1, %a2
25  %a3 = load volatile i32, i32* @a
26  %x3 = add i32 %x2, %a3
27  %a4 = load volatile i32, i32* @a
28  %x4 = add i32 %x3, %a4
29  %a5 = load volatile i32, i32* @a
30  %x5 = add i32 %x4, %a5
31  %a6 = load volatile i32, i32* @a
32  %x6 = add i32 %x5, %a6
33  %a7 = load volatile i32, i32* @a
34  %x7 = add i32 %x6, %a6
35  %a8 = load volatile i32, i32* @a
36  %x8 = add i32 %x7, %a8
37  %a9 = load volatile i32, i32* @a
38  %x9 = add i32 %x8, %a9
39  %a10 = load volatile i32, i32* @a
40  %x10 = add i32 %x9, %a10
41  %a11 = load volatile i32, i32* @a
42  %x11 = add i32 %x10, %a11
43  %a12 = load volatile i32, i32* @a
44  %x12 = add i32 %x11, %a12
45  %add = add i32 %x12, %a
46  ret i32 %add
47}
48
49; Function Attrs: nounwind cold readnone uwtable
50define i32 @ColdFunction(i32 %a) #1 {
51; CHECK-LABEL: @ColdFunction
52; CHECK: ret
53; OVERRIDE-LABEL: @ColdFunction
54; OVERRIDE: ret
55; DEFAULT-LABEL: @ColdFunction
56; DEFAULT: ret
57entry:
58  call void @extern()
59  %a1 = load volatile i32, i32* @a
60  %x1 = add i32 %a1,  %a1
61  %a2 = load volatile i32, i32* @a
62  %x2 = add i32 %x1, %a2
63  %a3 = load volatile i32, i32* @a
64  %x3 = add i32 %x2, %a3
65  %a4 = load volatile i32, i32* @a
66  %x4 = add i32 %x3, %a4
67  %a5 = load volatile i32, i32* @a
68  %x5 = add i32 %x4, %a5
69  %a6 = load volatile i32, i32* @a
70  %x6 = add i32 %x5, %a6
71  %a7 = load volatile i32, i32* @a
72  %x7 = add i32 %x6, %a6
73  %a8 = load volatile i32, i32* @a
74  %x8 = add i32 %x7, %a8
75  %a9 = load volatile i32, i32* @a
76  %x9 = add i32 %x8, %a9
77  %a10 = load volatile i32, i32* @a
78  %x10 = add i32 %x9, %a10
79  %a11 = load volatile i32, i32* @a
80  %x11 = add i32 %x10, %a11
81  %a12 = load volatile i32, i32* @a
82  %x12 = add i32 %x11, %a12
83  %add = add i32 %x12, %a
84  ret i32 %add
85}
86
87; This function should be larger than the default cold threshold (225).
88define i32 @ColdFunction2(i32 %a) #1 {
89; CHECK-LABEL: @ColdFunction2
90; CHECK: ret
91; OVERRIDE-LABEL: @ColdFunction2
92; OVERRIDE: ret
93; DEFAULT-LABEL: @ColdFunction2
94; DEFAULT: ret
95entry:
96  call void @extern()
97  %a1 = load volatile i32, i32* @a
98  %x1 = add i32 %a1,  %a1
99  %a2 = load volatile i32, i32* @a
100  %x2 = add i32 %x1, %a2
101  %a3 = load volatile i32, i32* @a
102  %x3 = add i32 %x2, %a3
103  %a4 = load volatile i32, i32* @a
104  %x4 = add i32 %x3, %a4
105  %a5 = load volatile i32, i32* @a
106  %x5 = add i32 %x4, %a5
107  %a6 = load volatile i32, i32* @a
108  %x6 = add i32 %x5, %a6
109  %a7 = load volatile i32, i32* @a
110  %x7 = add i32 %x6, %a7
111  %a8 = load volatile i32, i32* @a
112  %x8 = add i32 %x7, %a8
113  %a9 = load volatile i32, i32* @a
114  %x9 = add i32 %x8, %a9
115  %a10 = load volatile i32, i32* @a
116  %x10 = add i32 %x9, %a10
117  %a11 = load volatile i32, i32* @a
118  %x11 = add i32 %x10, %a11
119  %a12 = load volatile i32, i32* @a
120  %x12 = add i32 %x11, %a12
121
122  %a21 = load volatile i32, i32* @a
123  %x21 = add i32 %x12, %a21
124  %a22 = load volatile i32, i32* @a
125  %x22 = add i32 %x21, %a22
126  %a23 = load volatile i32, i32* @a
127  %x23 = add i32 %x22, %a23
128  %a24 = load volatile i32, i32* @a
129  %x24 = add i32 %x23, %a24
130  %a25 = load volatile i32, i32* @a
131  %x25 = add i32 %x24, %a25
132  %a26 = load volatile i32, i32* @a
133  %x26 = add i32 %x25, %a26
134  %a27 = load volatile i32, i32* @a
135  %x27 = add i32 %x26, %a27
136  %a28 = load volatile i32, i32* @a
137  %x28 = add i32 %x27, %a28
138  %a29 = load volatile i32, i32* @a
139  %x29 = add i32 %x28, %a29
140  %a30 = load volatile i32, i32* @a
141  %x30 = add i32 %x29, %a30
142  %a31 = load volatile i32, i32* @a
143  %x31 = add i32 %x30, %a31
144  %a32 = load volatile i32, i32* @a
145  %x32 = add i32 %x31, %a32
146
147  %a41 = load volatile i32, i32* @a
148  %x41 = add i32 %x32, %a41
149  %a42 = load volatile i32, i32* @a
150  %x42 = add i32 %x41, %a42
151  %a43 = load volatile i32, i32* @a
152  %x43 = add i32 %x42, %a43
153  %a44 = load volatile i32, i32* @a
154  %x44 = add i32 %x43, %a44
155  %a45 = load volatile i32, i32* @a
156  %x45 = add i32 %x44, %a45
157  %a46 = load volatile i32, i32* @a
158  %x46 = add i32 %x45, %a46
159  %a47 = load volatile i32, i32* @a
160  %x47 = add i32 %x46, %a47
161  %a48 = load volatile i32, i32* @a
162  %x48 = add i32 %x47, %a48
163  %a49 = load volatile i32, i32* @a
164  %x49 = add i32 %x48, %a49
165  %a50 = load volatile i32, i32* @a
166  %x50 = add i32 %x49, %a50
167  %a51 = load volatile i32, i32* @a
168  %x51 = add i32 %x50, %a51
169  %a52 = load volatile i32, i32* @a
170  %x52 = add i32 %x51, %a52
171
172  %add = add i32 %x52, %a
173  ret i32 %add
174}
175
176; Function Attrs: nounwind readnone uwtable
177define i32 @bar(i32 %a) #0 {
178; CHECK-LABEL: @bar
179; CHECK: call i32 @ColdFunction(i32 5)
180; CHECK-NOT: call i32 @simpleFunction(i32 6)
181; CHECK: call i32 @ColdFunction2(i32 5)
182; CHECK: ret
183; OVERRIDE-LABEL: @bar
184; OVERRIDE-NOT: call i32 @ColdFunction(i32 5)
185; OVERRIDE-NOT: call i32 @simpleFunction(i32 6)
186; OVERRIDE-NOT: call i32 @ColdFunction2(i32 5)
187; OVERRIDE: ret
188; DEFAULT-LABEL: @bar
189; DEFAULT-NOT: call i32 @ColdFunction(i32 5)
190; DEFAULT-NOT: call i32 @simpleFunction(i32 6)
191; DEFAULT: call i32 @ColdFunction2(i32 5)
192; DEFAULT: ret
193entry:
194  %0 = tail call i32 @ColdFunction(i32 5)
195  %1 = tail call i32 @simpleFunction(i32 6)
196  %2 = tail call i32 @ColdFunction2(i32 5)
197  %3 = add i32 %0, %1
198  %add = add i32 %2, %3
199  ret i32 %add
200}
201
202declare void @extern()
203attributes #0 = { nounwind readnone uwtable }
204attributes #1 = { nounwind cold readnone uwtable }
205