Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Analysis / BranchProbabilityInfo / libfunc_call.ll
blobc342edcc64afc8b37f9f8f0974d966127c39bfc4
1 ; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
3 declare i32 @strcmp(ptr, ptr)
4 declare i32 @strncmp(ptr, ptr, i32)
5 declare i32 @strcasecmp(ptr, ptr)
6 declare i32 @strncasecmp(ptr, ptr, i32)
7 declare i32 @memcmp(ptr, ptr)
8 declare i32 @bcmp(ptr, ptr)
9 declare i32 @nonstrcmp(ptr, ptr)
12 ; Check that the result of strcmp is considered more likely to be nonzero than
13 ; zero, and equally likely to be (nonzero) positive or negative.
15 define i32 @test_strcmp_eq(ptr %p, ptr %q) {
16 ; CHECK: Printing analysis {{.*}} for function 'test_strcmp_eq'
17 entry:
18   %val = call i32 @strcmp(ptr %p, ptr %q)
19   %cond = icmp eq i32 %val, 0
20   br i1 %cond, label %then, label %else
21 ; CHECK: edge %entry -> %then probability is 0x30000000 / 0x80000000 = 37.50%
22 ; CHECK: edge %entry -> %else probability is 0x50000000 / 0x80000000 = 62.50%
24 then:
25   br label %exit
26 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
28 else:
29   br label %exit
30 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
32 exit:
33   %result = phi i32 [ 0, %then ], [ 1, %else ]
34   ret i32 %result
37 define i32 @test_strcmp_eq5(ptr %p, ptr %q) {
38 ; CHECK: Printing analysis {{.*}} for function 'test_strcmp_eq5'
39 entry:
40   %val = call i32 @strcmp(ptr %p, ptr %q)
41   %cond = icmp eq i32 %val, 5
42   br i1 %cond, label %then, label %else
43 ; CHECK: edge %entry -> %then probability is 0x30000000 / 0x80000000 = 37.50%
44 ; CHECK: edge %entry -> %else probability is 0x50000000 / 0x80000000 = 62.50%
46 then:
47   br label %exit
48 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
50 else:
51   br label %exit
52 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
54 exit:
55   %result = phi i32 [ 0, %then ], [ 1, %else ]
56   ret i32 %result
59 define i32 @test_strcmp_ne(ptr %p, ptr %q) {
60 ; CHECK: Printing analysis {{.*}} for function 'test_strcmp_ne'
61 entry:
62   %val = call i32 @strcmp(ptr %p, ptr %q)
63   %cond = icmp ne i32 %val, 0
64   br i1 %cond, label %then, label %else
65 ; CHECK: edge %entry -> %then probability is 0x50000000 / 0x80000000 = 62.50%
66 ; CHECK: edge %entry -> %else probability is 0x30000000 / 0x80000000 = 37.50%
68 then:
69   br label %exit
70 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
72 else:
73   br label %exit
74 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
76 exit:
77   %result = phi i32 [ 0, %then ], [ 1, %else ]
78   ret i32 %result
81 define i32 @test_strcmp_sgt(ptr %p, ptr %q) {
82 ; CHECK: Printing analysis {{.*}} for function 'test_strcmp_sgt'
83 entry:
84   %val = call i32 @strcmp(ptr %p, ptr %q)
85   %cond = icmp sgt i32 %val, 0
86   br i1 %cond, label %then, label %else
87 ; CHECK: edge %entry -> %then probability is 0x40000000 / 0x80000000 = 50.00%
88 ; CHECK: edge %entry -> %else probability is 0x40000000 / 0x80000000 = 50.00%
90 then:
91   br label %exit
92 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
94 else:
95   br label %exit
96 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
98 exit:
99   %result = phi i32 [ 0, %then ], [ 1, %else ]
100   ret i32 %result
103 define i32 @test_strcmp_slt(ptr %p, ptr %q) {
104 ; CHECK: Printing analysis {{.*}} for function 'test_strcmp_slt'
105 entry:
106   %val = call i32 @strcmp(ptr %p, ptr %q)
107   %cond = icmp slt i32 %val, 0
108   br i1 %cond, label %then, label %else
109 ; CHECK: edge %entry -> %then probability is 0x40000000 / 0x80000000 = 50.00%
110 ; CHECK: edge %entry -> %else probability is 0x40000000 / 0x80000000 = 50.00%
112 then:
113   br label %exit
114 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
116 else:
117   br label %exit
118 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
120 exit:
121   %result = phi i32 [ 0, %then ], [ 1, %else ]
122   ret i32 %result
126 ; Similarly check other library functions that have the same behaviour
128 define i32 @test_strncmp_sgt(ptr %p, ptr %q) {
129 ; CHECK: Printing analysis {{.*}} for function 'test_strncmp_sgt'
130 entry:
131   %val = call i32 @strncmp(ptr %p, ptr %q, i32 4)
132   %cond = icmp sgt i32 %val, 0
133   br i1 %cond, label %then, label %else
134 ; CHECK: edge %entry -> %then probability is 0x40000000 / 0x80000000 = 50.00%
135 ; CHECK: edge %entry -> %else probability is 0x40000000 / 0x80000000 = 50.00%
137 then:
138   br label %exit
139 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
141 else:
142   br label %exit
143 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
145 exit:
146   %result = phi i32 [ 0, %then ], [ 1, %else ]
147   ret i32 %result
150 define i32 @test_strcasecmp_sgt(ptr %p, ptr %q) {
151 ; CHECK: Printing analysis {{.*}} for function 'test_strcasecmp_sgt'
152 entry:
153   %val = call i32 @strcasecmp(ptr %p, ptr %q)
154   %cond = icmp sgt i32 %val, 0
155   br i1 %cond, label %then, label %else
156 ; CHECK: edge %entry -> %then probability is 0x40000000 / 0x80000000 = 50.00%
157 ; CHECK: edge %entry -> %else probability is 0x40000000 / 0x80000000 = 50.00%
159 then:
160   br label %exit
161 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
163 else:
164   br label %exit
165 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
167 exit:
168   %result = phi i32 [ 0, %then ], [ 1, %else ]
169   ret i32 %result
172 define i32 @test_strncasecmp_sgt(ptr %p, ptr %q) {
173 ; CHECK: Printing analysis {{.*}} for function 'test_strncasecmp_sgt'
174 entry:
175   %val = call i32 @strncasecmp(ptr %p, ptr %q, i32 4)
176   %cond = icmp sgt i32 %val, 0
177   br i1 %cond, label %then, label %else
178 ; CHECK: edge %entry -> %then probability is 0x40000000 / 0x80000000 = 50.00%
179 ; CHECK: edge %entry -> %else probability is 0x40000000 / 0x80000000 = 50.00%
181 then:
182   br label %exit
183 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
185 else:
186   br label %exit
187 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
189 exit:
190   %result = phi i32 [ 0, %then ], [ 1, %else ]
191   ret i32 %result
194 define i32 @test_memcmp_sgt(ptr %p, ptr %q) {
195 ; CHECK: Printing analysis {{.*}} for function 'test_memcmp_sgt'
196 entry:
197   %val = call i32 @memcmp(ptr %p, ptr %q)
198   %cond = icmp sgt i32 %val, 0
199   br i1 %cond, label %then, label %else
200 ; CHECK: edge %entry -> %then probability is 0x40000000 / 0x80000000 = 50.00%
201 ; CHECK: edge %entry -> %else probability is 0x40000000 / 0x80000000 = 50.00%
203 then:
204   br label %exit
205 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
207 else:
208   br label %exit
209 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
211 exit:
212   %result = phi i32 [ 0, %then ], [ 1, %else ]
213   ret i32 %result
217 ; Check that for the result of a call to a non-library function the default
218 ; heuristic is applied, i.e. positive more likely than negative, nonzero more
219 ; likely than zero.
221 define i32 @test_nonstrcmp_eq(ptr %p, ptr %q) {
222 ; CHECK: Printing analysis {{.*}} for function 'test_nonstrcmp_eq'
223 entry:
224   %val = call i32 @nonstrcmp(ptr %p, ptr %q)
225   %cond = icmp eq i32 %val, 0
226   br i1 %cond, label %then, label %else
227 ; CHECK: edge %entry -> %then probability is 0x30000000 / 0x80000000 = 37.50%
228 ; CHECK: edge %entry -> %else probability is 0x50000000 / 0x80000000 = 62.50%
230 then:
231   br label %exit
232 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
234 else:
235   br label %exit
236 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
238 exit:
239   %result = phi i32 [ 0, %then ], [ 1, %else ]
240   ret i32 %result
243 define i32 @test_nonstrcmp_ne(ptr %p, ptr %q) {
244 ; CHECK: Printing analysis {{.*}} for function 'test_nonstrcmp_ne'
245 entry:
246   %val = call i32 @nonstrcmp(ptr %p, ptr %q)
247   %cond = icmp ne i32 %val, 0
248   br i1 %cond, label %then, label %else
249 ; CHECK: edge %entry -> %then probability is 0x50000000 / 0x80000000 = 62.50%
250 ; CHECK: edge %entry -> %else probability is 0x30000000 / 0x80000000 = 37.50%
252 then:
253   br label %exit
254 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
256 else:
257   br label %exit
258 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
260 exit:
261   %result = phi i32 [ 0, %then ], [ 1, %else ]
262   ret i32 %result
265 define i32 @test_nonstrcmp_sgt(ptr %p, ptr %q) {
266 ; CHECK: Printing analysis {{.*}} for function 'test_nonstrcmp_sgt'
267 entry:
268   %val = call i32 @nonstrcmp(ptr %p, ptr %q)
269   %cond = icmp sgt i32 %val, 0
270   br i1 %cond, label %then, label %else
271 ; CHECK: edge %entry -> %then probability is 0x50000000 / 0x80000000 = 62.50%
272 ; CHECK: edge %entry -> %else probability is 0x30000000 / 0x80000000 = 37.50%
274 then:
275   br label %exit
276 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
278 else:
279   br label %exit
280 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
282 exit:
283   %result = phi i32 [ 0, %then ], [ 1, %else ]
284   ret i32 %result
288 define i32 @test_bcmp_eq(ptr %p, ptr %q) {
289 ; CHECK: Printing analysis {{.*}} for function 'test_bcmp_eq'
290 entry:
291   %val = call i32 @bcmp(ptr %p, ptr %q)
292   %cond = icmp eq i32 %val, 0
293   br i1 %cond, label %then, label %else
294 ; CHECK: edge %entry -> %then probability is 0x30000000 / 0x80000000 = 37.50%
295 ; CHECK: edge %entry -> %else probability is 0x50000000 / 0x80000000 = 62.50%
297 then:
298   br label %exit
299 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
301 else:
302   br label %exit
303 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
305 exit:
306   %result = phi i32 [ 0, %then ], [ 1, %else ]
307   ret i32 %result
310 define i32 @test_bcmp_eq5(ptr %p, ptr %q) {
311 ; CHECK: Printing analysis {{.*}} for function 'test_bcmp_eq5'
312 entry:
313   %val = call i32 @bcmp(ptr %p, ptr %q)
314   %cond = icmp eq i32 %val, 5
315   br i1 %cond, label %then, label %else
316 ; CHECK: edge %entry -> %then probability is 0x30000000 / 0x80000000 = 37.50%
317 ; CHECK: edge %entry -> %else probability is 0x50000000 / 0x80000000 = 62.50%
319 then:
320   br label %exit
321 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
323 else:
324   br label %exit
325 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
327 exit:
328   %result = phi i32 [ 0, %then ], [ 1, %else ]
329   ret i32 %result
334 define i32 @test_bcmp_ne(ptr %p, ptr %q) {
335 ; CHECK: Printing analysis {{.*}} for function 'test_bcmp_ne'
336 entry:
337   %val = call i32 @bcmp(ptr %p, ptr %q)
338   %cond = icmp ne i32 %val, 0
339   br i1 %cond, label %then, label %else
340 ; CHECK: edge %entry -> %then probability is 0x50000000 / 0x80000000 = 62.50%
341 ; CHECK: edge %entry -> %else probability is 0x30000000 / 0x80000000 = 37.50%
343 then:
344   br label %exit
345 ; CHECK: edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
347 else:
348   br label %exit
349 ; CHECK: edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
351 exit:
352   %result = phi i32 [ 0, %then ], [ 1, %else ]
353   ret i32 %result