Skip to content

Commit 9fdd0b1

Browse files
committed
[InstCombine][NFC] Add Tests for Minimum over Trailing/Leading Bits Counts
1 parent 256d76f commit 9fdd0b1

File tree

1 file changed

+355
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)