xref: /llvm-project/llvm/test/Transforms/InstCombine/cmp-intrinsic.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4declare i16 @llvm.bswap.i16(i16)
5declare i32 @llvm.bswap.i32(i32)
6declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>)
7declare i32 @llvm.cttz.i32(i32, i1)
8declare i33 @llvm.cttz.i33(i33, i1)
9declare i32 @llvm.ctlz.i32(i32, i1)
10declare i8 @llvm.umax.i8(i8, i8)
11declare i8 @llvm.uadd.sat.i8(i8, i8)
12declare i8 @llvm.ssub.sat.i8(i8, i8)
13declare i33 @llvm.ctlz.i33(i33, i1)
14declare i8 @llvm.ctpop.i8(i8)
15declare i11 @llvm.ctpop.i11(i11)
16declare <2 x i32> @llvm.cttz.v2i32(<2 x i32>, i1)
17declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1)
18declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>)
19declare i8 @llvm.bitreverse.i8(i8)
20declare <2 x i8> @llvm.bitreverse.v2i8(<2 x i8>)
21declare void @use6(i6)
22declare void @use8(i8)
23
24define i1 @bswap_eq_i16(i16 %x) {
25; CHECK-LABEL: @bswap_eq_i16(
26; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i16 [[X:%.*]], 256
27; CHECK-NEXT:    ret i1 [[CMP]]
28;
29  %bs = call i16 @llvm.bswap.i16(i16 %x)
30  %cmp = icmp eq i16 %bs, 1
31  ret i1 %cmp
32}
33
34define i1 @bswap_ne_i32(i32 %x) {
35; CHECK-LABEL: @bswap_ne_i32(
36; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[X:%.*]], 33554432
37; CHECK-NEXT:    ret i1 [[CMP]]
38;
39  %bs = tail call i32 @llvm.bswap.i32(i32 %x)
40  %cmp = icmp ne i32 %bs, 2
41  ret i1 %cmp
42}
43
44define <2 x i1> @bswap_eq_v2i64(<2 x i64> %x) {
45; CHECK-LABEL: @bswap_eq_v2i64(
46; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <2 x i64> [[X:%.*]], splat (i64 216172782113783808)
47; CHECK-NEXT:    ret <2 x i1> [[CMP]]
48;
49  %bs = tail call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %x)
50  %cmp = icmp eq <2 x i64> %bs, <i64 3, i64 3>
51  ret <2 x i1> %cmp
52}
53
54define i1 @ctlz_eq_bitwidth_i32(i32 %x) {
55; CHECK-LABEL: @ctlz_eq_bitwidth_i32(
56; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0
57; CHECK-NEXT:    ret i1 [[CMP]]
58;
59  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
60  %cmp = icmp eq i32 %lz, 32
61  ret i1 %cmp
62}
63
64define i1 @ctlz_eq_zero_i32(i32 %x) {
65; CHECK-LABEL: @ctlz_eq_zero_i32(
66; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 0
67; CHECK-NEXT:    ret i1 [[CMP]]
68;
69  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
70  %cmp = icmp eq i32 %lz, 0
71  ret i1 %cmp
72}
73
74define <2 x i1> @ctlz_ne_zero_v2i32(<2 x i32> %a) {
75; CHECK-LABEL: @ctlz_ne_zero_v2i32(
76; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt <2 x i32> [[A:%.*]], splat (i32 -1)
77; CHECK-NEXT:    ret <2 x i1> [[CMP]]
78;
79  %x = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false)
80  %cmp = icmp ne <2 x i32> %x, zeroinitializer
81  ret <2 x i1> %cmp
82}
83
84define i1 @ctlz_eq_bw_minus_1_i32(i32 %x) {
85; CHECK-LABEL: @ctlz_eq_bw_minus_1_i32(
86; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 1
87; CHECK-NEXT:    ret i1 [[CMP]]
88;
89  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
90  %cmp = icmp eq i32 %lz, 31
91  ret i1 %cmp
92}
93
94define <2 x i1> @ctlz_ne_bw_minus_1_v2i32(<2 x i32> %a) {
95; CHECK-LABEL: @ctlz_ne_bw_minus_1_v2i32(
96; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], splat (i32 1)
97; CHECK-NEXT:    ret <2 x i1> [[CMP]]
98;
99  %x = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false)
100  %cmp = icmp ne <2 x i32> %x, <i32 31, i32 31>
101  ret <2 x i1> %cmp
102}
103
104define i1 @ctlz_eq_other_i32(i32 %x) {
105; CHECK-LABEL: @ctlz_eq_other_i32(
106; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], -128
107; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP1]], 128
108; CHECK-NEXT:    ret i1 [[CMP]]
109;
110  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
111  %cmp = icmp eq i32 %lz, 24
112  ret i1 %cmp
113}
114
115define <2 x i1> @ctlz_ne_other_v2i32(<2 x i32> %a) {
116; CHECK-LABEL: @ctlz_ne_other_v2i32(
117; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i32> [[A:%.*]], splat (i32 -128)
118; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1]], splat (i32 128)
119; CHECK-NEXT:    ret <2 x i1> [[CMP]]
120;
121  %x = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false)
122  %cmp = icmp ne <2 x i32> %x, <i32 24, i32 24>
123  ret <2 x i1> %cmp
124}
125
126define i1 @ctlz_eq_other_i32_multiuse(i32 %x, ptr %p) {
127; CHECK-LABEL: @ctlz_eq_other_i32_multiuse(
128; CHECK-NEXT:    [[LZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false)
129; CHECK-NEXT:    store i32 [[LZ]], ptr [[P:%.*]], align 4
130; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[LZ]], 24
131; CHECK-NEXT:    ret i1 [[CMP]]
132;
133  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
134  store i32 %lz, ptr %p
135  %cmp = icmp eq i32 %lz, 24
136  ret i1 %cmp
137}
138
139define <2 x i1> @ctlz_ne_bitwidth_v2i32(<2 x i32> %a) {
140; CHECK-LABEL: @ctlz_ne_bitwidth_v2i32(
141; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], zeroinitializer
142; CHECK-NEXT:    ret <2 x i1> [[CMP]]
143;
144  %x = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false)
145  %cmp = icmp ne <2 x i32> %x, <i32 32, i32 32>
146  ret <2 x i1> %cmp
147}
148
149define i1 @ctlz_ugt_zero_i32(i32 %x) {
150; CHECK-LABEL: @ctlz_ugt_zero_i32(
151; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1
152; CHECK-NEXT:    ret i1 [[CMP]]
153;
154  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
155  %cmp = icmp ugt i32 %lz, 0
156  ret i1 %cmp
157}
158
159define i1 @ctlz_ugt_one_i32(i32 %x) {
160; CHECK-LABEL: @ctlz_ugt_one_i32(
161; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 1073741824
162; CHECK-NEXT:    ret i1 [[CMP]]
163;
164  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
165  %cmp = icmp ugt i32 %lz, 1
166  ret i1 %cmp
167}
168
169define i1 @ctlz_ugt_other_i32(i32 %x) {
170; CHECK-LABEL: @ctlz_ugt_other_i32(
171; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 32768
172; CHECK-NEXT:    ret i1 [[CMP]]
173;
174  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
175  %cmp = icmp ugt i32 %lz, 16
176  ret i1 %cmp
177}
178
179define i1 @ctlz_ugt_other_multiuse_i32(i32 %x, ptr %p) {
180; CHECK-LABEL: @ctlz_ugt_other_multiuse_i32(
181; CHECK-NEXT:    [[LZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false)
182; CHECK-NEXT:    store i32 [[LZ]], ptr [[P:%.*]], align 4
183; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X]], 32768
184; CHECK-NEXT:    ret i1 [[CMP]]
185;
186  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
187  store i32 %lz, ptr %p
188  %cmp = icmp ugt i32 %lz, 16
189  ret i1 %cmp
190}
191
192define i1 @ctlz_ugt_bw_minus_one_i32(i32 %x) {
193; CHECK-LABEL: @ctlz_ugt_bw_minus_one_i32(
194; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0
195; CHECK-NEXT:    ret i1 [[CMP]]
196;
197  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
198  %cmp = icmp ugt i32 %lz, 31
199  ret i1 %cmp
200}
201
202define <2 x i1> @ctlz_ult_one_v2i32(<2 x i32> %x) {
203; CHECK-LABEL: @ctlz_ult_one_v2i32(
204; CHECK-NEXT:    [[CMP:%.*]] = icmp slt <2 x i32> [[X:%.*]], zeroinitializer
205; CHECK-NEXT:    ret <2 x i1> [[CMP]]
206;
207  %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)
208  %cmp = icmp ult <2 x i32> %lz, <i32 1, i32 1>
209  ret <2 x i1> %cmp
210}
211
212define <2 x i1> @ctlz_ult_other_v2i32(<2 x i32> %x) {
213; CHECK-LABEL: @ctlz_ult_other_v2i32(
214; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt <2 x i32> [[X:%.*]], splat (i32 65535)
215; CHECK-NEXT:    ret <2 x i1> [[CMP]]
216;
217  %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)
218  %cmp = icmp ult <2 x i32> %lz, <i32 16, i32 16>
219  ret <2 x i1> %cmp
220}
221
222define <2 x i1> @ctlz_ult_other_multiuse_v2i32(<2 x i32> %x, ptr %p) {
223; CHECK-LABEL: @ctlz_ult_other_multiuse_v2i32(
224; CHECK-NEXT:    [[LZ:%.*]] = tail call range(i32 0, 33) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false)
225; CHECK-NEXT:    store <2 x i32> [[LZ]], ptr [[P:%.*]], align 8
226; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt <2 x i32> [[X]], splat (i32 65535)
227; CHECK-NEXT:    ret <2 x i1> [[CMP]]
228;
229  %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)
230  store <2 x i32> %lz, ptr %p
231  %cmp = icmp ult <2 x i32> %lz, <i32 16, i32 16>
232  ret <2 x i1> %cmp
233}
234
235define <2 x i1> @ctlz_ult_bw_minus_one_v2i32(<2 x i32> %x) {
236; CHECK-LABEL: @ctlz_ult_bw_minus_one_v2i32(
237; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt <2 x i32> [[X:%.*]], splat (i32 1)
238; CHECK-NEXT:    ret <2 x i1> [[CMP]]
239;
240  %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)
241  %cmp = icmp ult <2 x i32> %lz, <i32 31, i32 31>
242  ret <2 x i1> %cmp
243}
244
245define <2 x i1> @ctlz_ult_bitwidth_v2i32(<2 x i32> %x) {
246; CHECK-LABEL: @ctlz_ult_bitwidth_v2i32(
247; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], zeroinitializer
248; CHECK-NEXT:    ret <2 x i1> [[CMP]]
249;
250  %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)
251  %cmp = icmp ult <2 x i32> %lz, <i32 32, i32 32>
252  ret <2 x i1> %cmp
253}
254
255define i1 @cttz_ne_bitwidth_i33(i33 %x) {
256; CHECK-LABEL: @cttz_ne_bitwidth_i33(
257; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i33 [[X:%.*]], 0
258; CHECK-NEXT:    ret i1 [[CMP]]
259;
260  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
261  %cmp = icmp ne i33 %tz, 33
262  ret i1 %cmp
263}
264
265define <2 x i1> @cttz_eq_bitwidth_v2i32(<2 x i32> %a) {
266; CHECK-LABEL: @cttz_eq_bitwidth_v2i32(
267; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <2 x i32> [[A:%.*]], zeroinitializer
268; CHECK-NEXT:    ret <2 x i1> [[CMP]]
269;
270  %x = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false)
271  %cmp = icmp eq <2 x i32> %x, <i32 32, i32 32>
272  ret <2 x i1> %cmp
273}
274
275define i1 @cttz_eq_zero_i33(i33 %x) {
276; CHECK-LABEL: @cttz_eq_zero_i33(
277; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 1
278; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i33 [[TMP1]], 0
279; CHECK-NEXT:    ret i1 [[CMP]]
280;
281  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
282  %cmp = icmp eq i33 %tz, 0
283  ret i1 %cmp
284}
285
286define <2 x i1> @cttz_ne_zero_v2i32(<2 x i32> %a) {
287; CHECK-LABEL: @cttz_ne_zero_v2i32(
288; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i32> [[A:%.*]], splat (i32 1)
289; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <2 x i32> [[TMP1]], zeroinitializer
290; CHECK-NEXT:    ret <2 x i1> [[CMP]]
291;
292  %x = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false)
293  %cmp = icmp ne <2 x i32> %x, zeroinitializer
294  ret <2 x i1> %cmp
295}
296
297define i1 @cttz_eq_bw_minus_1_i33(i33 %x) {
298; CHECK-LABEL: @cttz_eq_bw_minus_1_i33(
299; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[X:%.*]], -4294967296
300; CHECK-NEXT:    ret i1 [[CMP]]
301;
302  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
303  %cmp = icmp eq i33 %tz, 32
304  ret i1 %cmp
305}
306
307define <2 x i1> @cttz_ne_bw_minus_1_v2i32(<2 x i32> %a) {
308; CHECK-LABEL: @cttz_ne_bw_minus_1_v2i32(
309; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], splat (i32 -2147483648)
310; CHECK-NEXT:    ret <2 x i1> [[CMP]]
311;
312  %x = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false)
313  %cmp = icmp ne <2 x i32> %x, <i32 31, i32 31>
314  ret <2 x i1> %cmp
315}
316
317define i1 @cttz_eq_other_i33(i33 %x) {
318; CHECK-LABEL: @cttz_eq_other_i33(
319; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 31
320; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TMP1]], 16
321; CHECK-NEXT:    ret i1 [[CMP]]
322;
323  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
324  %cmp = icmp eq i33 %tz, 4
325  ret i1 %cmp
326}
327
328define <2 x i1> @cttz_ne_other_v2i32(<2 x i32> %a) {
329; CHECK-LABEL: @cttz_ne_other_v2i32(
330; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i32> [[A:%.*]], splat (i32 31)
331; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1]], splat (i32 16)
332; CHECK-NEXT:    ret <2 x i1> [[CMP]]
333;
334  %x = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false)
335  %cmp = icmp ne <2 x i32> %x, <i32 4, i32 4>
336  ret <2 x i1> %cmp
337}
338
339define i1 @cttz_eq_other_i33_multiuse(i33 %x, ptr %p) {
340; CHECK-LABEL: @cttz_eq_other_i33_multiuse(
341; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false)
342; CHECK-NEXT:    store i33 [[TZ]], ptr [[P:%.*]], align 4
343; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TZ]], 4
344; CHECK-NEXT:    ret i1 [[CMP]]
345;
346  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
347  store i33 %tz, ptr %p
348  %cmp = icmp eq i33 %tz, 4
349  ret i1 %cmp
350}
351
352define i1 @cttz_ugt_zero_i33(i33 %x) {
353; CHECK-LABEL: @cttz_ugt_zero_i33(
354; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 1
355; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0
356; CHECK-NEXT:    ret i1 [[CMP]]
357;
358  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
359  %cmp = icmp ugt i33 %tz, 0
360  ret i1 %cmp
361}
362
363define i1 @cttz_ugt_one_i33(i33 %x) {
364; CHECK-LABEL: @cttz_ugt_one_i33(
365; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 3
366; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0
367; CHECK-NEXT:    ret i1 [[CMP]]
368;
369  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
370  %cmp = icmp ugt i33 %tz, 1
371  ret i1 %cmp
372}
373
374define i1 @cttz_ugt_other_i33(i33 %x) {
375; CHECK-LABEL: @cttz_ugt_other_i33(
376; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 131071
377; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0
378; CHECK-NEXT:    ret i1 [[CMP]]
379;
380  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
381  %cmp = icmp ugt i33 %tz, 16
382  ret i1 %cmp
383}
384
385define i1 @cttz_ugt_other_multiuse_i33(i33 %x, ptr %p) {
386; CHECK-LABEL: @cttz_ugt_other_multiuse_i33(
387; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false)
388; CHECK-NEXT:    store i33 [[TZ]], ptr [[P:%.*]], align 4
389; CHECK-NEXT:    [[CMP:%.*]] = icmp samesign ugt i33 [[TZ]], 16
390; CHECK-NEXT:    ret i1 [[CMP]]
391;
392  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
393  store i33 %tz, ptr %p
394  %cmp = icmp ugt i33 %tz, 16
395  ret i1 %cmp
396}
397
398define i1 @cttz_ugt_bw_minus_one_i33(i33 %x) {
399; CHECK-LABEL: @cttz_ugt_bw_minus_one_i33(
400; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[X:%.*]], 0
401; CHECK-NEXT:    ret i1 [[CMP]]
402;
403  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
404  %cmp = icmp ugt i33 %tz, 32
405  ret i1 %cmp
406}
407
408define <2 x i1> @cttz_ult_one_v2i32(<2 x i32> %x) {
409; CHECK-LABEL: @cttz_ult_one_v2i32(
410; CHECK-NEXT:    [[CMP:%.*]] = trunc <2 x i32> [[X:%.*]] to <2 x i1>
411; CHECK-NEXT:    ret <2 x i1> [[CMP]]
412;
413  %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)
414  %cmp = icmp ult <2 x i32> %tz, <i32 1, i32 1>
415  ret <2 x i1> %cmp
416}
417
418define <2 x i1> @cttz_ult_other_v2i32(<2 x i32> %x) {
419; CHECK-LABEL: @cttz_ult_other_v2i32(
420; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 65535)
421; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1]], zeroinitializer
422; CHECK-NEXT:    ret <2 x i1> [[CMP]]
423;
424  %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)
425  %cmp = icmp ult <2 x i32> %tz, <i32 16, i32 16>
426  ret <2 x i1> %cmp
427}
428
429define <2 x i1> @cttz_ult_other_multiuse_v2i32(<2 x i32> %x, ptr %p) {
430; CHECK-LABEL: @cttz_ult_other_multiuse_v2i32(
431; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i32 0, 33) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false)
432; CHECK-NEXT:    store <2 x i32> [[TZ]], ptr [[P:%.*]], align 8
433; CHECK-NEXT:    [[CMP:%.*]] = icmp samesign ult <2 x i32> [[TZ]], splat (i32 16)
434; CHECK-NEXT:    ret <2 x i1> [[CMP]]
435;
436  %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)
437  store <2 x i32> %tz, ptr %p
438  %cmp = icmp ult <2 x i32> %tz, <i32 16, i32 16>
439  ret <2 x i1> %cmp
440}
441
442define <2 x i1> @cttz_ult_bw_minus_one_v2i32(<2 x i32> %x) {
443; CHECK-LABEL: @cttz_ult_bw_minus_one_v2i32(
444; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 2147483647)
445; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1]], zeroinitializer
446; CHECK-NEXT:    ret <2 x i1> [[CMP]]
447;
448  %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)
449  %cmp = icmp ult <2 x i32> %tz, <i32 31, i32 31>
450  ret <2 x i1> %cmp
451}
452
453define <2 x i1> @cttz_ult_bitwidth_v2i32(<2 x i32> %x) {
454; CHECK-LABEL: @cttz_ult_bitwidth_v2i32(
455; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], zeroinitializer
456; CHECK-NEXT:    ret <2 x i1> [[CMP]]
457;
458  %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)
459  %cmp = icmp ult <2 x i32> %tz, <i32 32, i32 32>
460  ret <2 x i1> %cmp
461}
462
463define i1 @ctpop_eq_zero_i11(i11 %x) {
464; CHECK-LABEL: @ctpop_eq_zero_i11(
465; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i11 [[X:%.*]], 0
466; CHECK-NEXT:    ret i1 [[CMP]]
467;
468  %pop = tail call i11 @llvm.ctpop.i11(i11 %x)
469  %cmp = icmp eq i11 %pop, 0
470  ret i1 %cmp
471}
472
473define <2 x i1> @ctpop_ne_zero_v2i32(<2 x i32> %x) {
474; CHECK-LABEL: @ctpop_ne_zero_v2i32(
475; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], zeroinitializer
476; CHECK-NEXT:    ret <2 x i1> [[CMP]]
477;
478  %pop = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %x)
479  %cmp = icmp ne <2 x i32> %pop, zeroinitializer
480  ret <2 x i1> %cmp
481}
482
483define i1 @ctpop_eq_bitwidth_i8(i8 %x) {
484; CHECK-LABEL: @ctpop_eq_bitwidth_i8(
485; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[X:%.*]], -1
486; CHECK-NEXT:    ret i1 [[CMP]]
487;
488  %pop = tail call i8 @llvm.ctpop.i8(i8 %x)
489  %cmp = icmp eq i8 %pop, 8
490  ret i1 %cmp
491}
492
493define <2 x i1> @ctpop_ne_bitwidth_v2i32(<2 x i32> %x) {
494; CHECK-LABEL: @ctpop_ne_bitwidth_v2i32(
495; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], splat (i32 -1)
496; CHECK-NEXT:    ret <2 x i1> [[CMP]]
497;
498  %pop = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %x)
499  %cmp = icmp ne <2 x i32> %pop, <i32 32, i32 32>
500  ret <2 x i1> %cmp
501}
502
503define i1 @ctpop_ugt_bitwidth_minus_one_i8(i8 %x, ptr %p) {
504; CHECK-LABEL: @ctpop_ugt_bitwidth_minus_one_i8(
505; CHECK-NEXT:    [[POP:%.*]] = tail call range(i8 0, 9) i8 @llvm.ctpop.i8(i8 [[X:%.*]])
506; CHECK-NEXT:    store i8 [[POP]], ptr [[P:%.*]], align 1
507; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[X]], -1
508; CHECK-NEXT:    ret i1 [[CMP]]
509;
510  %pop = tail call i8 @llvm.ctpop.i8(i8 %x)
511  store i8 %pop, ptr %p
512  %cmp = icmp ugt i8 %pop, 7
513  ret i1 %cmp
514}
515
516define <2 x i1> @ctpop_ult_bitwidth_v2i32(<2 x i32> %x) {
517; CHECK-LABEL: @ctpop_ult_bitwidth_v2i32(
518; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], splat (i32 -1)
519; CHECK-NEXT:    ret <2 x i1> [[CMP]]
520;
521  %pop = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %x)
522  %cmp = icmp ult <2 x i32> %pop, <i32 32, i32 32>
523  ret <2 x i1> %cmp
524}
525
526define i1 @trunc_cttz_eq_other_i33_i15(i33 %x) {
527; CHECK-LABEL: @trunc_cttz_eq_other_i33_i15(
528; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 31
529; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TMP1]], 16
530; CHECK-NEXT:    ret i1 [[CMP]]
531;
532  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
533  %trunc = trunc i33 %tz to i15
534  %cmp = icmp eq i15 %trunc, 4
535  ret i1 %cmp
536}
537
538define i1 @trunc_cttz_ugt_other_i33_i15(i33 %x) {
539; CHECK-LABEL: @trunc_cttz_ugt_other_i33_i15(
540; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 15
541; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0
542; CHECK-NEXT:    ret i1 [[CMP]]
543;
544  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
545  %trunc = trunc i33 %tz to i15
546  %cmp = icmp ugt i15 %trunc, 3
547  ret i1 %cmp
548}
549
550define i1 @trunc_cttz_ult_other_i33_i6(i33 %x) {
551; CHECK-LABEL: @trunc_cttz_ult_other_i33_i6(
552; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 127
553; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i33 [[TMP1]], 0
554; CHECK-NEXT:    ret i1 [[CMP]]
555;
556  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 true)
557  %trunc = trunc i33 %tz to i6
558  %cmp = icmp ult i6 %trunc, 7
559  ret i1 %cmp
560}
561
562; negative case: log2(33 - is_zero_poison ? 1 : 0) + 1 > 5
563
564define i1 @trunc_cttz_ult_other_i33_i5(i33 %x) {
565; CHECK-LABEL: @trunc_cttz_ult_other_i33_i5(
566; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 true)
567; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i33 [[TZ]] to i5
568; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i5 [[TRUNC]], 7
569; CHECK-NEXT:    ret i1 [[CMP]]
570;
571  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 true)
572  %trunc = trunc i33 %tz to i5
573  %cmp = icmp ult i5 %trunc, 7
574  ret i1 %cmp
575}
576
577define i1 @trunc_cttz_true_ult_other_i32_i5(i32 %x) {
578; CHECK-LABEL: @trunc_cttz_true_ult_other_i32_i5(
579; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 127
580; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[TMP1]], 0
581; CHECK-NEXT:    ret i1 [[CMP]]
582;
583  %tz = tail call i32 @llvm.cttz.i32(i32 %x, i1 true)
584  %trunc = trunc i32 %tz to i5
585  %cmp = icmp ult i5 %trunc, 7
586  ret i1 %cmp
587}
588
589; negative case, is_zero_poison == false && log2(src bitwidth) == dest bitwidth
590
591define i1 @trunc_cttz_false_ult_other_i32_i5(i32 %x) {
592; CHECK-LABEL: @trunc_cttz_false_ult_other_i32_i5(
593; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false)
594; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i32 [[TZ]] to i5
595; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i5 [[TRUNC]], 7
596; CHECK-NEXT:    ret i1 [[CMP]]
597;
598  %tz = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)
599  %trunc = trunc i32 %tz to i5
600  %cmp = icmp ult i5 %trunc, 7
601  ret i1 %cmp
602}
603
604define i1 @trunc_cttz_false_ult_other_i32_i6(i32 %x) {
605; CHECK-LABEL: @trunc_cttz_false_ult_other_i32_i6(
606; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 127
607; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[TMP1]], 0
608; CHECK-NEXT:    ret i1 [[CMP]]
609;
610  %tz = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)
611  %trunc = trunc i32 %tz to i6
612  %cmp = icmp ult i6 %trunc, 7
613  ret i1 %cmp
614}
615
616; negative case, trunc is not one use
617
618define i1 @trunc_cttz_false_ult_other_i32_i6_extra_use(i32 %x) {
619; CHECK-LABEL: @trunc_cttz_false_ult_other_i32_i6_extra_use(
620; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false)
621; CHECK-NEXT:    [[TRUNC:%.*]] = trunc nuw i32 [[TZ]] to i6
622; CHECK-NEXT:    call void @use6(i6 [[TRUNC]])
623; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i6 [[TRUNC]], 7
624; CHECK-NEXT:    ret i1 [[CMP]]
625;
626  %tz = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)
627  %trunc = trunc i32 %tz to i6
628  call void @use6(i6 %trunc)
629  %cmp = icmp ult i6 %trunc, 7
630  ret i1 %cmp
631}
632
633define i1 @trunc_ctlz_ugt_zero_i32(i32 %x) {
634; CHECK-LABEL: @trunc_ctlz_ugt_zero_i32(
635; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1
636; CHECK-NEXT:    ret i1 [[CMP]]
637;
638  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
639  %trunc = trunc i32 %lz to i15
640  %cmp = icmp ugt i15 %trunc, 0
641  ret i1 %cmp
642}
643
644define i1 @trunc_ctlz_ugt_one_i32(i32 %x) {
645; CHECK-LABEL: @trunc_ctlz_ugt_one_i32(
646; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 1073741824
647; CHECK-NEXT:    ret i1 [[CMP]]
648;
649  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
650  %trunc = trunc i32 %lz to i15
651  %cmp = icmp ugt i15 %trunc, 1
652  ret i1 %cmp
653}
654
655define i1 @trunc_ctlz_ugt_other_i33_i6(i33 %x) {
656; CHECK-LABEL: @trunc_ctlz_ugt_other_i33_i6(
657; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i33 [[X:%.*]], 268435456
658; CHECK-NEXT:    ret i1 [[CMP]]
659;
660  %lz = tail call i33 @llvm.ctlz.i33(i33 %x, i1 true)
661  %trunc = trunc i33 %lz to i6
662  %cmp = icmp ugt i6 %trunc, 4
663  ret i1 %cmp
664}
665
666; negative case: log2(33 - is_zero_poison ? 1 : 0) + 1 > 5
667
668define i1 @trunc_ctlz_ugt_other_i33_i5(i33 %x) {
669; CHECK-LABEL: @trunc_ctlz_ugt_other_i33_i5(
670; CHECK-NEXT:    [[LZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.ctlz.i33(i33 [[X:%.*]], i1 true)
671; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i33 [[LZ]] to i5
672; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i5 [[TRUNC]], 4
673; CHECK-NEXT:    ret i1 [[CMP]]
674;
675  %lz = tail call i33 @llvm.ctlz.i33(i33 %x, i1 true)
676  %trunc = trunc i33 %lz to i5
677  %cmp = icmp ugt i5 %trunc, 4
678  ret i1 %cmp
679}
680
681define i1 @trunc_ctlz_true_ugt_other_i32_i5(i32 %x) {
682; CHECK-LABEL: @trunc_ctlz_true_ugt_other_i32_i5(
683; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 134217728
684; CHECK-NEXT:    ret i1 [[CMP]]
685;
686  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true)
687  %trunc = trunc i32 %lz to i5
688  %cmp = icmp ugt i5 %trunc, 4
689  ret i1 %cmp
690}
691
692; negative case, is_zero_poison == false && log2(src bitwidth) == dest bitwidth
693
694define i1 @trunc_ctlz_false_ugt_other_i32_i5(i32 %x) {
695; CHECK-LABEL: @trunc_ctlz_false_ugt_other_i32_i5(
696; CHECK-NEXT:    [[LZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false)
697; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i32 [[LZ]] to i5
698; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i5 [[TRUNC]], 4
699; CHECK-NEXT:    ret i1 [[CMP]]
700;
701  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
702  %trunc = trunc i32 %lz to i5
703  %cmp = icmp ugt i5 %trunc, 4
704  ret i1 %cmp
705}
706
707define i1 @trunc_ctlz_false_ugt_other_i32_i6(i32 %x) {
708; CHECK-LABEL: @trunc_ctlz_false_ugt_other_i32_i6(
709; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 134217728
710; CHECK-NEXT:    ret i1 [[CMP]]
711;
712  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
713  %trunc = trunc i32 %lz to i6
714  %cmp = icmp ugt i6 %trunc, 4
715  ret i1 %cmp
716}
717
718; negative case, trunc is not one use
719
720define i1 @trunc_ctlz_false_ugt_other_i32_i6_extra_use(i32 %x) {
721; CHECK-LABEL: @trunc_ctlz_false_ugt_other_i32_i6_extra_use(
722; CHECK-NEXT:    [[LZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false)
723; CHECK-NEXT:    [[TRUNC:%.*]] = trunc nuw i32 [[LZ]] to i6
724; CHECK-NEXT:    call void @use6(i6 [[TRUNC]])
725; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i6 [[TRUNC]], 4
726; CHECK-NEXT:    ret i1 [[CMP]]
727;
728  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
729  %trunc = trunc i32 %lz to i6
730  call void @use6(i6 %trunc)
731  %cmp = icmp ugt i6 %trunc, 4
732  ret i1 %cmp
733}
734
735define i1 @trunc_ctpop_eq_zero_i11(i11 %x) {
736; CHECK-LABEL: @trunc_ctpop_eq_zero_i11(
737; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i11 [[X:%.*]], 0
738; CHECK-NEXT:    ret i1 [[CMP]]
739;
740  %pop = tail call i11 @llvm.ctpop.i11(i11 %x)
741  %trunc = trunc i11 %pop to i5
742  %cmp = icmp eq i5 %trunc, 0
743  ret i1 %cmp
744}
745
746define i1 @trunc_ctpop_eq_bitwidth_i8(i8 %x) {
747; CHECK-LABEL: @trunc_ctpop_eq_bitwidth_i8(
748; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[X:%.*]], -1
749; CHECK-NEXT:    ret i1 [[CMP]]
750;
751  %pop = tail call i8 @llvm.ctpop.i8(i8 %x)
752  %trunc = trunc i8 %pop to i5
753  %cmp = icmp eq i5 %trunc, 8
754  ret i1 %cmp
755}
756
757; negative case: log2(33) + 1 > 4
758
759define i1 @trunc_negative_destbits_not_enough(i33 %x) {
760; CHECK-LABEL: @trunc_negative_destbits_not_enough(
761; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false)
762; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i33 [[TZ]] to i4
763; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i4 [[TRUNC]], 7
764; CHECK-NEXT:    ret i1 [[CMP]]
765;
766  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
767  %trunc = trunc i33 %tz to i4
768  %cmp = icmp ult i4 %trunc, 7
769  ret i1 %cmp
770}
771
772define i1 @bitreverse_ne_22(i8 %x) {
773; CHECK-LABEL: @bitreverse_ne_22(
774; CHECK-NEXT:    [[Z:%.*]] = icmp ne i8 [[X:%.*]], 104
775; CHECK-NEXT:    ret i1 [[Z]]
776;
777  %y = call i8 @llvm.bitreverse.i8(i8 %x)
778  %z = icmp ne i8 %y, 22
779  ret i1 %z
780}
781
782define i1 @bitreverse_ult_22_fail_not_equality_pred(i8 %x) {
783; CHECK-LABEL: @bitreverse_ult_22_fail_not_equality_pred(
784; CHECK-NEXT:    [[Y:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[X:%.*]])
785; CHECK-NEXT:    [[Z:%.*]] = icmp ult i8 [[Y]], 22
786; CHECK-NEXT:    ret i1 [[Z]]
787;
788  %y = call i8 @llvm.bitreverse.i8(i8 %x)
789  %z = icmp ult i8 %y, 22
790  ret i1 %z
791}
792
793define <2 x i1> @bitreverse_vec_eq_2_2(<2 x i8> %x) {
794; CHECK-LABEL: @bitreverse_vec_eq_2_2(
795; CHECK-NEXT:    [[Z:%.*]] = icmp eq <2 x i8> [[X:%.*]], splat (i8 64)
796; CHECK-NEXT:    ret <2 x i1> [[Z]]
797;
798  %y = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> %x)
799  %z = icmp eq <2 x i8> %y, <i8 2, i8 2>
800  ret <2 x i1> %z
801}
802
803define <2 x i1> @bitreverse_vec_eq_1_2_todo_no_splat(<2 x i8> %x) {
804; CHECK-LABEL: @bitreverse_vec_eq_1_2_todo_no_splat(
805; CHECK-NEXT:    [[Y:%.*]] = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> [[X:%.*]])
806; CHECK-NEXT:    [[Z:%.*]] = icmp eq <2 x i8> [[Y]], <i8 1, i8 2>
807; CHECK-NEXT:    ret <2 x i1> [[Z]]
808;
809  %y = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> %x)
810  %z = icmp eq <2 x i8> %y, <i8 1, i8 2>
811  ret <2 x i1> %z
812}
813
814define i1 @umax_eq_zero(i8 %x, i8 %y) {
815; CHECK-LABEL: @umax_eq_zero(
816; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]
817; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[TMP1]], 0
818; CHECK-NEXT:    ret i1 [[R]]
819;
820  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
821  %r = icmp eq i8 %m, 0
822  ret i1 %r
823}
824
825define i1 @umax_eq_1_fail(i8 %x, i8 %y) {
826; CHECK-LABEL: @umax_eq_1_fail(
827; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
828; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[M]], 1
829; CHECK-NEXT:    ret i1 [[R]]
830;
831  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
832  %r = icmp eq i8 %m, 1
833  ret i1 %r
834}
835
836define i1 @umax_sle_zero_fail(i8 %x, i8 %y) {
837; CHECK-LABEL: @umax_sle_zero_fail(
838; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
839; CHECK-NEXT:    [[R:%.*]] = icmp slt i8 [[M]], 1
840; CHECK-NEXT:    ret i1 [[R]]
841;
842  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
843  %r = icmp sle i8 %m, 0
844  ret i1 %r
845}
846
847define i1 @umax_ne_zero(i8 %x, i8 %y) {
848; CHECK-LABEL: @umax_ne_zero(
849; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]
850; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[TMP1]], 0
851; CHECK-NEXT:    ret i1 [[R]]
852;
853  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
854  %r = icmp ne i8 %m, 0
855  ret i1 %r
856}
857
858define i1 @umax_ne_zero_fail_multiuse(i8 %x, i8 %y) {
859; CHECK-LABEL: @umax_ne_zero_fail_multiuse(
860; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
861; CHECK-NEXT:    call void @use8(i8 [[M]])
862; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[M]], 0
863; CHECK-NEXT:    ret i1 [[R]]
864;
865  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
866  call void @use8(i8 %m)
867  %r = icmp ne i8 %m, 0
868  ret i1 %r
869}
870
871
872define i1 @uadd_sat_ne_zero_fail_multiuse(i8 %x, i8 %y) {
873; CHECK-LABEL: @uadd_sat_ne_zero_fail_multiuse(
874; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
875; CHECK-NEXT:    call void @use8(i8 [[M]])
876; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[M]], 0
877; CHECK-NEXT:    ret i1 [[R]]
878;
879  %m = call i8 @llvm.uadd.sat.i8(i8 %x, i8 %y)
880  call void @use8(i8 %m)
881  %r = icmp ne i8 %m, 0
882  ret i1 %r
883}
884
885
886define i1 @ssub_sat_ne_zero(i8 %x, i8 %y) {
887; CHECK-LABEL: @ssub_sat_ne_zero(
888; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]]
889; CHECK-NEXT:    ret i1 [[R]]
890;
891  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)
892  %r = icmp ne i8 %m, 0
893  ret i1 %r
894}
895
896define i1 @ssub_sat_ne_fail_nonzero(i8 %x, i8 %y) {
897; CHECK-LABEL: @ssub_sat_ne_fail_nonzero(
898; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
899; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[M]], 4
900; CHECK-NEXT:    ret i1 [[R]]
901;
902  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)
903  %r = icmp ne i8 %m, 4
904  ret i1 %r
905}
906
907define i1 @ssub_sat_eq_zero(i8 %x, i8 %y) {
908; CHECK-LABEL: @ssub_sat_eq_zero(
909; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]]
910; CHECK-NEXT:    ret i1 [[R]]
911;
912  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)
913  %r = icmp eq i8 %m, 0
914  ret i1 %r
915}
916
917define i1 @ssub_sat_sle_zero(i8 %x, i8 %y) {
918; CHECK-LABEL: @ssub_sat_sle_zero(
919; CHECK-NEXT:    [[R:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]]
920; CHECK-NEXT:    ret i1 [[R]]
921;
922  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)
923  %r = icmp sle i8 %m, 0
924  ret i1 %r
925}
926
927define i1 @ssub_sat_sge_zero(i8 %x, i8 %y) {
928; CHECK-LABEL: @ssub_sat_sge_zero(
929; CHECK-NEXT:    [[R:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]]
930; CHECK-NEXT:    ret i1 [[R]]
931;
932  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)
933  %r = icmp sge i8 %m, 0
934  ret i1 %r
935}
936
937define i1 @ssub_sat_slt_zero(i8 %x, i8 %y) {
938; CHECK-LABEL: @ssub_sat_slt_zero(
939; CHECK-NEXT:    [[R:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
940; CHECK-NEXT:    ret i1 [[R]]
941;
942  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)
943  %r = icmp slt i8 %m, 0
944  ret i1 %r
945}
946
947define i1 @ssub_sat_slt_neg1_fail(i8 %x, i8 %y) {
948; CHECK-LABEL: @ssub_sat_slt_neg1_fail(
949; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
950; CHECK-NEXT:    [[R:%.*]] = icmp slt i8 [[M]], -1
951; CHECK-NEXT:    ret i1 [[R]]
952;
953  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)
954  %r = icmp slt i8 %m, -1
955  ret i1 %r
956}
957
958define i1 @ssub_sat_sgt_zero(i8 %x, i8 %y) {
959; CHECK-LABEL: @ssub_sat_sgt_zero(
960; CHECK-NEXT:    [[R:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
961; CHECK-NEXT:    ret i1 [[R]]
962;
963  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)
964  %r = icmp sgt i8 %m, 0
965  ret i1 %r
966}
967
968define i1 @ssub_sat_sgt_one_fail(i8 %x, i8 %y) {
969; CHECK-LABEL: @ssub_sat_sgt_one_fail(
970; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
971; CHECK-NEXT:    [[R:%.*]] = icmp sgt i8 [[M]], 1
972; CHECK-NEXT:    ret i1 [[R]]
973;
974  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)
975  %r = icmp sgt i8 %m, 1
976  ret i1 %r
977}
978