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