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