1 ; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+bmi,+lzcnt | FileCheck %s
3 ; LZCNT and TZCNT will always produce the operand size when the input operand
4 ; is zero. This test is to verify that we efficiently select LZCNT/TZCNT
5 ; based on the fact that the 'icmp+select' sequence is always redundant
6 ; in every function defined below.
9 define i16 @test1_ctlz(i16 %v) {
10 %cnt = tail call i16 @llvm.ctlz.i16(i16 %v, i1 true)
11 %tobool = icmp eq i16 %v, 0
12 %cond = select i1 %tobool, i16 16, i16 %cnt
15 ; CHECK-LABEL: test1_ctlz
20 define i32 @test2_ctlz(i32 %v) {
21 %cnt = tail call i32 @llvm.ctlz.i32(i32 %v, i1 true)
22 %tobool = icmp eq i32 %v, 0
23 %cond = select i1 %tobool, i32 32, i32 %cnt
26 ; CHECK-LABEL: test2_ctlz
31 define i64 @test3_ctlz(i64 %v) {
32 %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true)
33 %tobool = icmp eq i64 %v, 0
34 %cond = select i1 %tobool, i64 64, i64 %cnt
37 ; CHECK-LABEL: test3_ctlz
42 define i16 @test4_ctlz(i16 %v) {
43 %cnt = tail call i16 @llvm.ctlz.i16(i16 %v, i1 true)
44 %tobool = icmp eq i16 0, %v
45 %cond = select i1 %tobool, i16 16, i16 %cnt
48 ; CHECK-LABEL: test4_ctlz
53 define i32 @test5_ctlz(i32 %v) {
54 %cnt = tail call i32 @llvm.ctlz.i32(i32 %v, i1 true)
55 %tobool = icmp eq i32 0, %v
56 %cond = select i1 %tobool, i32 32, i32 %cnt
59 ; CHECK-LABEL: test5_ctlz
64 define i64 @test6_ctlz(i64 %v) {
65 %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true)
66 %tobool = icmp eq i64 0, %v
67 %cond = select i1 %tobool, i64 64, i64 %cnt
70 ; CHECK-LABEL: test6_ctlz
75 define i16 @test7_ctlz(i16 %v) {
76 %cnt = tail call i16 @llvm.ctlz.i16(i16 %v, i1 true)
77 %tobool = icmp eq i16 0, %v
78 %cond = select i1 %tobool, i16 %cnt, i16 16
81 ; CHECK-LABEL: test7_ctlz
86 define i32 @test8_ctlz(i32 %v) {
87 %cnt = tail call i32 @llvm.ctlz.i32(i32 %v, i1 true)
88 %tobool = icmp eq i32 0, %v
89 %cond = select i1 %tobool, i32 %cnt, i32 32
92 ; CHECK-LABEL: test8_ctlz
97 define i64 @test9_ctlz(i64 %v) {
98 %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true)
99 %tobool = icmp eq i64 0, %v
100 %cond = select i1 %tobool, i64 %cnt, i64 64
103 ; CHECK-LABEL: test9_ctlz
108 define i16 @test10_ctlz(i16* %ptr) {
110 %cnt = tail call i16 @llvm.ctlz.i16(i16 %v, i1 true)
111 %tobool = icmp eq i16 %v, 0
112 %cond = select i1 %tobool, i16 16, i16 %cnt
115 ; CHECK-LABEL: test10_ctlz
121 define i32 @test11_ctlz(i32* %ptr) {
123 %cnt = tail call i32 @llvm.ctlz.i32(i32 %v, i1 true)
124 %tobool = icmp eq i32 %v, 0
125 %cond = select i1 %tobool, i32 32, i32 %cnt
128 ; CHECK-LABEL: test11_ctlz
134 define i64 @test12_ctlz(i64* %ptr) {
136 %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true)
137 %tobool = icmp eq i64 %v, 0
138 %cond = select i1 %tobool, i64 64, i64 %cnt
141 ; CHECK-LABEL: test12_ctlz
147 define i16 @test13_ctlz(i16* %ptr) {
149 %cnt = tail call i16 @llvm.ctlz.i16(i16 %v, i1 true)
150 %tobool = icmp eq i16 0, %v
151 %cond = select i1 %tobool, i16 16, i16 %cnt
154 ; CHECK-LABEL: test13_ctlz
160 define i32 @test14_ctlz(i32* %ptr) {
162 %cnt = tail call i32 @llvm.ctlz.i32(i32 %v, i1 true)
163 %tobool = icmp eq i32 0, %v
164 %cond = select i1 %tobool, i32 32, i32 %cnt
167 ; CHECK-LABEL: test14_ctlz
173 define i64 @test15_ctlz(i64* %ptr) {
175 %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true)
176 %tobool = icmp eq i64 0, %v
177 %cond = select i1 %tobool, i64 64, i64 %cnt
180 ; CHECK-LABEL: test15_ctlz
186 define i16 @test16_ctlz(i16* %ptr) {
188 %cnt = tail call i16 @llvm.ctlz.i16(i16 %v, i1 true)
189 %tobool = icmp eq i16 0, %v
190 %cond = select i1 %tobool, i16 %cnt, i16 16
193 ; CHECK-LABEL: test16_ctlz
199 define i32 @test17_ctlz(i32* %ptr) {
201 %cnt = tail call i32 @llvm.ctlz.i32(i32 %v, i1 true)
202 %tobool = icmp eq i32 0, %v
203 %cond = select i1 %tobool, i32 %cnt, i32 32
206 ; CHECK-LABEL: test17_ctlz
212 define i64 @test18_ctlz(i64* %ptr) {
214 %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true)
215 %tobool = icmp eq i64 0, %v
216 %cond = select i1 %tobool, i64 %cnt, i64 64
219 ; CHECK-LABEL: test18_ctlz
225 define i16 @test1_cttz(i16 %v) {
226 %cnt = tail call i16 @llvm.cttz.i16(i16 %v, i1 true)
227 %tobool = icmp eq i16 %v, 0
228 %cond = select i1 %tobool, i16 16, i16 %cnt
231 ; CHECK-LABEL: test1_cttz
236 define i32 @test2_cttz(i32 %v) {
237 %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true)
238 %tobool = icmp eq i32 %v, 0
239 %cond = select i1 %tobool, i32 32, i32 %cnt
242 ; CHECK-LABEL: test2_cttz
247 define i64 @test3_cttz(i64 %v) {
248 %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true)
249 %tobool = icmp eq i64 %v, 0
250 %cond = select i1 %tobool, i64 64, i64 %cnt
253 ; CHECK-LABEL: test3_cttz
258 define i16 @test4_cttz(i16 %v) {
259 %cnt = tail call i16 @llvm.cttz.i16(i16 %v, i1 true)
260 %tobool = icmp eq i16 0, %v
261 %cond = select i1 %tobool, i16 16, i16 %cnt
264 ; CHECK-LABEL: test4_cttz
269 define i32 @test5_cttz(i32 %v) {
270 %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true)
271 %tobool = icmp eq i32 0, %v
272 %cond = select i1 %tobool, i32 32, i32 %cnt
275 ; CHECK-LABEL: test5_cttz
280 define i64 @test6_cttz(i64 %v) {
281 %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true)
282 %tobool = icmp eq i64 0, %v
283 %cond = select i1 %tobool, i64 64, i64 %cnt
286 ; CHECK-LABEL: test6_cttz
291 define i16 @test7_cttz(i16 %v) {
292 %cnt = tail call i16 @llvm.cttz.i16(i16 %v, i1 true)
293 %tobool = icmp eq i16 0, %v
294 %cond = select i1 %tobool, i16 %cnt, i16 16
297 ; CHECK-LABEL: test7_cttz
302 define i32 @test8_cttz(i32 %v) {
303 %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true)
304 %tobool = icmp eq i32 0, %v
305 %cond = select i1 %tobool, i32 %cnt, i32 32
308 ; CHECK-LABEL: test8_cttz
313 define i64 @test9_cttz(i64 %v) {
314 %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true)
315 %tobool = icmp eq i64 0, %v
316 %cond = select i1 %tobool, i64 %cnt, i64 64
319 ; CHECK-LABEL: test9_cttz
324 define i16 @test10_cttz(i16* %ptr) {
326 %cnt = tail call i16 @llvm.cttz.i16(i16 %v, i1 true)
327 %tobool = icmp eq i16 %v, 0
328 %cond = select i1 %tobool, i16 16, i16 %cnt
331 ; CHECK-LABEL: test10_cttz
337 define i32 @test11_cttz(i32* %ptr) {
339 %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true)
340 %tobool = icmp eq i32 %v, 0
341 %cond = select i1 %tobool, i32 32, i32 %cnt
344 ; CHECK-LABEL: test11_cttz
350 define i64 @test12_cttz(i64* %ptr) {
352 %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true)
353 %tobool = icmp eq i64 %v, 0
354 %cond = select i1 %tobool, i64 64, i64 %cnt
357 ; CHECK-LABEL: test12_cttz
363 define i16 @test13_cttz(i16* %ptr) {
365 %cnt = tail call i16 @llvm.cttz.i16(i16 %v, i1 true)
366 %tobool = icmp eq i16 0, %v
367 %cond = select i1 %tobool, i16 16, i16 %cnt
370 ; CHECK-LABEL: test13_cttz
376 define i32 @test14_cttz(i32* %ptr) {
378 %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true)
379 %tobool = icmp eq i32 0, %v
380 %cond = select i1 %tobool, i32 32, i32 %cnt
383 ; CHECK-LABEL: test14_cttz
389 define i64 @test15_cttz(i64* %ptr) {
391 %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true)
392 %tobool = icmp eq i64 0, %v
393 %cond = select i1 %tobool, i64 64, i64 %cnt
396 ; CHECK-LABEL: test15_cttz
402 define i16 @test16_cttz(i16* %ptr) {
404 %cnt = tail call i16 @llvm.cttz.i16(i16 %v, i1 true)
405 %tobool = icmp eq i16 0, %v
406 %cond = select i1 %tobool, i16 %cnt, i16 16
409 ; CHECK-LABEL: test16_cttz
415 define i32 @test17_cttz(i32* %ptr) {
417 %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true)
418 %tobool = icmp eq i32 0, %v
419 %cond = select i1 %tobool, i32 %cnt, i32 32
422 ; CHECK-LABEL: test17_cttz
428 define i64 @test18_cttz(i64* %ptr) {
430 %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true)
431 %tobool = icmp eq i64 0, %v
432 %cond = select i1 %tobool, i64 %cnt, i64 64
435 ; CHECK-LABEL: test18_cttz
441 declare i64 @llvm.cttz.i64(i64, i1)
442 declare i32 @llvm.cttz.i32(i32, i1)
443 declare i16 @llvm.cttz.i16(i16, i1)
444 declare i64 @llvm.ctlz.i64(i64, i1)
445 declare i32 @llvm.ctlz.i32(i32, i1)
446 declare i16 @llvm.ctlz.i16(i16, i1)