1; RUN: opt < %s -instcombine -S | FileCheck %s
2
3target datalayout =
4"e-p:64:64:64-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
5
6define i32 @test1(i32 %X) {
7entry:
8        icmp slt i32 %X, 0              ; <i1>:0 [#uses=1]
9        zext i1 %0 to i32               ; <i32>:1 [#uses=1]
10        ret i32 %1
11; CHECK-LABEL: @test1(
12; CHECK: lshr i32 %X, 31
13; CHECK-NEXT: ret i32
14}
15
16define i32 @test2(i32 %X) {
17entry:
18        icmp ult i32 %X, -2147483648            ; <i1>:0 [#uses=1]
19        zext i1 %0 to i32               ; <i32>:1 [#uses=1]
20        ret i32 %1
21; CHECK-LABEL: @test2(
22; CHECK: lshr i32 %X, 31
23; CHECK-NEXT: xor i32
24; CHECK-NEXT: ret i32
25}
26
27define i32 @test3(i32 %X) {
28entry:
29        icmp slt i32 %X, 0              ; <i1>:0 [#uses=1]
30        sext i1 %0 to i32               ; <i32>:1 [#uses=1]
31        ret i32 %1
32; CHECK-LABEL: @test3(
33; CHECK: ashr i32 %X, 31
34; CHECK-NEXT: ret i32
35}
36
37define i32 @test4(i32 %X) {
38entry:
39        icmp ult i32 %X, -2147483648            ; <i1>:0 [#uses=1]
40        sext i1 %0 to i32               ; <i32>:1 [#uses=1]
41        ret i32 %1
42; CHECK-LABEL: @test4(
43; CHECK: ashr i32 %X, 31
44; CHECK-NEXT: xor i32
45; CHECK-NEXT: ret i32
46}
47
48; PR4837
49define <2 x i1> @test5(<2 x i64> %x) {
50entry:
51  %V = icmp eq <2 x i64> %x, undef
52  ret <2 x i1> %V
53; CHECK-LABEL: @test5(
54; CHECK: ret <2 x i1> <i1 true, i1 true>
55}
56
57define i32 @test6(i32 %a, i32 %b) {
58        %c = icmp sle i32 %a, -1
59        %d = zext i1 %c to i32
60        %e = sub i32 0, %d
61        %f = and i32 %e, %b
62        ret i32 %f
63; CHECK-LABEL: @test6(
64; CHECK-NEXT: ashr i32 %a, 31
65; CHECK-NEXT: %f = and i32 %e, %b
66; CHECK-NEXT: ret i32 %f
67}
68
69
70define i1 @test7(i32 %x) {
71entry:
72  %a = add i32 %x, -1
73  %b = icmp ult i32 %a, %x
74  ret i1 %b
75; CHECK-LABEL: @test7(
76; CHECK: %b = icmp ne i32 %x, 0
77; CHECK: ret i1 %b
78}
79
80define i1 @test8(i32 %x){
81entry:
82  %a = add i32 %x, -1
83  %b = icmp eq i32 %a, %x
84  ret i1 %b
85; CHECK-LABEL: @test8(
86; CHECK: ret i1 false
87}
88
89define i1 @test9(i32 %x)  {
90entry:
91  %a = add i32 %x, -2
92  %b = icmp ugt i32 %x, %a
93  ret i1 %b
94; CHECK-LABEL: @test9(
95; CHECK: icmp ugt i32 %x, 1
96; CHECK: ret i1 %b
97}
98
99define i1 @test10(i32 %x){
100entry:
101  %a = add i32 %x, -1
102  %b = icmp slt i32 %a, %x
103  ret i1 %b
104; CHECK-LABEL: @test10(
105; CHECK: %b = icmp ne i32 %x, -2147483648
106; CHECK: ret i1 %b
107}
108
109define i1 @test11(i32 %x) {
110  %a = add nsw i32 %x, 8
111  %b = icmp slt i32 %x, %a
112  ret i1 %b
113; CHECK-LABEL: @test11(
114; CHECK: ret i1 true
115}
116
117; PR6195
118define i1 @test12(i1 %A) {
119  %S = select i1 %A, i64 -4294967295, i64 8589934591
120  %B = icmp ne i64 bitcast (<2 x i32> <i32 1, i32 -1> to i64), %S
121  ret i1 %B
122; CHECK-LABEL: @test12(
123; CHECK-NEXT: = xor i1 %A, true
124; CHECK-NEXT: ret i1
125}
126
127; PR6481
128define i1 @test13(i8 %X) nounwind readnone {
129entry:
130        %cmp = icmp slt i8 undef, %X
131        ret i1 %cmp
132; CHECK-LABEL: @test13(
133; CHECK: ret i1 false
134}
135
136define i1 @test14(i8 %X) nounwind readnone {
137entry:
138        %cmp = icmp slt i8 undef, -128
139        ret i1 %cmp
140; CHECK-LABEL: @test14(
141; CHECK: ret i1 false
142}
143
144define i1 @test15() nounwind readnone {
145entry:
146        %cmp = icmp eq i8 undef, -128
147        ret i1 %cmp
148; CHECK-LABEL: @test15(
149; CHECK: ret i1 undef
150}
151
152define i1 @test16() nounwind readnone {
153entry:
154        %cmp = icmp ne i8 undef, -128
155        ret i1 %cmp
156; CHECK-LABEL: @test16(
157; CHECK: ret i1 undef
158}
159
160define i1 @test17(i32 %x) nounwind {
161  %shl = shl i32 1, %x
162  %and = and i32 %shl, 8
163  %cmp = icmp eq i32 %and, 0
164  ret i1 %cmp
165; CHECK-LABEL: @test17(
166; CHECK-NEXT: %cmp = icmp ne i32 %x, 3
167}
168
169
170define i1 @test18(i32 %x) nounwind {
171  %sh = lshr i32 8, %x
172  %and = and i32 %sh, 1
173  %cmp = icmp eq i32 %and, 0
174  ret i1 %cmp
175; CHECK-LABEL: @test18(
176; CHECK-NEXT: %cmp = icmp ne i32 %x, 3
177}
178
179define i1 @test19(i32 %x) nounwind {
180  %shl = shl i32 1, %x
181  %and = and i32 %shl, 8
182  %cmp = icmp eq i32 %and, 8
183  ret i1 %cmp
184; CHECK-LABEL: @test19(
185; CHECK-NEXT: %cmp = icmp eq i32 %x, 3
186}
187
188define i1 @test20(i32 %x) nounwind {
189  %shl = shl i32 1, %x
190  %and = and i32 %shl, 8
191  %cmp = icmp ne i32 %and, 0
192  ret i1 %cmp
193; CHECK-LABEL: @test20(
194; CHECK-NEXT: %cmp = icmp eq i32 %x, 3
195}
196
197define i1 @test21(i8 %x, i8 %y) {
198; CHECK-LABEL: @test21(
199; CHECK-NOT: or i8
200; CHECK: icmp ugt
201  %A = or i8 %x, 1
202  %B = icmp ugt i8 %A, 3
203  ret i1 %B
204}
205
206define i1 @test22(i8 %x, i8 %y) {
207; CHECK-LABEL: @test22(
208; CHECK-NOT: or i8
209; CHECK: icmp ult
210  %A = or i8 %x, 1
211  %B = icmp ult i8 %A, 4
212  ret i1 %B
213}
214
215; PR2740
216; CHECK-LABEL: @test23(
217; CHECK: icmp sgt i32 %x, 1328634634
218define i1 @test23(i32 %x) nounwind {
219	%i3 = sdiv i32 %x, -1328634635
220	%i4 = icmp eq i32 %i3, -1
221	ret i1 %i4
222}
223
224@X = global [1000 x i32] zeroinitializer
225
226; PR8882
227; CHECK-LABEL: @test24(
228; CHECK:    %cmp = icmp eq i64 %i, 1000
229; CHECK:   ret i1 %cmp
230define i1 @test24(i64 %i) {
231  %p1 = getelementptr inbounds i32* getelementptr inbounds ([1000 x i32]* @X, i64 0, i64 0), i64 %i
232  %cmp = icmp eq i32* %p1, getelementptr inbounds ([1000 x i32]* @X, i64 1, i64 0)
233  ret i1 %cmp
234}
235
236@X_as1 = addrspace(1) global [1000 x i32] zeroinitializer
237
238; CHECK: @test24_as1
239; CHECK: trunc i64 %i to i16
240; CHECK: %cmp = icmp eq i16 %1, 1000
241; CHECK: ret i1 %cmp
242define i1 @test24_as1(i64 %i) {
243  %p1 = getelementptr inbounds i32 addrspace(1)* getelementptr inbounds ([1000 x i32] addrspace(1)* @X_as1, i64 0, i64 0), i64 %i
244  %cmp = icmp eq i32 addrspace(1)* %p1, getelementptr inbounds ([1000 x i32] addrspace(1)* @X_as1, i64 1, i64 0)
245  ret i1 %cmp
246}
247
248; CHECK-LABEL: @test25(
249; X + Z > Y + Z -> X > Y if there is no overflow.
250; CHECK: %c = icmp sgt i32 %x, %y
251; CHECK: ret i1 %c
252define i1 @test25(i32 %x, i32 %y, i32 %z) {
253  %lhs = add nsw i32 %x, %z
254  %rhs = add nsw i32 %y, %z
255  %c = icmp sgt i32 %lhs, %rhs
256  ret i1 %c
257}
258
259; CHECK-LABEL: @test26(
260; X + Z > Y + Z -> X > Y if there is no overflow.
261; CHECK: %c = icmp ugt i32 %x, %y
262; CHECK: ret i1 %c
263define i1 @test26(i32 %x, i32 %y, i32 %z) {
264  %lhs = add nuw i32 %x, %z
265  %rhs = add nuw i32 %y, %z
266  %c = icmp ugt i32 %lhs, %rhs
267  ret i1 %c
268}
269
270; CHECK-LABEL: @test27(
271; X - Z > Y - Z -> X > Y if there is no overflow.
272; CHECK: %c = icmp sgt i32 %x, %y
273; CHECK: ret i1 %c
274define i1 @test27(i32 %x, i32 %y, i32 %z) {
275  %lhs = sub nsw i32 %x, %z
276  %rhs = sub nsw i32 %y, %z
277  %c = icmp sgt i32 %lhs, %rhs
278  ret i1 %c
279}
280
281; CHECK-LABEL: @test28(
282; X - Z > Y - Z -> X > Y if there is no overflow.
283; CHECK: %c = icmp ugt i32 %x, %y
284; CHECK: ret i1 %c
285define i1 @test28(i32 %x, i32 %y, i32 %z) {
286  %lhs = sub nuw i32 %x, %z
287  %rhs = sub nuw i32 %y, %z
288  %c = icmp ugt i32 %lhs, %rhs
289  ret i1 %c
290}
291
292; CHECK-LABEL: @test29(
293; X + Y > X -> Y > 0 if there is no overflow.
294; CHECK: %c = icmp sgt i32 %y, 0
295; CHECK: ret i1 %c
296define i1 @test29(i32 %x, i32 %y) {
297  %lhs = add nsw i32 %x, %y
298  %c = icmp sgt i32 %lhs, %x
299  ret i1 %c
300}
301
302; CHECK-LABEL: @test30(
303; X + Y > X -> Y > 0 if there is no overflow.
304; CHECK: %c = icmp ne i32 %y, 0
305; CHECK: ret i1 %c
306define i1 @test30(i32 %x, i32 %y) {
307  %lhs = add nuw i32 %x, %y
308  %c = icmp ugt i32 %lhs, %x
309  ret i1 %c
310}
311
312; CHECK-LABEL: @test31(
313; X > X + Y -> 0 > Y if there is no overflow.
314; CHECK: %c = icmp slt i32 %y, 0
315; CHECK: ret i1 %c
316define i1 @test31(i32 %x, i32 %y) {
317  %rhs = add nsw i32 %x, %y
318  %c = icmp sgt i32 %x, %rhs
319  ret i1 %c
320}
321
322; CHECK-LABEL: @test32(
323; X > X + Y -> 0 > Y if there is no overflow.
324; CHECK: ret i1 false
325define i1 @test32(i32 %x, i32 %y) {
326  %rhs = add nuw i32 %x, %y
327  %c = icmp ugt i32 %x, %rhs
328  ret i1 %c
329}
330
331; CHECK-LABEL: @test33(
332; X - Y > X -> 0 > Y if there is no overflow.
333; CHECK: %c = icmp slt i32 %y, 0
334; CHECK: ret i1 %c
335define i1 @test33(i32 %x, i32 %y) {
336  %lhs = sub nsw i32 %x, %y
337  %c = icmp sgt i32 %lhs, %x
338  ret i1 %c
339}
340
341; CHECK-LABEL: @test34(
342; X - Y > X -> 0 > Y if there is no overflow.
343; CHECK: ret i1 false
344define i1 @test34(i32 %x, i32 %y) {
345  %lhs = sub nuw i32 %x, %y
346  %c = icmp ugt i32 %lhs, %x
347  ret i1 %c
348}
349
350; CHECK-LABEL: @test35(
351; X > X - Y -> Y > 0 if there is no overflow.
352; CHECK: %c = icmp sgt i32 %y, 0
353; CHECK: ret i1 %c
354define i1 @test35(i32 %x, i32 %y) {
355  %rhs = sub nsw i32 %x, %y
356  %c = icmp sgt i32 %x, %rhs
357  ret i1 %c
358}
359
360; CHECK-LABEL: @test36(
361; X > X - Y -> Y > 0 if there is no overflow.
362; CHECK: %c = icmp ne i32 %y, 0
363; CHECK: ret i1 %c
364define i1 @test36(i32 %x, i32 %y) {
365  %rhs = sub nuw i32 %x, %y
366  %c = icmp ugt i32 %x, %rhs
367  ret i1 %c
368}
369
370; CHECK-LABEL: @test37(
371; X - Y > X - Z -> Z > Y if there is no overflow.
372; CHECK: %c = icmp sgt i32 %z, %y
373; CHECK: ret i1 %c
374define i1 @test37(i32 %x, i32 %y, i32 %z) {
375  %lhs = sub nsw i32 %x, %y
376  %rhs = sub nsw i32 %x, %z
377  %c = icmp sgt i32 %lhs, %rhs
378  ret i1 %c
379}
380
381; CHECK-LABEL: @test38(
382; X - Y > X - Z -> Z > Y if there is no overflow.
383; CHECK: %c = icmp ugt i32 %z, %y
384; CHECK: ret i1 %c
385define i1 @test38(i32 %x, i32 %y, i32 %z) {
386  %lhs = sub nuw i32 %x, %y
387  %rhs = sub nuw i32 %x, %z
388  %c = icmp ugt i32 %lhs, %rhs
389  ret i1 %c
390}
391
392; PR9343 #1
393; CHECK-LABEL: @test39(
394; CHECK: %B = icmp eq i32 %X, 0
395define i1 @test39(i32 %X, i32 %Y) {
396  %A = ashr exact i32 %X, %Y
397  %B = icmp eq i32 %A, 0
398  ret i1 %B
399}
400
401; CHECK-LABEL: @test40(
402; CHECK: %B = icmp ne i32 %X, 0
403define i1 @test40(i32 %X, i32 %Y) {
404  %A = lshr exact i32 %X, %Y
405  %B = icmp ne i32 %A, 0
406  ret i1 %B
407}
408
409; PR9343 #3
410; CHECK-LABEL: @test41(
411; CHECK: ret i1 true
412define i1 @test41(i32 %X, i32 %Y) {
413  %A = urem i32 %X, %Y
414  %B = icmp ugt i32 %Y, %A
415  ret i1 %B
416}
417
418; CHECK-LABEL: @test42(
419; CHECK: %B = icmp sgt i32 %Y, -1
420define i1 @test42(i32 %X, i32 %Y) {
421  %A = srem i32 %X, %Y
422  %B = icmp slt i32 %A, %Y
423  ret i1 %B
424}
425
426; CHECK-LABEL: @test43(
427; CHECK: %B = icmp slt i32 %Y, 0
428define i1 @test43(i32 %X, i32 %Y) {
429  %A = srem i32 %X, %Y
430  %B = icmp slt i32 %Y, %A
431  ret i1 %B
432}
433
434; CHECK-LABEL: @test44(
435; CHECK: %B = icmp sgt i32 %Y, -1
436define i1 @test44(i32 %X, i32 %Y) {
437  %A = srem i32 %X, %Y
438  %B = icmp slt i32 %A, %Y
439  ret i1 %B
440}
441
442; CHECK-LABEL: @test45(
443; CHECK: %B = icmp slt i32 %Y, 0
444define i1 @test45(i32 %X, i32 %Y) {
445  %A = srem i32 %X, %Y
446  %B = icmp slt i32 %Y, %A
447  ret i1 %B
448}
449
450; PR9343 #4
451; CHECK-LABEL: @test46(
452; CHECK: %C = icmp ult i32 %X, %Y
453define i1 @test46(i32 %X, i32 %Y, i32 %Z) {
454  %A = ashr exact i32 %X, %Z
455  %B = ashr exact i32 %Y, %Z
456  %C = icmp ult i32 %A, %B
457  ret i1 %C
458}
459
460; PR9343 #5
461; CHECK-LABEL: @test47(
462; CHECK: %C = icmp ugt i32 %X, %Y
463define i1 @test47(i32 %X, i32 %Y, i32 %Z) {
464  %A = ashr exact i32 %X, %Z
465  %B = ashr exact i32 %Y, %Z
466  %C = icmp ugt i32 %A, %B
467  ret i1 %C
468}
469
470; PR9343 #8
471; CHECK-LABEL: @test48(
472; CHECK: %C = icmp eq i32 %X, %Y
473define i1 @test48(i32 %X, i32 %Y, i32 %Z) {
474  %A = sdiv exact i32 %X, %Z
475  %B = sdiv exact i32 %Y, %Z
476  %C = icmp eq i32 %A, %B
477  ret i1 %C
478}
479
480; PR8469
481; CHECK-LABEL: @test49(
482; CHECK: ret <2 x i1> <i1 true, i1 true>
483define <2 x i1> @test49(<2 x i32> %tmp3) {
484entry:
485  %tmp11 = and <2 x i32> %tmp3, <i32 3, i32 3>
486  %cmp = icmp ult <2 x i32> %tmp11, <i32 4, i32 4>
487  ret <2 x i1> %cmp
488}
489
490; PR9343 #7
491; CHECK-LABEL: @test50(
492; CHECK: ret i1 true
493define i1 @test50(i16 %X, i32 %Y) {
494  %A = zext i16 %X to i32
495  %B = srem i32 %A, %Y
496  %C = icmp sgt i32 %B, -1
497  ret i1 %C
498}
499
500; CHECK-LABEL: @test51(
501; CHECK: ret i1 %C
502define i1 @test51(i32 %X, i32 %Y) {
503  %A = and i32 %X, 2147483648
504  %B = srem i32 %A, %Y
505  %C = icmp sgt i32 %B, -1
506  ret i1 %C
507}
508
509; CHECK-LABEL: @test52(
510; CHECK-NEXT: and i32 %x1, 16711935
511; CHECK-NEXT: icmp eq i32 {{.*}}, 4980863
512; CHECK-NEXT: ret i1
513define i1 @test52(i32 %x1) nounwind {
514  %conv = and i32 %x1, 255
515  %cmp = icmp eq i32 %conv, 127
516  %tmp2 = lshr i32 %x1, 16
517  %tmp3 = trunc i32 %tmp2 to i8
518  %cmp15 = icmp eq i8 %tmp3, 76
519
520  %A = and i1 %cmp, %cmp15
521  ret i1 %A
522}
523
524; PR9838
525; CHECK-LABEL: @test53(
526; CHECK-NEXT: sdiv exact
527; CHECK-NEXT: sdiv
528; CHECK-NEXT: icmp
529define i1 @test53(i32 %a, i32 %b) nounwind {
530 %x = sdiv exact i32 %a, 30
531 %y = sdiv i32 %b, 30
532 %z = icmp eq i32 %x, %y
533 ret i1 %z
534}
535
536; CHECK-LABEL: @test54(
537; CHECK-NEXT: %and = and i8 %a, -64
538; CHECK-NEXT: icmp eq i8 %and, -128
539define i1 @test54(i8 %a) nounwind {
540  %ext = zext i8 %a to i32
541  %and = and i32 %ext, 192
542  %ret = icmp eq i32 %and, 128
543  ret i1 %ret
544}
545
546; CHECK-LABEL: @test55(
547; CHECK-NEXT: icmp eq i32 %a, -123
548define i1 @test55(i32 %a) {
549  %sub = sub i32 0, %a
550  %cmp = icmp eq i32 %sub, 123
551  ret i1 %cmp
552}
553
554; CHECK-LABEL: @test56(
555; CHECK-NEXT: icmp eq i32 %a, -113
556define i1 @test56(i32 %a) {
557  %sub = sub i32 10, %a
558  %cmp = icmp eq i32 %sub, 123
559  ret i1 %cmp
560}
561
562; PR10267 Don't make icmps more expensive when no other inst is subsumed.
563declare void @foo(i32)
564; CHECK-LABEL: @test57(
565; CHECK: %and = and i32 %a, -2
566; CHECK: %cmp = icmp ne i32 %and, 0
567define i1 @test57(i32 %a) {
568  %and = and i32 %a, -2
569  %cmp = icmp ne i32 %and, 0
570  call void @foo(i32 %and)
571  ret i1 %cmp
572}
573
574; rdar://problem/10482509
575; CHECK-LABEL: @cmpabs1(
576; CHECK-NEXT: icmp ne
577define zeroext i1 @cmpabs1(i64 %val) {
578  %sub = sub nsw i64 0, %val
579  %cmp = icmp slt i64 %val, 0
580  %sub.val = select i1 %cmp, i64 %sub, i64 %val
581  %tobool = icmp ne i64 %sub.val, 0
582  ret i1 %tobool
583}
584
585; CHECK-LABEL: @cmpabs2(
586; CHECK-NEXT: icmp ne
587define zeroext i1 @cmpabs2(i64 %val) {
588  %sub = sub nsw i64 0, %val
589  %cmp = icmp slt i64 %val, 0
590  %sub.val = select i1 %cmp, i64 %val, i64 %sub
591  %tobool = icmp ne i64 %sub.val, 0
592  ret i1 %tobool
593}
594
595; CHECK-LABEL: @test58(
596; CHECK-NEXT: call i32 @test58_d(i64 36029346783166592)
597define void @test58() nounwind {
598  %cast = bitcast <1 x i64> <i64 36029346783166592> to i64
599  %call = call i32 @test58_d( i64 %cast) nounwind
600  ret void
601}
602declare i32 @test58_d(i64)
603
604define i1 @test59(i8* %foo) {
605  %bit = bitcast i8* %foo to i32*
606  %gep1 = getelementptr inbounds i32* %bit, i64 2
607  %gep2 = getelementptr inbounds i8* %foo, i64 10
608  %cast1 = bitcast i32* %gep1 to i8*
609  %cmp = icmp ult i8* %cast1, %gep2
610  %use = ptrtoint i8* %cast1 to i64
611  %call = call i32 @test58_d(i64 %use) nounwind
612  ret i1 %cmp
613; CHECK-LABEL: @test59(
614; CHECK: ret i1 true
615}
616
617define i1 @test59_as1(i8 addrspace(1)* %foo) {
618  %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
619  %gep1 = getelementptr inbounds i32 addrspace(1)* %bit, i64 2
620  %gep2 = getelementptr inbounds i8 addrspace(1)* %foo, i64 10
621  %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
622  %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
623  %use = ptrtoint i8 addrspace(1)* %cast1 to i64
624  %call = call i32 @test58_d(i64 %use) nounwind
625  ret i1 %cmp
626; CHECK: @test59_as1
627; CHECK: %[[GEP:.+]] = getelementptr inbounds i8 addrspace(1)* %foo, i16 8
628; CHECK: ptrtoint i8 addrspace(1)* %[[GEP]] to i16
629; CHECK: ret i1 true
630}
631
632define i1 @test60(i8* %foo, i64 %i, i64 %j) {
633  %bit = bitcast i8* %foo to i32*
634  %gep1 = getelementptr inbounds i32* %bit, i64 %i
635  %gep2 = getelementptr inbounds i8* %foo, i64 %j
636  %cast1 = bitcast i32* %gep1 to i8*
637  %cmp = icmp ult i8* %cast1, %gep2
638  ret i1 %cmp
639; CHECK-LABEL: @test60(
640; CHECK-NEXT: %gep1.idx = shl nuw i64 %i, 2
641; CHECK-NEXT: icmp slt i64 %gep1.idx, %j
642; CHECK-NEXT: ret i1
643}
644
645define i1 @test60_as1(i8 addrspace(1)* %foo, i64 %i, i64 %j) {
646  %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
647  %gep1 = getelementptr inbounds i32 addrspace(1)* %bit, i64 %i
648  %gep2 = getelementptr inbounds i8 addrspace(1)* %foo, i64 %j
649  %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
650  %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
651  ret i1 %cmp
652; CHECK: @test60_as1
653; CHECK: trunc i64 %i to i16
654; CHECK: trunc i64 %j to i16
655; CHECK: %gep1.idx = shl nuw i16 %{{.+}}, 2
656; CHECK-NEXT: icmp sgt i16 %{{.+}}, %gep1.idx
657; CHECK-NEXT: ret i1
658}
659
660define i1 @test61(i8* %foo, i64 %i, i64 %j) {
661  %bit = bitcast i8* %foo to i32*
662  %gep1 = getelementptr i32* %bit, i64 %i
663  %gep2 = getelementptr  i8* %foo, i64 %j
664  %cast1 = bitcast i32* %gep1 to i8*
665  %cmp = icmp ult i8* %cast1, %gep2
666  ret i1 %cmp
667; Don't transform non-inbounds GEPs.
668; CHECK-LABEL: @test61(
669; CHECK: icmp ult i8* %cast1, %gep2
670; CHECK-NEXT: ret i1
671}
672
673define i1 @test61_as1(i8 addrspace(1)* %foo, i16 %i, i16 %j) {
674  %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
675  %gep1 = getelementptr i32 addrspace(1)* %bit, i16 %i
676  %gep2 = getelementptr i8 addrspace(1)* %foo, i16 %j
677  %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
678  %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
679  ret i1 %cmp
680; Don't transform non-inbounds GEPs.
681; CHECK: @test61_as1
682; CHECK: icmp ult i8 addrspace(1)* %cast1, %gep2
683; CHECK-NEXT: ret i1
684}
685
686define i1 @test62(i8* %a) {
687  %arrayidx1 = getelementptr inbounds i8* %a, i64 1
688  %arrayidx2 = getelementptr inbounds i8* %a, i64 10
689  %cmp = icmp slt i8* %arrayidx1, %arrayidx2
690  ret i1 %cmp
691; CHECK-LABEL: @test62(
692; CHECK-NEXT: ret i1 true
693}
694
695define i1 @test62_as1(i8 addrspace(1)* %a) {
696; CHECK-LABEL: @test62_as1(
697; CHECK-NEXT: ret i1 true
698  %arrayidx1 = getelementptr inbounds i8 addrspace(1)* %a, i64 1
699  %arrayidx2 = getelementptr inbounds i8 addrspace(1)* %a, i64 10
700  %cmp = icmp slt i8 addrspace(1)* %arrayidx1, %arrayidx2
701  ret i1 %cmp
702}
703
704define i1 @test63(i8 %a, i32 %b) nounwind {
705  %z = zext i8 %a to i32
706  %t = and i32 %b, 255
707  %c = icmp eq i32 %z, %t
708  ret i1 %c
709; CHECK-LABEL: @test63(
710; CHECK-NEXT: %1 = trunc i32 %b to i8
711; CHECK-NEXT: %c = icmp eq i8 %1, %a
712; CHECK-NEXT: ret i1 %c
713}
714
715define i1 @test64(i8 %a, i32 %b) nounwind {
716  %t = and i32 %b, 255
717  %z = zext i8 %a to i32
718  %c = icmp eq i32 %t, %z
719  ret i1 %c
720; CHECK-LABEL: @test64(
721; CHECK-NEXT: %1 = trunc i32 %b to i8
722; CHECK-NEXT: %c = icmp eq i8 %1, %a
723; CHECK-NEXT: ret i1 %c
724}
725
726define i1 @test65(i64 %A, i64 %B) {
727  %s1 = add i64 %A, %B
728  %s2 = add i64 %A, %B
729  %cmp = icmp eq i64 %s1, %s2
730; CHECK-LABEL: @test65(
731; CHECK-NEXT: ret i1 true
732  ret i1 %cmp
733}
734
735define i1 @test66(i64 %A, i64 %B) {
736  %s1 = add i64 %A, %B
737  %s2 = add i64 %B, %A
738  %cmp = icmp eq i64 %s1, %s2
739; CHECK-LABEL: @test66(
740; CHECK-NEXT: ret i1 true
741  ret i1 %cmp
742}
743
744; CHECK-LABEL: @test67(
745; CHECK: %and = and i32 %x, 96
746; CHECK: %cmp = icmp ne i32 %and, 0
747define i1 @test67(i32 %x) nounwind uwtable {
748  %and = and i32 %x, 127
749  %cmp = icmp sgt i32 %and, 31
750  ret i1 %cmp
751}
752
753; CHECK-LABEL: @test68(
754; CHECK: %cmp = icmp ugt i32 %and, 30
755define i1 @test68(i32 %x) nounwind uwtable {
756  %and = and i32 %x, 127
757  %cmp = icmp sgt i32 %and, 30
758  ret i1 %cmp
759}
760
761; PR14708
762; CHECK-LABEL: @test69(
763; CHECK: %1 = and i32 %c, -33
764; CHECK: %2 = icmp eq i32 %1, 65
765; CHECK: ret i1 %2
766define i1 @test69(i32 %c) nounwind uwtable {
767  %1 = icmp eq i32 %c, 97
768  %2 = icmp eq i32 %c, 65
769  %3 = or i1 %1, %2
770  ret i1 %3
771}
772
773; PR15940
774; CHECK-LABEL: @test70(
775; CHECK-NEXT: %A = srem i32 5, %X
776; CHECK-NEXT: %C = icmp ne i32 %A, 2
777; CHECK-NEXT: ret i1 %C
778define i1 @test70(i32 %X) {
779  %A = srem i32 5, %X
780  %B = add i32 %A, 2
781  %C = icmp ne i32 %B, 4
782  ret i1 %C
783}
784
785; CHECK-LABEL: @icmp_sext16trunc(
786; CHECK-NEXT: %1 = trunc i32 %x to i16
787; CHECK-NEXT: %cmp = icmp slt i16 %1, 36
788define i1 @icmp_sext16trunc(i32 %x) {
789  %trunc = trunc i32 %x to i16
790  %sext = sext i16 %trunc to i32
791  %cmp = icmp slt i32 %sext, 36
792  ret i1 %cmp
793}
794
795; CHECK-LABEL: @icmp_sext8trunc(
796; CHECK-NEXT: %1 = trunc i32 %x to i8
797; CHECK-NEXT: %cmp = icmp slt i8 %1, 36
798define i1 @icmp_sext8trunc(i32 %x) {
799  %trunc = trunc i32 %x to i8
800  %sext = sext i8 %trunc to i32
801  %cmp = icmp slt i32 %sext, 36
802  ret i1 %cmp
803}
804
805; CHECK-LABEL: @icmp_shl16(
806; CHECK-NEXT: %1 = trunc i32 %x to i16
807; CHECK-NEXT: %cmp = icmp slt i16 %1, 36
808define i1 @icmp_shl16(i32 %x) {
809  %shl = shl i32 %x, 16
810  %cmp = icmp slt i32 %shl, 2359296
811  ret i1 %cmp
812}
813
814; CHECK-LABEL: @icmp_shl24(
815; CHECK-NEXT: %1 = trunc i32 %x to i8
816; CHECK-NEXT: %cmp = icmp slt i8 %1, 36
817define i1 @icmp_shl24(i32 %x) {
818  %shl = shl i32 %x, 24
819  %cmp = icmp slt i32 %shl, 603979776
820  ret i1 %cmp
821}
822
823; If the (shl x, C) preserved the sign and this is a sign test,
824; compare the LHS operand instead
825; CHECK-LABEL: @icmp_shl_nsw_sgt(
826; CHECK-NEXT: icmp sgt i32 %x, 0
827define i1 @icmp_shl_nsw_sgt(i32 %x) {
828  %shl = shl nsw i32 %x, 21
829  %cmp = icmp sgt i32 %shl, 0
830  ret i1 %cmp
831}
832
833; CHECK-LABEL: @icmp_shl_nsw_sge0(
834; CHECK-NEXT: icmp sgt i32 %x, -1
835define i1 @icmp_shl_nsw_sge0(i32 %x) {
836  %shl = shl nsw i32 %x, 21
837  %cmp = icmp sge i32 %shl, 0
838  ret i1 %cmp
839}
840
841; CHECK-LABEL: @icmp_shl_nsw_sge1(
842; CHECK-NEXT: icmp sgt i32 %x, 0
843define i1 @icmp_shl_nsw_sge1(i32 %x) {
844  %shl = shl nsw i32 %x, 21
845  %cmp = icmp sge i32 %shl, 1
846  ret i1 %cmp
847}
848
849; Checks for icmp (eq|ne) (shl x, C), 0
850; CHECK-LABEL: @icmp_shl_nsw_eq(
851; CHECK-NEXT: icmp eq i32 %x, 0
852define i1 @icmp_shl_nsw_eq(i32 %x) {
853  %mul = shl nsw i32 %x, 5
854  %cmp = icmp eq i32 %mul, 0
855  ret i1 %cmp
856}
857
858; CHECK-LABEL: @icmp_shl_eq(
859; CHECK-NOT: icmp eq i32 %mul, 0
860define i1 @icmp_shl_eq(i32 %x) {
861  %mul = shl i32 %x, 5
862  %cmp = icmp eq i32 %mul, 0
863  ret i1 %cmp
864}
865
866; CHECK-LABEL: @icmp_shl_nsw_ne(
867; CHECK-NEXT: icmp ne i32 %x, 0
868define i1 @icmp_shl_nsw_ne(i32 %x) {
869  %mul = shl nsw i32 %x, 7
870  %cmp = icmp ne i32 %mul, 0
871  ret i1 %cmp
872}
873
874; CHECK-LABEL: @icmp_shl_ne(
875; CHECK-NOT: icmp ne i32 %x, 0
876define i1 @icmp_shl_ne(i32 %x) {
877  %mul = shl i32 %x, 7
878  %cmp = icmp ne i32 %mul, 0
879  ret i1 %cmp
880}
881
882; If the (mul x, C) preserved the sign and this is sign test,
883; compare the LHS operand instead
884; CHECK-LABEL: @icmp_mul_nsw(
885; CHECK-NEXT: icmp sgt i32 %x, 0
886define i1 @icmp_mul_nsw(i32 %x) {
887  %mul = mul nsw i32 %x, 12
888  %cmp = icmp sgt i32 %mul, 0
889  ret i1 %cmp
890}
891
892; CHECK-LABEL: @icmp_mul_nsw1(
893; CHECK-NEXT: icmp slt i32 %x, 0
894define i1 @icmp_mul_nsw1(i32 %x) {
895  %mul = mul nsw i32 %x, 12
896  %cmp = icmp sle i32 %mul, -1
897  ret i1 %cmp
898}
899
900; CHECK-LABEL: @icmp_mul_nsw_neg(
901; CHECK-NEXT: icmp slt i32 %x, 1
902define i1 @icmp_mul_nsw_neg(i32 %x) {
903  %mul = mul nsw i32 %x, -12
904  %cmp = icmp sge i32 %mul, 0
905  ret i1 %cmp
906}
907
908; CHECK-LABEL: @icmp_mul_nsw_neg1(
909; CHECK-NEXT: icmp slt i32 %x, 0
910define i1 @icmp_mul_nsw_neg1(i32 %x) {
911  %mul = mul nsw i32 %x, -12
912  %cmp = icmp sge i32 %mul, 1
913  ret i1 %cmp
914}
915
916; CHECK-LABEL: @icmp_mul_nsw_0(
917; CHECK-NOT: icmp sgt i32 %x, 0
918define i1 @icmp_mul_nsw_0(i32 %x) {
919  %mul = mul nsw i32 %x, 0
920  %cmp = icmp sgt i32 %mul, 0
921  ret i1 %cmp
922}
923
924; CHECK-LABEL: @icmp_mul(
925; CHECK-NEXT: %mul = mul i32 %x, -12
926define i1 @icmp_mul(i32 %x) {
927  %mul = mul i32 %x, -12
928  %cmp = icmp sge i32 %mul, 0
929  ret i1 %cmp
930}
931
932; Checks for icmp (eq|ne) (mul x, C), 0
933; CHECK-LABEL: @icmp_mul_neq0(
934; CHECK-NEXT: icmp ne i32 %x, 0
935define i1 @icmp_mul_neq0(i32 %x) {
936  %mul = mul nsw i32 %x, -12
937  %cmp = icmp ne i32 %mul, 0
938  ret i1 %cmp
939}
940
941; CHECK-LABEL: @icmp_mul_eq0(
942; CHECK-NEXT: icmp eq i32 %x, 0
943define i1 @icmp_mul_eq0(i32 %x) {
944  %mul = mul nsw i32 %x, 12
945  %cmp = icmp eq i32 %mul, 0
946  ret i1 %cmp
947}
948
949; CHECK-LABEL: @icmp_mul0_eq0(
950; CHECK-NEXT: ret i1 true
951define i1 @icmp_mul0_eq0(i32 %x) {
952  %mul = mul i32 %x, 0
953  %cmp = icmp eq i32 %mul, 0
954  ret i1 %cmp
955}
956
957; CHECK-LABEL: @icmp_mul0_ne0(
958; CHECK-NEXT: ret i1 false
959define i1 @icmp_mul0_ne0(i32 %x) {
960  %mul = mul i32 %x, 0
961  %cmp = icmp ne i32 %mul, 0
962  ret i1 %cmp
963}
964
965; CHECK-LABEL: @icmp_sub1_sge(
966; CHECK-NEXT: icmp sgt i32 %x, %y
967define i1 @icmp_sub1_sge(i32 %x, i32 %y) {
968  %sub = add nsw i32 %x, -1
969  %cmp = icmp sge i32 %sub, %y
970  ret i1 %cmp
971}
972
973; CHECK-LABEL: @icmp_add1_sgt(
974; CHECK-NEXT: icmp sge i32 %x, %y
975define i1 @icmp_add1_sgt(i32 %x, i32 %y) {
976  %add = add nsw i32 %x, 1
977  %cmp = icmp sgt i32 %add, %y
978  ret i1 %cmp
979}
980
981; CHECK-LABEL: @icmp_sub1_slt(
982; CHECK-NEXT: icmp sle i32 %x, %y
983define i1 @icmp_sub1_slt(i32 %x, i32 %y) {
984  %sub = add nsw i32 %x, -1
985  %cmp = icmp slt i32 %sub, %y
986  ret i1 %cmp
987}
988
989; CHECK-LABEL: @icmp_add1_sle(
990; CHECK-NEXT: icmp slt i32 %x, %y
991define i1 @icmp_add1_sle(i32 %x, i32 %y) {
992  %add = add nsw i32 %x, 1
993  %cmp = icmp sle i32 %add, %y
994  ret i1 %cmp
995}
996
997; CHECK-LABEL: @icmp_add20_sge_add57(
998; CHECK-NEXT: [[ADD:%[a-z0-9]+]] = add nsw i32 %y, 37
999; CHECK-NEXT: icmp sle i32 [[ADD]], %x
1000define i1 @icmp_add20_sge_add57(i32 %x, i32 %y) {
1001  %1 = add nsw i32 %x, 20
1002  %2 = add nsw i32 %y, 57
1003  %cmp = icmp sge i32 %1, %2
1004  ret i1 %cmp
1005}
1006
1007; CHECK-LABEL: @icmp_sub57_sge_sub20(
1008; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = add nsw i32 %x, -37
1009; CHECK-NEXT: icmp sge i32 [[SUB]], %y
1010define i1 @icmp_sub57_sge_sub20(i32 %x, i32 %y) {
1011  %1 = add nsw i32 %x, -57
1012  %2 = add nsw i32 %y, -20
1013  %cmp = icmp sge i32 %1, %2
1014  ret i1 %cmp
1015}
1016
1017; CHECK-LABEL: @icmp_and_shl_neg_ne_0(
1018; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 1, %B
1019; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], %A
1020; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 0
1021; CHECK-NEXT: ret i1 [[CMP]]
1022define i1 @icmp_and_shl_neg_ne_0(i32 %A, i32 %B) {
1023  %neg = xor i32 %A, -1
1024  %shl = shl i32 1, %B
1025  %and = and i32 %shl, %neg
1026  %cmp = icmp ne i32 %and, 0
1027  ret i1 %cmp
1028}
1029
1030; CHECK-LABEL: @icmp_and_shl_neg_eq_0(
1031; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 1, %B
1032; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], %A
1033; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 0
1034; CHECK-NEXT: ret i1 [[CMP]]
1035define i1 @icmp_and_shl_neg_eq_0(i32 %A, i32 %B) {
1036  %neg = xor i32 %A, -1
1037  %shl = shl i32 1, %B
1038  %and = and i32 %shl, %neg
1039  %cmp = icmp eq i32 %and, 0
1040  ret i1 %cmp
1041}
1042
1043; CHECK-LABEL: @icmp_add_and_shr_ne_0(
1044; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, 240
1045; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 224
1046; CHECK-NEXT: ret i1 [[CMP]]
1047define i1 @icmp_add_and_shr_ne_0(i32 %X) {
1048  %shr = lshr i32 %X, 4
1049  %and = and i32 %shr, 15
1050  %add = add i32 %and, -14
1051  %tobool = icmp ne i32 %add, 0
1052  ret i1 %tobool
1053}
1054
1055; PR16244
1056; CHECK-LABEL: define i1 @test71(
1057; CHECK-NEXT: ret i1 false
1058define i1 @test71(i8* %x) {
1059  %a = getelementptr i8* %x, i64 8
1060  %b = getelementptr inbounds i8* %x, i64 8
1061  %c = icmp ugt i8* %a, %b
1062  ret i1 %c
1063}
1064
1065define i1 @test71_as1(i8 addrspace(1)* %x) {
1066; CHECK-LABEL: @test71_as1(
1067; CHECK-NEXT: ret i1 false
1068  %a = getelementptr i8 addrspace(1)* %x, i64 8
1069  %b = getelementptr inbounds i8 addrspace(1)* %x, i64 8
1070  %c = icmp ugt i8 addrspace(1)* %a, %b
1071  ret i1 %c
1072}
1073
1074; CHECK-LABEL: @icmp_shl_1_V_ult_32(
1075; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5
1076; CHECK-NEXT: ret i1 [[CMP]]
1077define i1 @icmp_shl_1_V_ult_32(i32 %V) {
1078  %shl = shl i32 1, %V
1079  %cmp = icmp ult i32 %shl, 32
1080  ret i1 %cmp
1081}
1082
1083; CHECK-LABEL: @icmp_shl_1_V_eq_32(
1084; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 %V, 5
1085; CHECK-NEXT: ret i1 [[CMP]]
1086define i1 @icmp_shl_1_V_eq_32(i32 %V) {
1087  %shl = shl i32 1, %V
1088  %cmp = icmp eq i32 %shl, 32
1089  ret i1 %cmp
1090}
1091
1092; CHECK-LABEL: @icmp_shl_1_V_eq_31(
1093; CHECK-NEXT: ret i1 false
1094define i1 @icmp_shl_1_V_eq_31(i32 %V) {
1095  %shl = shl i32 1, %V
1096  %cmp = icmp eq i32 %shl, 31
1097  ret i1 %cmp
1098}
1099
1100; CHECK-LABEL: @icmp_shl_1_V_ne_31(
1101; CHECK-NEXT: ret i1 true
1102define i1 @icmp_shl_1_V_ne_31(i32 %V) {
1103  %shl = shl i32 1, %V
1104  %cmp = icmp ne i32 %shl, 31
1105  ret i1 %cmp
1106}
1107
1108; CHECK-LABEL: @icmp_shl_1_V_ult_30(
1109; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5
1110; CHECK-NEXT: ret i1 [[CMP]]
1111define i1 @icmp_shl_1_V_ult_30(i32 %V) {
1112  %shl = shl i32 1, %V
1113  %cmp = icmp ult i32 %shl, 30
1114  ret i1 %cmp
1115}
1116
1117; CHECK-LABEL: @icmp_shl_1_V_ugt_30(
1118; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %V, 4
1119; CHECK-NEXT: ret i1 [[CMP]]
1120define i1 @icmp_shl_1_V_ugt_30(i32 %V) {
1121  %shl = shl i32 1, %V
1122  %cmp = icmp ugt i32 %shl, 30
1123  ret i1 %cmp
1124}
1125
1126; CHECK-LABEL: @icmp_shl_1_V_ule_30(
1127; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5
1128; CHECK-NEXT: ret i1 [[CMP]]
1129define i1 @icmp_shl_1_V_ule_30(i32 %V) {
1130  %shl = shl i32 1, %V
1131  %cmp = icmp ule i32 %shl, 30
1132  ret i1 %cmp
1133}
1134
1135; CHECK-LABEL: @icmp_shl_1_V_uge_30(
1136; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %V, 4
1137; CHECK-NEXT: ret i1 [[CMP]]
1138define i1 @icmp_shl_1_V_uge_30(i32 %V) {
1139  %shl = shl i32 1, %V
1140  %cmp = icmp uge i32 %shl, 30
1141  ret i1 %cmp
1142}
1143
1144; CHECK-LABEL: @icmp_shl_1_V_uge_2147483648(
1145; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 %V, 31
1146; CHECK-NEXT: ret i1 [[CMP]]
1147define i1 @icmp_shl_1_V_uge_2147483648(i32 %V) {
1148  %shl = shl i32 1, %V
1149  %cmp = icmp uge i32 %shl, 2147483648
1150  ret i1 %cmp
1151}
1152
1153; CHECK-LABEL: @icmp_shl_1_V_ugt_2147483648(
1154; CHECK-NEXT: ret i1 false
1155define i1 @icmp_shl_1_V_ugt_2147483648(i32 %V) {
1156  %shl = shl i32 1, %V
1157  %cmp = icmp ugt i32 %shl, 2147483648
1158  ret i1 %cmp
1159}
1160
1161; CHECK-LABEL: @icmp_shl_1_V_ule_2147483648(
1162; CHECK-NEXT: ret i1 true
1163define i1 @icmp_shl_1_V_ule_2147483648(i32 %V) {
1164  %shl = shl i32 1, %V
1165  %cmp = icmp ule i32 %shl, 2147483648
1166  ret i1 %cmp
1167}
1168
1169; CHECK-LABEL: @icmp_shl_1_V_ult_2147483648(
1170; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 %V, 31
1171; CHECK-NEXT: ret i1 [[CMP]]
1172define i1 @icmp_shl_1_V_ult_2147483648(i32 %V) {
1173  %shl = shl i32 1, %V
1174  %cmp = icmp ult i32 %shl, 2147483648
1175  ret i1 %cmp
1176}
1177
1178; CHECK-LABEL: @or_icmp_eq_B_0_icmp_ult_A_B(
1179; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = add i64 %b, -1
1180; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp uge i64 [[SUB]], %a
1181; CHECK-NEXT: ret i1 [[CMP]]
1182define i1 @or_icmp_eq_B_0_icmp_ult_A_B(i64 %a, i64 %b) {
1183  %1 = icmp eq i64 %b, 0
1184  %2 = icmp ult i64 %a, %b
1185  %3 = or i1 %1, %2
1186  ret i1 %3
1187}
1188
1189; CHECK-LABEL: @icmp_add_ult_2(
1190; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
1191; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 14
1192; CHECK-NEXT: ret i1 [[CMP]]
1193define i1 @icmp_add_ult_2(i32 %X) {
1194  %add = add i32 %X, -14
1195  %cmp = icmp ult i32 %add, 2
1196  ret i1 %cmp
1197}
1198
1199; CHECK: @icmp_add_X_-14_ult_2
1200; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
1201; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 14
1202; CHECK-NEXT: ret i1 [[CMP]]
1203define i1 @icmp_add_X_-14_ult_2(i32 %X) {
1204  %add = add i32 %X, -14
1205  %cmp = icmp ult i32 %add, 2
1206  ret i1 %cmp
1207}
1208
1209; CHECK-LABEL: @icmp_sub_3_X_ult_2(
1210; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %X, 1
1211; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[OR]], 3
1212; CHECK-NEXT: ret i1 [[CMP]]
1213define i1 @icmp_sub_3_X_ult_2(i32 %X) {
1214  %add = sub i32 3, %X
1215  %cmp = icmp ult i32 %add, 2
1216  ret i1 %cmp
1217}
1218
1219; CHECK: @icmp_add_X_-14_uge_2
1220; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
1221; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 14
1222; CHECK-NEXT: ret i1 [[CMP]]
1223define i1 @icmp_add_X_-14_uge_2(i32 %X) {
1224  %add = add i32 %X, -14
1225  %cmp = icmp uge i32 %add, 2
1226  ret i1 %cmp
1227}
1228
1229; CHECK-LABEL: @icmp_sub_3_X_uge_2(
1230; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %X, 1
1231; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[OR]], 3
1232; CHECK-NEXT: ret i1 [[CMP]]
1233define i1 @icmp_sub_3_X_uge_2(i32 %X) {
1234  %add = sub i32 3, %X
1235  %cmp = icmp uge i32 %add, 2
1236  ret i1 %cmp
1237}
1238
1239; CHECK: @icmp_and_X_-16_eq-16
1240; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %X, -17
1241; CHECK-NEXT: ret i1 [[CMP]]
1242define i1 @icmp_and_X_-16_eq-16(i32 %X) {
1243  %and = and i32 %X, -16
1244  %cmp = icmp eq i32 %and, -16
1245  ret i1 %cmp
1246}
1247
1248; CHECK: @icmp_and_X_-16_ne-16
1249; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, -16
1250; CHECK-NEXT: ret i1 [[CMP]]
1251define i1 @icmp_and_X_-16_ne-16(i32 %X) {
1252  %and = and i32 %X, -16
1253  %cmp = icmp ne i32 %and, -16
1254  ret i1 %cmp
1255}
1256
1257; CHECK: @icmp_sub_-1_X_ult_4
1258; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %X, -5
1259; CHECK-NEXT: ret i1 [[CMP]]
1260define i1 @icmp_sub_-1_X_ult_4(i32 %X) {
1261  %sub = sub i32 -1, %X
1262  %cmp = icmp ult i32 %sub, 4
1263  ret i1 %cmp
1264}
1265
1266; CHECK: @icmp_sub_-1_X_uge_4
1267; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, -4
1268; CHECK-NEXT: ret i1 [[CMP]]
1269define i1 @icmp_sub_-1_X_uge_4(i32 %X) {
1270  %sub = sub i32 -1, %X
1271  %cmp = icmp uge i32 %sub, 4
1272  ret i1 %cmp
1273}
1274
1275; CHECK-LABEL: @icmp_swap_operands_for_cse
1276; CHECK: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, %Y
1277; CHECK-NEXT: br i1 [[CMP]], label %true, label %false
1278; CHECK: ret i1
1279define i1 @icmp_swap_operands_for_cse(i32 %X, i32 %Y) {
1280entry:
1281  %sub = sub i32 %X, %Y
1282  %cmp = icmp ugt i32 %Y, %X
1283  br i1 %cmp, label %true, label %false
1284true:
1285  %restrue = trunc i32 %sub to i1
1286  br label %end
1287false:
1288  %shift = lshr i32 %sub, 4
1289  %resfalse = trunc i32 %shift to i1
1290  br label %end
1291end:
1292  %res = phi i1 [%restrue, %true], [%resfalse, %false]
1293  ret i1 %res
1294}
1295
1296; CHECK-LABEL: @icmp_swap_operands_for_cse2
1297; CHECK: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, %Y
1298; CHECK-NEXT: br i1 [[CMP]], label %true, label %false
1299; CHECK: ret i1
1300define i1 @icmp_swap_operands_for_cse2(i32 %X, i32 %Y) {
1301entry:
1302  %cmp = icmp ugt i32 %Y, %X
1303  br i1 %cmp, label %true, label %false
1304true:
1305  %sub = sub i32 %X, %Y
1306  %sub1 = sub i32 %X, %Y
1307  %add = add i32 %sub, %sub1
1308  %restrue = trunc i32 %add to i1
1309  br label %end
1310false:
1311  %sub2 = sub i32 %Y, %X
1312  %resfalse = trunc i32 %sub2 to i1
1313  br label %end
1314end:
1315  %res = phi i1 [%restrue, %true], [%resfalse, %false]
1316  ret i1 %res
1317}
1318
1319; CHECK-LABEL: @icmp_do_not_swap_operands_for_cse
1320; CHECK: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %Y, %X
1321; CHECK-NEXT: br i1 [[CMP]], label %true, label %false
1322; CHECK: ret i1
1323define i1 @icmp_do_not_swap_operands_for_cse(i32 %X, i32 %Y) {
1324entry:
1325  %cmp = icmp ugt i32 %Y, %X
1326  br i1 %cmp, label %true, label %false
1327true:
1328  %sub = sub i32 %X, %Y
1329  %restrue = trunc i32 %sub to i1
1330  br label %end
1331false:
1332  %sub2 = sub i32 %Y, %X
1333  %resfalse = trunc i32 %sub2 to i1
1334  br label %end
1335end:
1336  %res = phi i1 [%restrue, %true], [%resfalse, %false]
1337  ret i1 %res
1338}
1339
1340; CHECK-LABEL: @icmp_lshr_lshr_eq
1341; CHECK: %z.unshifted = xor i32 %a, %b
1342; CHECK: %z = icmp ult i32 %z.unshifted, 1073741824
1343define i1 @icmp_lshr_lshr_eq(i32 %a, i32 %b) nounwind {
1344 %x = lshr i32 %a, 30
1345 %y = lshr i32 %b, 30
1346 %z = icmp eq i32 %x, %y
1347 ret i1 %z
1348}
1349
1350; CHECK-LABEL: @icmp_ashr_ashr_ne
1351; CHECK: %z.unshifted = xor i32 %a, %b
1352; CHECK: %z = icmp ugt i32 %z.unshifted, 255
1353define i1 @icmp_ashr_ashr_ne(i32 %a, i32 %b) nounwind {
1354 %x = ashr i32 %a, 8
1355 %y = ashr i32 %b, 8
1356 %z = icmp ne i32 %x, %y
1357 ret i1 %z
1358}
1359