xref: /llvm-project/llvm/test/Transforms/InstCombine/umin_cttz_ctlz.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4define i8 @umin_cttz_i8_zero_undefined(i8 %X) {
5; CHECK-LABEL: define i8 @umin_cttz_i8_zero_undefined(
6; CHECK-SAME: i8 [[X:%.*]]) {
7; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X]], 64
8; CHECK-NEXT:    [[RET:%.*]] = call range(i8 0, 7) i8 @llvm.cttz.i8(i8 [[TMP1]], i1 true)
9; CHECK-NEXT:    ret i8 [[RET]]
10;
11  %cttz = call i8 @llvm.cttz.i8(i8 %X, i1 true)
12  %ret = call i8 @llvm.umin.i8(i8 %cttz, i8 6)
13  ret i8 %ret
14}
15
16define i8 @umin_cttz_i8_zero_defined(i8 %X) {
17; CHECK-LABEL: define i8 @umin_cttz_i8_zero_defined(
18; CHECK-SAME: i8 [[X:%.*]]) {
19; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X]], 64
20; CHECK-NEXT:    [[RET:%.*]] = call range(i8 0, 7) i8 @llvm.cttz.i8(i8 [[TMP1]], i1 true)
21; CHECK-NEXT:    ret i8 [[RET]]
22;
23  %cttz = call i8 @llvm.cttz.i8(i8 %X, i1 false)
24  %ret = call i8 @llvm.umin.i8(i8 %cttz, i8 6)
25  ret i8 %ret
26}
27
28define i8 @umin_cttz_i8_commuted_zero_undefined(i8 %X) {
29; CHECK-LABEL: define i8 @umin_cttz_i8_commuted_zero_undefined(
30; CHECK-SAME: i8 [[X:%.*]]) {
31; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X]], 64
32; CHECK-NEXT:    [[RET:%.*]] = call range(i8 0, 7) i8 @llvm.cttz.i8(i8 [[TMP1]], i1 true)
33; CHECK-NEXT:    ret i8 [[RET]]
34;
35  %cttz = call i8 @llvm.cttz.i8(i8 %X, i1 true)
36  %ret = call i8 @llvm.umin.i8(i8 6, i8 %cttz)
37  ret i8 %ret
38}
39
40define i8 @umin_cttz_i8_negative_ge_bitwidth_zero_undefined(i8 %X) {
41; CHECK-LABEL: define i8 @umin_cttz_i8_negative_ge_bitwidth_zero_undefined(
42; CHECK-SAME: i8 [[X:%.*]]) {
43; CHECK-NEXT:    [[CTTZ:%.*]] = call range(i8 0, 9) i8 @llvm.cttz.i8(i8 [[X]], i1 true)
44; CHECK-NEXT:    ret i8 [[CTTZ]]
45;
46  %cttz = call i8 @llvm.cttz.i8(i8 %X, i1 true)
47  %ret = call i8 @llvm.umin.i8(i8 %cttz, i8 10)
48  ret i8 %ret
49}
50
51define i16 @umin_cttz_i16_zero_undefined(i16 %X) {
52; CHECK-LABEL: define i16 @umin_cttz_i16_zero_undefined(
53; CHECK-SAME: i16 [[X:%.*]]) {
54; CHECK-NEXT:    [[TMP1:%.*]] = or i16 [[X]], 64
55; CHECK-NEXT:    [[RET:%.*]] = call range(i16 0, 7) i16 @llvm.cttz.i16(i16 [[TMP1]], i1 true)
56; CHECK-NEXT:    ret i16 [[RET]]
57;
58  %cttz = call i16 @llvm.cttz.i16(i16 %X, i1 true)
59  %ret = call i16 @llvm.umin.i16(i16 %cttz, i16 6)
60  ret i16 %ret
61}
62
63define i32 @umin_cttz_i32_zero_undefined(i32 %X) {
64; CHECK-LABEL: define i32 @umin_cttz_i32_zero_undefined(
65; CHECK-SAME: i32 [[X:%.*]]) {
66; CHECK-NEXT:    [[TMP1:%.*]] = or i32 [[X]], 64
67; CHECK-NEXT:    [[RET:%.*]] = call range(i32 0, 7) i32 @llvm.cttz.i32(i32 [[TMP1]], i1 true)
68; CHECK-NEXT:    ret i32 [[RET]]
69;
70  %cttz = call i32 @llvm.cttz.i32(i32 %X, i1 true)
71  %ret = call i32 @llvm.umin.i32(i32 %cttz, i32 6)
72  ret i32 %ret
73}
74
75define i64 @umin_cttz_i64_zero_undefined(i64 %X) {
76; CHECK-LABEL: define i64 @umin_cttz_i64_zero_undefined(
77; CHECK-SAME: i64 [[X:%.*]]) {
78; CHECK-NEXT:    [[TMP1:%.*]] = or i64 [[X]], 64
79; CHECK-NEXT:    [[RET:%.*]] = call range(i64 0, 7) i64 @llvm.cttz.i64(i64 [[TMP1]], i1 true)
80; CHECK-NEXT:    ret i64 [[RET]]
81;
82  %cttz = call i64 @llvm.cttz.i64(i64 %X, i1 true)
83  %ret = call i64 @llvm.umin.i64(i64 %cttz, i64 6)
84  ret i64 %ret
85}
86
87define i1 @umin_cttz_i1_zero_undefined(i1 %X) {
88; CHECK-LABEL: define i1 @umin_cttz_i1_zero_undefined(
89; CHECK-SAME: i1 [[X:%.*]]) {
90; CHECK-NEXT:    ret i1 false
91;
92  %cttz = call i1 @llvm.cttz.i1(i1 %X, i1 true)
93  %ret = call i1 @llvm.umin.i1(i1 %cttz, i1 1)
94  ret i1 %ret
95}
96
97define i1 @umin_cttz_i1_zero_defined(i1 %X) {
98; CHECK-LABEL: define i1 @umin_cttz_i1_zero_defined(
99; CHECK-SAME: i1 [[X:%.*]]) {
100; CHECK-NEXT:    [[CTTZ:%.*]] = xor i1 [[X]], true
101; CHECK-NEXT:    ret i1 [[CTTZ]]
102;
103  %cttz = call i1 @llvm.cttz.i1(i1 %X, i1 false)
104  %ret = call i1 @llvm.umin.i1(i1 %cttz, i1 1)
105  ret i1 %ret
106}
107
108define <2 x i32> @umin_cttz_2xi32_splat_zero_undefined(<2 x i32> %X) {
109; CHECK-LABEL: define <2 x i32> @umin_cttz_2xi32_splat_zero_undefined(
110; CHECK-SAME: <2 x i32> [[X:%.*]]) {
111; CHECK-NEXT:    [[TMP1:%.*]] = or <2 x i32> [[X]], splat (i32 64)
112; CHECK-NEXT:    [[RET:%.*]] = call range(i32 0, 7) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[TMP1]], i1 true)
113; CHECK-NEXT:    ret <2 x i32> [[RET]]
114;
115  %cttz = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %X, i1 true)
116  %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %cttz, <2 x i32> <i32 6, i32 6>)
117  ret <2 x i32> %ret
118}
119
120define <2 x i32> @umin_cttz_2xi32_splat_poison_zero_undefined(<2 x i32> %X) {
121; CHECK-LABEL: define <2 x i32> @umin_cttz_2xi32_splat_poison_zero_undefined(
122; CHECK-SAME: <2 x i32> [[X:%.*]]) {
123; CHECK-NEXT:    [[TMP1:%.*]] = or <2 x i32> [[X]], <i32 64, i32 poison>
124; CHECK-NEXT:    [[RET:%.*]] = call range(i32 0, 7) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[TMP1]], i1 true)
125; CHECK-NEXT:    ret <2 x i32> [[RET]]
126;
127  %cttz = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %X, i1 true)
128  %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %cttz, <2 x i32> <i32 6, i32 poison>)
129  ret <2 x i32> %ret
130}
131
132define <2 x i32> @umin_cttz_2xi32_no_splat_all_lt_bitwidth_zero_undefined(<2 x i32> %X) {
133; CHECK-LABEL: define <2 x i32> @umin_cttz_2xi32_no_splat_all_lt_bitwidth_zero_undefined(
134; CHECK-SAME: <2 x i32> [[X:%.*]]) {
135; CHECK-NEXT:    [[TMP1:%.*]] = or <2 x i32> [[X]], <i32 64, i32 1>
136; CHECK-NEXT:    [[RET:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[TMP1]], i1 true)
137; CHECK-NEXT:    ret <2 x i32> [[RET]]
138;
139  %cttz = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %X, i1 true)
140  %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %cttz, <2 x i32> <i32 6, i32 0>)
141  ret <2 x i32> %ret
142}
143
144define <2 x i32> @umin_cttz_2xi32_negative_no_splat_some_lt_bitwidth_zero_undefined(<2 x i32> %X) {
145; CHECK-LABEL: define <2 x i32> @umin_cttz_2xi32_negative_no_splat_some_lt_bitwidth_zero_undefined(
146; CHECK-SAME: <2 x i32> [[X:%.*]]) {
147; CHECK-NEXT:    [[RET:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X]], i1 true)
148; CHECK-NEXT:    [[RET1:%.*]] = call <2 x i32> @llvm.umin.v2i32(<2 x i32> [[RET]], <2 x i32> <i32 6, i32 64>)
149; CHECK-NEXT:    ret <2 x i32> [[RET1]]
150;
151  %cttz = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %X, i1 true)
152  %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %cttz, <2 x i32> <i32 6, i32 64>)
153  ret <2 x i32> %ret
154}
155
156define <2 x i32> @umin_cttz_2xi32_negative_no_splat_none_lt_bitwidth_zero_undefined(<2 x i32> %X) {
157; CHECK-LABEL: define <2 x i32> @umin_cttz_2xi32_negative_no_splat_none_lt_bitwidth_zero_undefined(
158; CHECK-SAME: <2 x i32> [[X:%.*]]) {
159; CHECK-NEXT:    [[RET:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X]], i1 true)
160; CHECK-NEXT:    [[RET1:%.*]] = call <2 x i32> @llvm.umin.v2i32(<2 x i32> [[RET]], <2 x i32> <i32 32, i32 64>)
161; CHECK-NEXT:    ret <2 x i32> [[RET1]]
162;
163  %cttz = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %X, i1 true)
164  %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %cttz, <2 x i32> <i32 32, i32 64>)
165  ret <2 x i32> %ret
166}
167
168define i16 @umin_cttz_i16_negative_non_constant(i16 %X, i16 %Y) {
169; CHECK-LABEL: define i16 @umin_cttz_i16_negative_non_constant(
170; CHECK-SAME: i16 [[X:%.*]], i16 [[Y:%.*]]) {
171; CHECK-NEXT:    [[CTTZ:%.*]] = call range(i16 0, 17) i16 @llvm.cttz.i16(i16 [[X]], i1 true)
172; CHECK-NEXT:    [[RET:%.*]] = call i16 @llvm.umin.i16(i16 [[CTTZ]], i16 [[Y]])
173; CHECK-NEXT:    ret i16 [[RET]]
174;
175  %cttz = call i16 @llvm.cttz.i16(i16 %X, i1 true)
176  %ret = call i16 @llvm.umin.i16(i16 %cttz, i16 %Y)
177  ret i16 %ret
178}
179
180define i16 @umin_cttz_i16_negative_two_uses(i16 %X) {
181; CHECK-LABEL: define i16 @umin_cttz_i16_negative_two_uses(
182; CHECK-SAME: i16 [[X:%.*]]) {
183; CHECK-NEXT:    [[CTTZ:%.*]] = call range(i16 0, 17) i16 @llvm.cttz.i16(i16 [[X]], i1 true)
184; CHECK-NEXT:    [[OP0:%.*]] = call i16 @llvm.umin.i16(i16 [[CTTZ]], i16 6)
185; CHECK-NEXT:    [[RET:%.*]] = add nuw nsw i16 [[CTTZ]], [[OP0]]
186; CHECK-NEXT:    ret i16 [[RET]]
187;
188  %cttz = call i16 @llvm.cttz.i16(i16 %X, i1 true)
189  %op0 = call i16 @llvm.umin.i16(i16 %cttz, i16 6)
190  %ret = add i16 %cttz, %op0
191  ret i16 %ret
192}
193
194define i8 @umin_ctlz_i8_zero_undefined(i8 %X) {
195; CHECK-LABEL: define i8 @umin_ctlz_i8_zero_undefined(
196; CHECK-SAME: i8 [[X:%.*]]) {
197; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X]], 2
198; CHECK-NEXT:    [[RET:%.*]] = call range(i8 0, 7) i8 @llvm.ctlz.i8(i8 [[TMP1]], i1 true)
199; CHECK-NEXT:    ret i8 [[RET]]
200;
201  %ctlz = call i8 @llvm.ctlz.i8(i8 %X, i1 true)
202  %ret = call i8 @llvm.umin.i8(i8 %ctlz, i8 6)
203  ret i8 %ret
204}
205
206define i8 @umin_ctlz_i8_zero_defined(i8 %X) {
207; CHECK-LABEL: define i8 @umin_ctlz_i8_zero_defined(
208; CHECK-SAME: i8 [[X:%.*]]) {
209; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X]], 2
210; CHECK-NEXT:    [[RET:%.*]] = call range(i8 0, 7) i8 @llvm.ctlz.i8(i8 [[TMP1]], i1 true)
211; CHECK-NEXT:    ret i8 [[RET]]
212;
213  %ctlz = call i8 @llvm.ctlz.i8(i8 %X, i1 false)
214  %ret = call i8 @llvm.umin.i8(i8 %ctlz, i8 6)
215  ret i8 %ret
216}
217
218define i8 @umin_ctlz_i8_commuted_zero_undefined(i8 %X) {
219; CHECK-LABEL: define i8 @umin_ctlz_i8_commuted_zero_undefined(
220; CHECK-SAME: i8 [[X:%.*]]) {
221; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X]], 2
222; CHECK-NEXT:    [[RET:%.*]] = call range(i8 0, 7) i8 @llvm.ctlz.i8(i8 [[TMP1]], i1 true)
223; CHECK-NEXT:    ret i8 [[RET]]
224;
225  %ctlz = call i8 @llvm.ctlz.i8(i8 %X, i1 true)
226  %ret = call i8 @llvm.umin.i8(i8 6, i8 %ctlz)
227  ret i8 %ret
228}
229
230define i8 @umin_ctlz_i8_negative_ge_bitwidth_zero_undefined(i8 %X) {
231; CHECK-LABEL: define i8 @umin_ctlz_i8_negative_ge_bitwidth_zero_undefined(
232; CHECK-SAME: i8 [[X:%.*]]) {
233; CHECK-NEXT:    [[CTLZ:%.*]] = call range(i8 0, 9) i8 @llvm.ctlz.i8(i8 [[X]], i1 true)
234; CHECK-NEXT:    ret i8 [[CTLZ]]
235;
236  %ctlz = call i8 @llvm.ctlz.i8(i8 %X, i1 true)
237  %ret = call i8 @llvm.umin.i8(i8 %ctlz, i8 10)
238  ret i8 %ret
239}
240
241define i16 @umin_ctlz_i16_zero_undefined(i16 %X) {
242; CHECK-LABEL: define i16 @umin_ctlz_i16_zero_undefined(
243; CHECK-SAME: i16 [[X:%.*]]) {
244; CHECK-NEXT:    [[TMP1:%.*]] = or i16 [[X]], 512
245; CHECK-NEXT:    [[RET:%.*]] = call range(i16 0, 7) i16 @llvm.ctlz.i16(i16 [[TMP1]], i1 true)
246; CHECK-NEXT:    ret i16 [[RET]]
247;
248  %ctlz = call i16 @llvm.ctlz.i16(i16 %X, i1 true)
249  %ret = call i16 @llvm.umin.i16(i16 %ctlz, i16 6)
250  ret i16 %ret
251}
252
253define i32 @umin_ctlz_i32_zero_undefined(i32 %X) {
254; CHECK-LABEL: define i32 @umin_ctlz_i32_zero_undefined(
255; CHECK-SAME: i32 [[X:%.*]]) {
256; CHECK-NEXT:    [[TMP1:%.*]] = or i32 [[X]], 33554432
257; CHECK-NEXT:    [[RET:%.*]] = call range(i32 0, 7) i32 @llvm.ctlz.i32(i32 [[TMP1]], i1 true)
258; CHECK-NEXT:    ret i32 [[RET]]
259;
260  %ctlz = call i32 @llvm.ctlz.i32(i32 %X, i1 true)
261  %ret = call i32 @llvm.umin.i32(i32 %ctlz, i32 6)
262  ret i32 %ret
263}
264
265define i64 @umin_ctlz_i64_zero_undefined(i64 %X) {
266; CHECK-LABEL: define i64 @umin_ctlz_i64_zero_undefined(
267; CHECK-SAME: i64 [[X:%.*]]) {
268; CHECK-NEXT:    [[TMP1:%.*]] = or i64 [[X]], 144115188075855872
269; CHECK-NEXT:    [[RET:%.*]] = call range(i64 0, 7) i64 @llvm.ctlz.i64(i64 [[TMP1]], i1 true)
270; CHECK-NEXT:    ret i64 [[RET]]
271;
272  %ctlz = call i64 @llvm.ctlz.i64(i64 %X, i1 true)
273  %ret = call i64 @llvm.umin.i64(i64 %ctlz, i64 6)
274  ret i64 %ret
275}
276
277define i1 @umin_ctlz_i1_zero_undefined(i1 %X) {
278; CHECK-LABEL: define i1 @umin_ctlz_i1_zero_undefined(
279; CHECK-SAME: i1 [[X:%.*]]) {
280; CHECK-NEXT:    ret i1 false
281;
282  %ctlz = call i1 @llvm.ctlz.i1(i1 %X, i1 true)
283  %ret = call i1 @llvm.umin.i1(i1 %ctlz, i1 1)
284  ret i1 %ret
285}
286
287define i1 @umin_ctlz_i1_zero_defined(i1 %X) {
288; CHECK-LABEL: define i1 @umin_ctlz_i1_zero_defined(
289; CHECK-SAME: i1 [[X:%.*]]) {
290; CHECK-NEXT:    [[CTLZ:%.*]] = xor i1 [[X]], true
291; CHECK-NEXT:    ret i1 [[CTLZ]]
292;
293  %ctlz = call i1 @llvm.ctlz.i1(i1 %X, i1 false)
294  %ret = call i1 @llvm.umin.i1(i1 %ctlz, i1 1)
295  ret i1 %ret
296}
297
298define <2 x i32> @umin_ctlz_2xi32_splat_zero_undefined(<2 x i32> %X) {
299; CHECK-LABEL: define <2 x i32> @umin_ctlz_2xi32_splat_zero_undefined(
300; CHECK-SAME: <2 x i32> [[X:%.*]]) {
301; CHECK-NEXT:    [[TMP1:%.*]] = or <2 x i32> [[X]], splat (i32 33554432)
302; CHECK-NEXT:    [[RET:%.*]] = call range(i32 0, 7) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[TMP1]], i1 true)
303; CHECK-NEXT:    ret <2 x i32> [[RET]]
304;
305  %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %X, i1 true)
306  %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %ctlz, <2 x i32> <i32 6, i32 6>)
307  ret <2 x i32> %ret
308}
309
310define <2 x i32> @umin_ctlz_2xi32_splat_poison_zero_undefined(<2 x i32> %X) {
311; CHECK-LABEL: define <2 x i32> @umin_ctlz_2xi32_splat_poison_zero_undefined(
312; CHECK-SAME: <2 x i32> [[X:%.*]]) {
313; CHECK-NEXT:    [[TMP1:%.*]] = or <2 x i32> [[X]], <i32 33554432, i32 poison>
314; CHECK-NEXT:    [[RET:%.*]] = call range(i32 0, 7) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[TMP1]], i1 true)
315; CHECK-NEXT:    ret <2 x i32> [[RET]]
316;
317  %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %X, i1 true)
318  %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %ctlz, <2 x i32> <i32 6, i32 poison>)
319  ret <2 x i32> %ret
320}
321
322define <2 x i32> @umin_ctlz_2xi32_no_splat_all_lt_bitwidth_zero_undefined(<2 x i32> %X) {
323; CHECK-LABEL: define <2 x i32> @umin_ctlz_2xi32_no_splat_all_lt_bitwidth_zero_undefined(
324; CHECK-SAME: <2 x i32> [[X:%.*]]) {
325; CHECK-NEXT:    [[TMP1:%.*]] = or <2 x i32> [[X]], <i32 33554432, i32 -2147483648>
326; CHECK-NEXT:    [[RET:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[TMP1]], i1 true)
327; CHECK-NEXT:    ret <2 x i32> [[RET]]
328;
329  %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %X, i1 true)
330  %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %ctlz, <2 x i32> <i32 6, i32 0>)
331  ret <2 x i32> %ret
332}
333
334define <2 x i32> @umin_ctlz_2xi32_negative_no_splat_some_lt_bitwidth_zero_undefined(<2 x i32> %X) {
335; CHECK-LABEL: define <2 x i32> @umin_ctlz_2xi32_negative_no_splat_some_lt_bitwidth_zero_undefined(
336; CHECK-SAME: <2 x i32> [[X:%.*]]) {
337; CHECK-NEXT:    [[RET:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X]], i1 true)
338; CHECK-NEXT:    [[RET1:%.*]] = call <2 x i32> @llvm.umin.v2i32(<2 x i32> [[RET]], <2 x i32> <i32 6, i32 64>)
339; CHECK-NEXT:    ret <2 x i32> [[RET1]]
340;
341  %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %X, i1 true)
342  %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %ctlz, <2 x i32> <i32 6, i32 64>)
343  ret <2 x i32> %ret
344}
345
346define <2 x i32> @umin_ctlz_2xi32_negative_no_splat_none_lt_bitwidth_zero_undefined(<2 x i32> %X) {
347; CHECK-LABEL: define <2 x i32> @umin_ctlz_2xi32_negative_no_splat_none_lt_bitwidth_zero_undefined(
348; CHECK-SAME: <2 x i32> [[X:%.*]]) {
349; CHECK-NEXT:    [[RET:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X]], i1 true)
350; CHECK-NEXT:    [[RET1:%.*]] = call <2 x i32> @llvm.umin.v2i32(<2 x i32> [[RET]], <2 x i32> <i32 32, i32 64>)
351; CHECK-NEXT:    ret <2 x i32> [[RET1]]
352;
353  %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %X, i1 true)
354  %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %ctlz, <2 x i32> <i32 32, i32 64>)
355  ret <2 x i32> %ret
356}
357
358define i16 @umin_ctlz_i16_negative_non_constant(i16 %X, i16 %Y) {
359; CHECK-LABEL: define i16 @umin_ctlz_i16_negative_non_constant(
360; CHECK-SAME: i16 [[X:%.*]], i16 [[Y:%.*]]) {
361; CHECK-NEXT:    [[CTLZ:%.*]] = call range(i16 0, 17) i16 @llvm.ctlz.i16(i16 [[X]], i1 true)
362; CHECK-NEXT:    [[RET:%.*]] = call i16 @llvm.umin.i16(i16 [[CTLZ]], i16 [[Y]])
363; CHECK-NEXT:    ret i16 [[RET]]
364;
365  %ctlz = call i16 @llvm.ctlz.i16(i16 %X, i1 true)
366  %ret = call i16 @llvm.umin.i16(i16 %ctlz, i16 %Y)
367  ret i16 %ret
368}
369
370define i16 @umin_ctlz_i16_negative_two_uses(i16 %X) {
371; CHECK-LABEL: define i16 @umin_ctlz_i16_negative_two_uses(
372; CHECK-SAME: i16 [[X:%.*]]) {
373; CHECK-NEXT:    [[CTTZ:%.*]] = call range(i16 0, 17) i16 @llvm.ctlz.i16(i16 [[X]], i1 true)
374; CHECK-NEXT:    [[OP0:%.*]] = call i16 @llvm.umin.i16(i16 [[CTTZ]], i16 6)
375; CHECK-NEXT:    [[RET:%.*]] = add nuw nsw i16 [[CTTZ]], [[OP0]]
376; CHECK-NEXT:    ret i16 [[RET]]
377;
378  %ctlz = call i16 @llvm.ctlz.i16(i16 %X, i1 true)
379  %op0 = call i16 @llvm.umin.i16(i16 %ctlz, i16 6)
380  %ret = add i16 %ctlz, %op0
381  ret i16 %ret
382}
383