[InstCombine] Signed saturation patterns
[llvm-core.git] / test / Transforms / InstCombine / select-cmp-cttz-ctlz.ll
blob606cdedca7a71fc5ee80ee7f1b1d7162a6652439
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -instcombine -S < %s | FileCheck %s
4 ; This test is to verify that the instruction combiner is able to fold
5 ; a cttz/ctlz followed by a icmp + select into a single cttz/ctlz with
6 ; the 'is_zero_undef' flag cleared.
8 define i16 @test1(i16 %x) {
9 ; CHECK-LABEL: @test1(
10 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i16 @llvm.ctlz.i16(i16 [[X:%.*]], i1 false), !range !0
11 ; CHECK-NEXT:    ret i16 [[TMP1]]
13   %ct = tail call i16 @llvm.ctlz.i16(i16 %x, i1 true)
14   %tobool = icmp ne i16 %x, 0
15   %cond = select i1 %tobool, i16 %ct, i16 16
16   ret i16 %cond
19 define i32 @test2(i32 %x) {
20 ; CHECK-LABEL: @test2(
21 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !1
22 ; CHECK-NEXT:    ret i32 [[TMP1]]
24   %ct = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true)
25   %tobool = icmp ne i32 %x, 0
26   %cond = select i1 %tobool, i32 %ct, i32 32
27   ret i32 %cond
30 define i64 @test3(i64 %x) {
31 ; CHECK-LABEL: @test3(
32 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i64 @llvm.ctlz.i64(i64 [[X:%.*]], i1 false), !range !2
33 ; CHECK-NEXT:    ret i64 [[TMP1]]
35   %ct = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true)
36   %tobool = icmp ne i64 %x, 0
37   %cond = select i1 %tobool, i64 %ct, i64 64
38   ret i64 %cond
41 define i16 @test4(i16 %x) {
42 ; CHECK-LABEL: @test4(
43 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i16 @llvm.ctlz.i16(i16 [[X:%.*]], i1 false), !range !0
44 ; CHECK-NEXT:    ret i16 [[TMP1]]
46   %ct = tail call i16 @llvm.ctlz.i16(i16 %x, i1 true)
47   %tobool = icmp eq i16 %x, 0
48   %cond = select i1 %tobool, i16 16, i16 %ct
49   ret i16 %cond
52 define i32 @test5(i32 %x) {
53 ; CHECK-LABEL: @test5(
54 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !1
55 ; CHECK-NEXT:    ret i32 [[TMP1]]
57   %ct = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true)
58   %tobool = icmp eq i32 %x, 0
59   %cond = select i1 %tobool, i32 32, i32 %ct
60   ret i32 %cond
63 define i64 @test6(i64 %x) {
64 ; CHECK-LABEL: @test6(
65 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i64 @llvm.ctlz.i64(i64 [[X:%.*]], i1 false), !range !2
66 ; CHECK-NEXT:    ret i64 [[TMP1]]
68   %ct = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true)
69   %tobool = icmp eq i64 %x, 0
70   %cond = select i1 %tobool, i64 64, i64 %ct
71   ret i64 %cond
74 define i16 @test1b(i16 %x) {
75 ; CHECK-LABEL: @test1b(
76 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i16 @llvm.cttz.i16(i16 [[X:%.*]], i1 false), !range !0
77 ; CHECK-NEXT:    ret i16 [[TMP1]]
79   %ct = tail call i16 @llvm.cttz.i16(i16 %x, i1 true)
80   %tobool = icmp ne i16 %x, 0
81   %cond = select i1 %tobool, i16 %ct, i16 16
82   ret i16 %cond
85 define i32 @test2b(i32 %x) {
86 ; CHECK-LABEL: @test2b(
87 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false), !range !1
88 ; CHECK-NEXT:    ret i32 [[TMP1]]
90   %ct = tail call i32 @llvm.cttz.i32(i32 %x, i1 true)
91   %tobool = icmp ne i32 %x, 0
92   %cond = select i1 %tobool, i32 %ct, i32 32
93   ret i32 %cond
96 define i64 @test3b(i64 %x) {
97 ; CHECK-LABEL: @test3b(
98 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i64 @llvm.cttz.i64(i64 [[X:%.*]], i1 false), !range !2
99 ; CHECK-NEXT:    ret i64 [[TMP1]]
101   %ct = tail call i64 @llvm.cttz.i64(i64 %x, i1 true)
102   %tobool = icmp ne i64 %x, 0
103   %cond = select i1 %tobool, i64 %ct, i64 64
104   ret i64 %cond
107 define i16 @test4b(i16 %x) {
108 ; CHECK-LABEL: @test4b(
109 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i16 @llvm.cttz.i16(i16 [[X:%.*]], i1 false), !range !0
110 ; CHECK-NEXT:    ret i16 [[TMP1]]
112   %ct = tail call i16 @llvm.cttz.i16(i16 %x, i1 true)
113   %tobool = icmp eq i16 %x, 0
114   %cond = select i1 %tobool, i16 16, i16 %ct
115   ret i16 %cond
118 define i32 @test5b(i32 %x) {
119 ; CHECK-LABEL: @test5b(
120 ; CHECK-NEXT:  entry:
121 ; CHECK-NEXT:    [[TMP0:%.*]] = tail call i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false), !range !1
122 ; CHECK-NEXT:    ret i32 [[TMP0]]
124 entry:
125   %ct = tail call i32 @llvm.cttz.i32(i32 %x, i1 true)
126   %tobool = icmp eq i32 %x, 0
127   %cond = select i1 %tobool, i32 32, i32 %ct
128   ret i32 %cond
131 define i64 @test6b(i64 %x) {
132 ; CHECK-LABEL: @test6b(
133 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i64 @llvm.cttz.i64(i64 [[X:%.*]], i1 false), !range !2
134 ; CHECK-NEXT:    ret i64 [[TMP1]]
136   %ct = tail call i64 @llvm.cttz.i64(i64 %x, i1 true)
137   %tobool = icmp eq i64 %x, 0
138   %cond = select i1 %tobool, i64 64, i64 %ct
139   ret i64 %cond
142 define i32 @test1c(i16 %x) {
143 ; CHECK-LABEL: @test1c(
144 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i16 @llvm.cttz.i16(i16 [[X:%.*]], i1 false), !range !0
145 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i16 [[TMP1]] to i32
146 ; CHECK-NEXT:    ret i32 [[TMP2]]
148   %ct = tail call i16 @llvm.cttz.i16(i16 %x, i1 true)
149   %cast2 = zext i16 %ct to i32
150   %tobool = icmp ne i16 %x, 0
151   %cond = select i1 %tobool, i32 %cast2, i32 16
152   ret i32 %cond
155 define i64 @test2c(i16 %x) {
156 ; CHECK-LABEL: @test2c(
157 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i16 @llvm.cttz.i16(i16 [[X:%.*]], i1 false), !range !0
158 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i16 [[TMP1]] to i64
159 ; CHECK-NEXT:    ret i64 [[TMP2]]
161   %ct = tail call i16 @llvm.cttz.i16(i16 %x, i1 true)
162   %conv = zext i16 %ct to i64
163   %tobool = icmp ne i16 %x, 0
164   %cond = select i1 %tobool, i64 %conv, i64 16
165   ret i64 %cond
168 define i64 @test3c(i32 %x) {
169 ; CHECK-LABEL: @test3c(
170 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false), !range !1
171 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
172 ; CHECK-NEXT:    ret i64 [[TMP2]]
174   %ct = tail call i32 @llvm.cttz.i32(i32 %x, i1 true)
175   %conv = zext i32 %ct to i64
176   %tobool = icmp ne i32 %x, 0
177   %cond = select i1 %tobool, i64 %conv, i64 32
178   ret i64 %cond
181 define i32 @test4c(i16 %x) {
182 ; CHECK-LABEL: @test4c(
183 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i16 @llvm.ctlz.i16(i16 [[X:%.*]], i1 false), !range !0
184 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i16 [[TMP1]] to i32
185 ; CHECK-NEXT:    ret i32 [[TMP2]]
187   %ct = tail call i16 @llvm.ctlz.i16(i16 %x, i1 true)
188   %cast = zext i16 %ct to i32
189   %tobool = icmp ne i16 %x, 0
190   %cond = select i1 %tobool, i32 %cast, i32 16
191   ret i32 %cond
194 define i64 @test5c(i16 %x) {
195 ; CHECK-LABEL: @test5c(
196 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i16 @llvm.ctlz.i16(i16 [[X:%.*]], i1 false), !range !0
197 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i16 [[TMP1]] to i64
198 ; CHECK-NEXT:    ret i64 [[TMP2]]
200   %ct = tail call i16 @llvm.ctlz.i16(i16 %x, i1 true)
201   %cast = zext i16 %ct to i64
202   %tobool = icmp ne i16 %x, 0
203   %cond = select i1 %tobool, i64 %cast, i64 16
204   ret i64 %cond
207 define i64 @test6c(i32 %x) {
208 ; CHECK-LABEL: @test6c(
209 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !1
210 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
211 ; CHECK-NEXT:    ret i64 [[TMP2]]
213   %ct = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true)
214   %cast = zext i32 %ct to i64
215   %tobool = icmp ne i32 %x, 0
216   %cond = select i1 %tobool, i64 %cast, i64 32
217   ret i64 %cond
220 define i16 @test1d(i64 %x) {
221 ; CHECK-LABEL: @test1d(
222 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i64 @llvm.cttz.i64(i64 [[X:%.*]], i1 false), !range !2
223 ; CHECK-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i16
224 ; CHECK-NEXT:    ret i16 [[TMP2]]
226   %ct = tail call i64 @llvm.cttz.i64(i64 %x, i1 true)
227   %conv = trunc i64 %ct to i16
228   %tobool = icmp ne i64 %x, 0
229   %cond = select i1 %tobool, i16 %conv, i16 64
230   ret i16 %cond
233 define i32 @test2d(i64 %x) {
234 ; CHECK-LABEL: @test2d(
235 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i64 @llvm.cttz.i64(i64 [[X:%.*]], i1 false), !range !2
236 ; CHECK-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i32
237 ; CHECK-NEXT:    ret i32 [[TMP2]]
239   %ct = tail call i64 @llvm.cttz.i64(i64 %x, i1 true)
240   %cast = trunc i64 %ct to i32
241   %tobool = icmp ne i64 %x, 0
242   %cond = select i1 %tobool, i32 %cast, i32 64
243   ret i32 %cond
246 define i16 @test3d(i32 %x) {
247 ; CHECK-LABEL: @test3d(
248 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false), !range !1
249 ; CHECK-NEXT:    [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
250 ; CHECK-NEXT:    ret i16 [[TMP2]]
252   %ct = tail call i32 @llvm.cttz.i32(i32 %x, i1 true)
253   %cast = trunc i32 %ct to i16
254   %tobool = icmp ne i32 %x, 0
255   %cond = select i1 %tobool, i16 %cast, i16 32
256   ret i16 %cond
259 define i16 @test4d(i64 %x) {
260 ; CHECK-LABEL: @test4d(
261 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i64 @llvm.ctlz.i64(i64 [[X:%.*]], i1 false), !range !2
262 ; CHECK-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i16
263 ; CHECK-NEXT:    ret i16 [[TMP2]]
265   %ct = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true)
266   %cast = trunc i64 %ct to i16
267   %tobool = icmp ne i64 %x, 0
268   %cond = select i1 %tobool, i16 %cast, i16 64
269   ret i16 %cond
272 define i32 @test5d(i64 %x) {
273 ; CHECK-LABEL: @test5d(
274 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i64 @llvm.ctlz.i64(i64 [[X:%.*]], i1 false), !range !2
275 ; CHECK-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i32
276 ; CHECK-NEXT:    ret i32 [[TMP2]]
278   %ct = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true)
279   %cast = trunc i64 %ct to i32
280   %tobool = icmp ne i64 %x, 0
281   %cond = select i1 %tobool, i32 %cast, i32 64
282   ret i32 %cond
285 define i16 @test6d(i32 %x) {
286 ; CHECK-LABEL: @test6d(
287 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !1
288 ; CHECK-NEXT:    [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
289 ; CHECK-NEXT:    ret i16 [[TMP2]]
291   %ct = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true)
292   %cast = trunc i32 %ct to i16
293   %tobool = icmp ne i32 %x, 0
294   %cond = select i1 %tobool, i16 %cast, i16 32
295   ret i16 %cond
298 define i64 @select_bug1(i32 %x) {
299 ; CHECK-LABEL: @select_bug1(
300 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false), !range !1
301 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
302 ; CHECK-NEXT:    ret i64 [[TMP2]]
304   %ct = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)
305   %conv = zext i32 %ct to i64
306   %tobool = icmp ne i32 %x, 0
307   %cond = select i1 %tobool, i64 %conv, i64 32
308   ret i64 %cond
311 define i16 @select_bug2(i32 %x) {
312 ; CHECK-LABEL: @select_bug2(
313 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false), !range !1
314 ; CHECK-NEXT:    [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
315 ; CHECK-NEXT:    ret i16 [[TMP2]]
317   %ct = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)
318   %conv = trunc i32 %ct to i16
319   %tobool = icmp ne i32 %x, 0
320   %cond = select i1 %tobool, i16 %conv, i16 32
321   ret i16 %cond
324 define i128 @test7(i128 %x) {
325 ; CHECK-LABEL: @test7(
326 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i128 @llvm.ctlz.i128(i128 [[X:%.*]], i1 false), !range !3
327 ; CHECK-NEXT:    ret i128 [[TMP1]]
329   %ct = tail call i128 @llvm.ctlz.i128(i128 %x, i1 true)
330   %tobool = icmp ne i128 %x, 0
331   %cond = select i1 %tobool, i128 %ct, i128 128
332   ret i128 %cond
335 define i128 @test8(i128 %x) {
336 ; CHECK-LABEL: @test8(
337 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call i128 @llvm.cttz.i128(i128 [[X:%.*]], i1 false), !range !3
338 ; CHECK-NEXT:    ret i128 [[TMP1]]
340   %ct = tail call i128 @llvm.cttz.i128(i128 %x, i1 true)
341   %tobool = icmp ne i128 %x, 0
342   %cond = select i1 %tobool, i128 %ct, i128 128
343   ret i128 %cond
346 define i32 @test_ctlz_not_bw(i32 %x) {
347 ; CHECK-LABEL: @test_ctlz_not_bw(
348 ; CHECK-NEXT:    [[CT:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 true), !range !1
349 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X]], 0
350 ; CHECK-NEXT:    [[RES:%.*]] = select i1 [[CMP]], i32 123, i32 [[CT]]
351 ; CHECK-NEXT:    ret i32 [[RES]]
353   %ct = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
354   %cmp = icmp ne i32 %x, 0
355   %res = select i1 %cmp, i32 %ct, i32 123
356   ret i32 %res
359 define i32 @test_ctlz_not_bw_multiuse(i32 %x) {
360 ; CHECK-LABEL: @test_ctlz_not_bw_multiuse(
361 ; CHECK-NEXT:    [[CT:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !1
362 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X]], 0
363 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i32 123, i32 [[CT]]
364 ; CHECK-NEXT:    [[RES:%.*]] = or i32 [[SEL]], [[CT]]
365 ; CHECK-NEXT:    ret i32 [[RES]]
367   %ct = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
368   %cmp = icmp ne i32 %x, 0
369   %sel = select i1 %cmp, i32 %ct, i32 123
370   %res = or i32 %sel, %ct
371   ret i32 %res
374 define i32 @test_cttz_not_bw(i32 %x) {
375 ; CHECK-LABEL: @test_cttz_not_bw(
376 ; CHECK-NEXT:    [[CT:%.*]] = tail call i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 true), !range !1
377 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X]], 0
378 ; CHECK-NEXT:    [[RES:%.*]] = select i1 [[CMP]], i32 123, i32 [[CT]]
379 ; CHECK-NEXT:    ret i32 [[RES]]
381   %ct = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)
382   %cmp = icmp ne i32 %x, 0
383   %res = select i1 %cmp, i32 %ct, i32 123
384   ret i32 %res
387 define i32 @test_cttz_not_bw_multiuse(i32 %x) {
388 ; CHECK-LABEL: @test_cttz_not_bw_multiuse(
389 ; CHECK-NEXT:    [[CT:%.*]] = tail call i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false), !range !1
390 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X]], 0
391 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i32 123, i32 [[CT]]
392 ; CHECK-NEXT:    [[RES:%.*]] = or i32 [[SEL]], [[CT]]
393 ; CHECK-NEXT:    ret i32 [[RES]]
395   %ct = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)
396   %cmp = icmp ne i32 %x, 0
397   %sel = select i1 %cmp, i32 %ct, i32 123
398   %res = or i32 %sel, %ct
399   ret i32 %res
402 define <2 x i32> @test_ctlz_bw_vec(<2 x i32> %x) {
403 ; CHECK-LABEL: @test_ctlz_bw_vec(
404 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false)
405 ; CHECK-NEXT:    ret <2 x i32> [[TMP1]]
407   %ct = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 true)
408   %cmp = icmp ne <2 x i32> %x, zeroinitializer
409   %res = select <2 x i1> %cmp, <2 x i32> %ct, <2 x i32> <i32 32, i32 32>
410   ret <2 x i32> %res
413 define <2 x i32> @test_ctlz_not_bw_vec(<2 x i32> %x) {
414 ; CHECK-LABEL: @test_ctlz_not_bw_vec(
415 ; CHECK-NEXT:    [[CT:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 true)
416 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <2 x i32> [[X]], zeroinitializer
417 ; CHECK-NEXT:    [[RES:%.*]] = select <2 x i1> [[CMP]], <2 x i32> zeroinitializer, <2 x i32> [[CT]]
418 ; CHECK-NEXT:    ret <2 x i32> [[RES]]
420   %ct = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)
421   %cmp = icmp ne <2 x i32> %x, zeroinitializer
422   %res = select <2 x i1> %cmp, <2 x i32> %ct, <2 x i32> <i32 0, i32 0>
423   ret <2 x i32> %res
426 define <2 x i32> @test_cttz_bw_vec(<2 x i32> %x) {
427 ; CHECK-LABEL: @test_cttz_bw_vec(
428 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false)
429 ; CHECK-NEXT:    ret <2 x i32> [[TMP1]]
431   %ct = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 true)
432   %cmp = icmp ne <2 x i32> %x, zeroinitializer
433   %res = select <2 x i1> %cmp, <2 x i32> %ct, <2 x i32> <i32 32, i32 32>
434   ret <2 x i32> %res
437 define <2 x i32> @test_cttz_not_bw_vec(<2 x i32> %x) {
438 ; CHECK-LABEL: @test_cttz_not_bw_vec(
439 ; CHECK-NEXT:    [[CT:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 true)
440 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <2 x i32> [[X]], zeroinitializer
441 ; CHECK-NEXT:    [[RES:%.*]] = select <2 x i1> [[CMP]], <2 x i32> zeroinitializer, <2 x i32> [[CT]]
442 ; CHECK-NEXT:    ret <2 x i32> [[RES]]
444   %ct = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)
445   %cmp = icmp ne <2 x i32> %x, zeroinitializer
446   %res = select <2 x i1> %cmp, <2 x i32> %ct, <2 x i32> <i32 0, i32 0>
447   ret <2 x i32> %res
450 declare i16 @llvm.ctlz.i16(i16, i1)
451 declare i32 @llvm.ctlz.i32(i32, i1)
452 declare i64 @llvm.ctlz.i64(i64, i1)
453 declare i128 @llvm.ctlz.i128(i128, i1)
454 declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1)
455 declare i16 @llvm.cttz.i16(i16, i1)
456 declare i32 @llvm.cttz.i32(i32, i1)
457 declare i64 @llvm.cttz.i64(i64, i1)
458 declare i128 @llvm.cttz.i128(i128, i1)
459 declare <2 x i32> @llvm.cttz.v2i32(<2 x i32>, i1)