xref: /llvm-project/llvm/test/Transforms/InstCombine/select-with-extreme-eq-cond.ll (revision 6f8afafd308d37d9abc4af0801dd5a4451c13718)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4define i1 @compare_unsigned_min(i8 %x, i8 %y) {
5; CHECK-LABEL: define i1 @compare_unsigned_min(
6; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
7; CHECK-NEXT:  [[START:.*:]]
8; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[X]], [[Y]]
9; CHECK-NEXT:    ret i1 [[TMP2]]
10;
11start:
12  %cmp1 = icmp eq i8 %x, 0
13  %cmp2 = icmp ne i8 %y, 0
14  %cmp3 = icmp ult i8 %x, %y
15  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
16  ret i1 %result
17}
18
19define i1 @compare_signed_min(i8 %x, i8 %y) {
20; CHECK-LABEL: define i1 @compare_signed_min(
21; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
22; CHECK-NEXT:  [[START:.*:]]
23; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]]
24; CHECK-NEXT:    ret i1 [[TMP4]]
25;
26start:
27  %cmp1 = icmp eq i8 %x, -128
28  %cmp2 = icmp ne i8 %y, -128
29  %cmp3 = icmp slt i8 %x, %y
30  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
31  ret i1 %result
32}
33
34define i1 @compare_unsigned_max(i8 %x, i8 %y) {
35; CHECK-LABEL: define i1 @compare_unsigned_max(
36; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
37; CHECK-NEXT:  [[START:.*:]]
38; CHECK-NEXT:    [[TMP4:%.*]] = icmp ugt i8 [[X]], [[Y]]
39; CHECK-NEXT:    ret i1 [[TMP4]]
40;
41start:
42  %cmp1 = icmp eq i8 %x, 255
43  %cmp2 = icmp ne i8 %y, 255
44  %cmp3 = icmp ugt i8 %x, %y
45  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
46  ret i1 %result
47}
48
49define i1 @compare_signed_max(i8 %x, i8 %y) {
50; CHECK-LABEL: define i1 @compare_signed_max(
51; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
52; CHECK-NEXT:  [[START:.*:]]
53; CHECK-NEXT:    [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]]
54; CHECK-NEXT:    ret i1 [[TMP4]]
55;
56start:
57  %cmp1 = icmp eq i8 %x, 127
58  %cmp2 = icmp ne i8 %y, 127
59  %cmp3 = icmp sgt i8 %x, %y
60  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
61  ret i1 %result
62}
63
64define i1 @relational_cmp_unsigned_min(i8 %x, i8 %y) {
65; CHECK-LABEL: define i1 @relational_cmp_unsigned_min(
66; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
67; CHECK-NEXT:  [[START:.*:]]
68; CHECK-NEXT:    [[TMP4:%.*]] = icmp ult i8 [[X]], [[Y]]
69; CHECK-NEXT:    ret i1 [[TMP4]]
70;
71start:
72  %cmp1 = icmp ule i8 %x, 0
73  %cmp2 = icmp ugt i8 %y, 0
74  %cmp3 = icmp ult i8 %x, %y
75  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
76  ret i1 %result
77}
78
79define i1 @relational_cmp_signed_min(i8 %x, i8 %y) {
80; CHECK-LABEL: define i1 @relational_cmp_signed_min(
81; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
82; CHECK-NEXT:  [[START:.*:]]
83; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]]
84; CHECK-NEXT:    ret i1 [[TMP4]]
85;
86start:
87  %cmp1 = icmp sle i8 %x, -128
88  %cmp2 = icmp sgt i8 %y, -128
89  %cmp3 = icmp slt i8 %x, %y
90  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
91  ret i1 %result
92}
93
94define i1 @relational_cmp_unsigned_max(i8 %x, i8 %y) {
95; CHECK-LABEL: define i1 @relational_cmp_unsigned_max(
96; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
97; CHECK-NEXT:  [[START:.*:]]
98; CHECK-NEXT:    [[TMP4:%.*]] = icmp ugt i8 [[X]], [[Y]]
99; CHECK-NEXT:    ret i1 [[TMP4]]
100;
101start:
102  %cmp1 = icmp uge i8 %x, 255
103  %cmp2 = icmp ult i8 %y, 255
104  %cmp3 = icmp ugt i8 %x, %y
105  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
106  ret i1 %result
107}
108
109define i1 @relational_cmp_signed_max(i8 %x, i8 %y) {
110; CHECK-LABEL: define i1 @relational_cmp_signed_max(
111; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
112; CHECK-NEXT:  [[START:.*:]]
113; CHECK-NEXT:    [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]]
114; CHECK-NEXT:    ret i1 [[TMP4]]
115;
116start:
117  %cmp1 = icmp sge i8 %x, 127
118  %cmp2 = icmp slt i8 %y, 127
119  %cmp3 = icmp sgt i8 %x, %y
120  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
121  ret i1 %result
122}
123
124declare void @use(i1)
125
126define i1 @compare_signed_max_multiuse(i8 %x, i8 %y) {
127; CHECK-LABEL: define i1 @compare_signed_max_multiuse(
128; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
129; CHECK-NEXT:  [[START:.*:]]
130; CHECK-NEXT:    [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]]
131; CHECK-NEXT:    call void @use(i1 [[TMP4]])
132; CHECK-NEXT:    [[RESULT:%.*]] = icmp sgt i8 [[X]], [[Y]]
133; CHECK-NEXT:    ret i1 [[RESULT]]
134;
135start:
136  %cmp1 = icmp eq i8 %x, 127
137  %cmp2 = icmp ne i8 %y, 127
138  %cmp3 = icmp sgt i8 %x, %y
139  call void @use(i1 %cmp3)
140  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
141  ret i1 %result
142}
143
144define i1 @compare_signed_min_samesign(i8 %x, i8 %y) {
145; CHECK-LABEL: define i1 @compare_signed_min_samesign(
146; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
147; CHECK-NEXT:  [[START:.*:]]
148; CHECK-NEXT:    [[RESULT:%.*]] = icmp slt i8 [[X]], [[Y]]
149; CHECK-NEXT:    ret i1 [[RESULT]]
150;
151start:
152  %cmp1 = icmp eq i8 %x, -128
153  %cmp2 = icmp ne i8 %y, -128
154  %cmp3 = icmp samesign slt i8 %x, %y
155  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
156  ret i1 %result
157}
158
159define i1 @compare_flipped(i8 %x, i8 %y) {
160; CHECK-LABEL: define i1 @compare_flipped(
161; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
162; CHECK-NEXT:  [[START:.*:]]
163; CHECK-NEXT:    [[RESULT:%.*]] = icmp ult i8 [[X]], [[Y]]
164; CHECK-NEXT:    ret i1 [[RESULT]]
165;
166start:
167  %cmp1 = icmp eq i8 %x, 0
168  %cmp2 = icmp ne i8 %y, 0
169  %cmp3 = icmp ugt i8 %y, %x
170  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
171  ret i1 %result
172}
173
174define i1 @compare_swapped(i8 %x, i8 %y) {
175; CHECK-LABEL: define i1 @compare_swapped(
176; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
177; CHECK-NEXT:  [[START:.*:]]
178; CHECK-NEXT:    [[RESULT:%.*]] = icmp ult i8 [[X]], [[Y]]
179; CHECK-NEXT:    ret i1 [[RESULT]]
180;
181start:
182  %cmp1 = icmp ne i8 %x, 0
183  %cmp2 = icmp ne i8 %y, 0
184  %cmp3 = icmp ult i8 %x, %y
185  %result = select i1 %cmp1, i1 %cmp3, i1 %cmp2
186  ret i1 %result
187}
188
189define i1 @compare_swapped_flipped_unsigned_max(i8 %x, i8 %y) {
190; CHECK-LABEL: define i1 @compare_swapped_flipped_unsigned_max(
191; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
192; CHECK-NEXT:  [[START:.*:]]
193; CHECK-NEXT:    [[RESULT:%.*]] = icmp ugt i8 [[X]], [[Y]]
194; CHECK-NEXT:    ret i1 [[RESULT]]
195;
196start:
197  %cmp1 = icmp ne i8 %x, 255
198  %cmp2 = icmp ne i8 %y, 255
199  %cmp3 = icmp ult i8 %y, %x
200  %result = select i1 %cmp1, i1 %cmp3, i1 %cmp2
201  ret i1 %result
202}
203
204define i1 @compare_unsigned_min_illegal_type(i9 %x, i9 %y) {
205; CHECK-LABEL: define i1 @compare_unsigned_min_illegal_type(
206; CHECK-SAME: i9 [[X:%.*]], i9 [[Y:%.*]]) {
207; CHECK-NEXT:  [[START:.*:]]
208; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i9 [[X]], [[Y]]
209; CHECK-NEXT:    ret i1 [[TMP2]]
210;
211start:
212  %cmp1 = icmp eq i9 %x, 0
213  %cmp2 = icmp ne i9 %y, 0
214  %cmp3 = icmp ult i9 %x, %y
215  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
216  ret i1 %result
217}
218
219define i1 @compare_true_poison(i8 %x, i8 %y) {
220; CHECK-LABEL: define i1 @compare_true_poison(
221; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
222; CHECK-NEXT:  [[START:.*:]]
223; CHECK-NEXT:    [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]]
224; CHECK-NEXT:    ret i1 [[CMP3]]
225;
226start:
227  %cmp1 = icmp eq i8 %x, 0
228  %cmp2 = icmp ne i8 %y, 0
229  %cmp3 = icmp ult i8 %x, %y
230  %result = select i1 %cmp1, i1 poison, i1 %cmp3
231  ret i1 %result
232}
233
234define <2 x i1> @compare_vector(<2 x i8> %x, <2 x i8> %y) {
235; CHECK-LABEL: define <2 x i1> @compare_vector(
236; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) {
237; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult <2 x i8> [[X]], [[Y]]
238; CHECK-NEXT:    ret <2 x i1> [[TMP1]]
239;
240  %cmp1 = icmp eq <2 x i8> %x, zeroinitializer
241  %cmp2 = icmp ne <2 x i8> %y, zeroinitializer
242  %cmp3 = icmp ult <2 x i8> %x, %y
243  %result = select <2 x i1> %cmp1, <2 x i1> %cmp2, <2 x i1> %cmp3
244  ret <2 x i1> %result
245}
246
247define i1 @compare_pointer_negative(ptr %x, ptr %y) {
248; CHECK-LABEL: define i1 @compare_pointer_negative(
249; CHECK-SAME: ptr [[X:%.*]], ptr [[Y:%.*]]) {
250; CHECK-NEXT:  [[START:.*:]]
251; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[X]], inttoptr (i8 127 to ptr)
252; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne ptr [[Y]], inttoptr (i8 127 to ptr)
253; CHECK-NEXT:    [[TMP4:%.*]] = icmp sgt ptr [[X]], [[Y]]
254; CHECK-NEXT:    [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]]
255; CHECK-NEXT:    ret i1 [[RESULT]]
256;
257start:
258  %X = inttoptr i8 127 to ptr
259  %cmp1 = icmp eq ptr %x, %X
260  %cmp2 = icmp ne ptr %y, %X
261  %cmp3 = icmp sgt ptr %x, %y
262  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
263  ret i1 %result
264}
265
266define i1 @compare_float_negative(half %x, half %y) {
267; CHECK-LABEL: define i1 @compare_float_negative(
268; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]]) {
269; CHECK-NEXT:  [[START:.*:]]
270; CHECK-NEXT:    [[TMP2:%.*]] = fcmp oeq half [[X]], 0xH0000
271; CHECK-NEXT:    [[TMP3:%.*]] = fcmp one half [[Y]], 0xH0000
272; CHECK-NEXT:    [[TMP4:%.*]] = fcmp ult half [[X]], [[Y]]
273; CHECK-NEXT:    [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]]
274; CHECK-NEXT:    ret i1 [[RESULT]]
275;
276start:
277  %cmp1 = fcmp oeq half %x, 0.0
278  %cmp2 = fcmp one half %y, 0.0
279  %cmp3 = fcmp ult half %x, %y
280  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
281  ret i1 %result
282}
283
284define i1 @compare_unsigned_max_swapped_lhs_rhs_negative(i8 %x, i8 %y) {
285; CHECK-LABEL: define i1 @compare_unsigned_max_swapped_lhs_rhs_negative(
286; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
287; CHECK-NEXT:  [[START:.*:]]
288; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[X]], -1
289; CHECK-NEXT:    [[DOTNOT:%.*]] = icmp ne i8 [[Y]], -1
290; CHECK-NEXT:    [[RESULT:%.*]] = select i1 [[DOTNOT]], i1 [[TMP2]], i1 false
291; CHECK-NEXT:    ret i1 [[RESULT]]
292;
293start:
294  %cmp1 = icmp eq i8 %x, 255
295  %cmp2 = icmp ne i8 %y, 255
296  %cmp3 = icmp ugt i8 %x, %y
297  %result = select i1 %cmp2, i1 %cmp1, i1 %cmp3
298  ret i1 %result
299}
300
301define i1 @compare_signed_min_negative(i8 %x, i8 %y) {
302; CHECK-LABEL: define i1 @compare_signed_min_negative(
303; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
304; CHECK-NEXT:  [[START:.*:]]
305; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[X]], -127
306; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[Y]], -127
307; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]]
308; CHECK-NEXT:    [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]]
309; CHECK-NEXT:    ret i1 [[RESULT]]
310;
311start:
312  %cmp1 = icmp eq i8 %x, -127
313  %cmp2 = icmp ne i8 %y, -127
314  %cmp3 = icmp slt i8 %x, %y
315  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
316  ret i1 %result
317}
318
319define i1 @compare_unsigned_max_negative(i8 %x, i8 %y) {
320; CHECK-LABEL: define i1 @compare_unsigned_max_negative(
321; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
322; CHECK-NEXT:  [[START:.*:]]
323; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[X]], -1
324; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[Y]], -1
325; CHECK-NEXT:    [[TMP4:%.*]] = icmp ult i8 [[X]], [[Y]]
326; CHECK-NEXT:    [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]]
327; CHECK-NEXT:    ret i1 [[RESULT]]
328;
329start:
330  %cmp1 = icmp eq i8 %x, 255
331  %cmp2 = icmp ne i8 %y, 255
332  %cmp3 = icmp ult i8 %x, %y
333  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
334  ret i1 %result
335}
336
337define i1 @non_strict_op_negative(i8 %x, i8 %y) {
338; CHECK-LABEL: define i1 @non_strict_op_negative(
339; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
340; CHECK-NEXT:  [[START:.*:]]
341; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[X]], 0
342; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[Y]], 0
343; CHECK-NEXT:    [[TMP4:%.*]] = icmp ule i8 [[X]], [[Y]]
344; CHECK-NEXT:    [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]]
345; CHECK-NEXT:    ret i1 [[RESULT]]
346;
347start:
348  %cmp1 = icmp eq i8 %x, 0
349  %cmp2 = icmp ne i8 %y, 0
350  %cmp3 = icmp ule i8 %x, %y
351  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
352  ret i1 %result
353}
354
355define i1 @compare_poison_negative(i8 %x, i8 %y) {
356; CHECK-LABEL: define i1 @compare_poison_negative(
357; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
358; CHECK-NEXT:  [[START:.*:]]
359; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 [[Y]], 0
360; CHECK-NEXT:    ret i1 [[CMP2]]
361;
362start:
363  %cmp1 = icmp eq i8 %x, 0
364  %cmp2 = icmp ne i8 %y, 0
365  %result = select i1 %cmp1, i1 %cmp2, i1 poison
366  ret i1 %result
367}
368
369define i1 @mismatched_cond_lhs_negative(i8 %x, i8 %y, i8 %z) {
370; CHECK-LABEL: define i1 @mismatched_cond_lhs_negative(
371; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) {
372; CHECK-NEXT:  [[START:.*:]]
373; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[X]], 0
374; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 [[Y]], 0
375; CHECK-NEXT:    [[CMP3:%.*]] = icmp ult i8 [[Z]], [[Y]]
376; CHECK-NEXT:    [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]]
377; CHECK-NEXT:    ret i1 [[RESULT]]
378;
379start:
380  %cmp1 = icmp eq i8 %x, 0
381  %cmp2 = icmp ne i8 %y, 0
382  %cmp3 = icmp ult i8 %z, %y
383  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
384  ret i1 %result
385}
386
387define i1 @mismatched_trueval_lhs_negative(i8 %x, i8 %y, i8 %z) {
388; CHECK-LABEL: define i1 @mismatched_trueval_lhs_negative(
389; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) {
390; CHECK-NEXT:  [[START:.*:]]
391; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[X]], 0
392; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 [[Y]], 0
393; CHECK-NEXT:    [[CMP3:%.*]] = icmp ult i8 [[X]], [[Z]]
394; CHECK-NEXT:    [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]]
395; CHECK-NEXT:    ret i1 [[RESULT]]
396;
397start:
398  %cmp1 = icmp eq i8 %x, 0
399  %cmp2 = icmp ne i8 %y, 0
400  %cmp3 = icmp ult i8 %x, %z
401  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
402  ret i1 %result
403}
404
405define i1 @mismatched_constant_negative(i8 %x, i8 %y) {
406; CHECK-LABEL: define i1 @mismatched_constant_negative(
407; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
408; CHECK-NEXT:  [[START:.*:]]
409; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[X]], 0
410; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 [[Y]], 2
411; CHECK-NEXT:    [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]]
412; CHECK-NEXT:    [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]]
413; CHECK-NEXT:    ret i1 [[RESULT]]
414;
415start:
416  %cmp1 = icmp eq i8 %x, 0
417  %cmp2 = icmp ne i8 %y, 2
418  %cmp3 = icmp ult i8 %x, %y
419  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
420  ret i1 %result
421}
422
423define i1 @mismatched_constant_two_negative(i8 %x, i8 %y) {
424; CHECK-LABEL: define i1 @mismatched_constant_two_negative(
425; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
426; CHECK-NEXT:  [[START:.*:]]
427; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[X]], 2
428; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i8 [[Y]], 0
429; CHECK-NEXT:    [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]]
430; CHECK-NEXT:    [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]]
431; CHECK-NEXT:    ret i1 [[RESULT]]
432;
433start:
434  %cmp1 = icmp eq i8 %x, 2
435  %cmp2 = icmp ne i8 %y, 0
436  %cmp3 = icmp ult i8 %x, %y
437  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
438  ret i1 %result
439}
440
441define i1 @compare_eq_eq_negative(i8 %x, i8 %y) {
442; CHECK-LABEL: define i1 @compare_eq_eq_negative(
443; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
444; CHECK-NEXT:  [[START:.*:]]
445; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[X]], 0
446; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 [[Y]], 0
447; CHECK-NEXT:    [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]]
448; CHECK-NEXT:    [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]]
449; CHECK-NEXT:    ret i1 [[RESULT]]
450;
451start:
452  %cmp1 = icmp eq i8 %x, 0
453  %cmp2 = icmp eq i8 %y, 0
454  %cmp3 = icmp ult i8 %x, %y
455  %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3
456  ret i1 %result
457}
458