1; RUN: opt < %s -instcombine -S | FileCheck %s
2
3; Check simplification of
4; (icmp sgt x, -1) & (icmp sgt/sge n, x) --> icmp ugt/uge n, x
5
6; CHECK-LABEL: define i1 @test_and1
7; CHECK: [[R:%[0-9]+]] = icmp ugt i32 %nn, %x
8; CHECK: ret i1 [[R]]
9define i1 @test_and1(i32 %x, i32 %n) {
10  %nn = and i32 %n, 2147483647
11  %a = icmp sge i32 %x, 0
12  %b = icmp slt i32 %x, %nn
13  %c = and i1 %a, %b
14  ret i1 %c
15}
16
17; CHECK-LABEL: define i1 @test_and2
18; CHECK: [[R:%[0-9]+]] = icmp uge i32 %nn, %x
19; CHECK: ret i1 [[R]]
20define i1 @test_and2(i32 %x, i32 %n) {
21  %nn = and i32 %n, 2147483647
22  %a = icmp sgt i32 %x, -1
23  %b = icmp sle i32 %x, %nn
24  %c = and i1 %a, %b
25  ret i1 %c
26}
27
28; CHECK-LABEL: define i1 @test_and3
29; CHECK: [[R:%[0-9]+]] = icmp ugt i32 %nn, %x
30; CHECK: ret i1 [[R]]
31define i1 @test_and3(i32 %x, i32 %n) {
32  %nn = and i32 %n, 2147483647
33  %a = icmp sgt i32 %nn, %x
34  %b = icmp sge i32 %x, 0
35  %c = and i1 %a, %b
36  ret i1 %c
37}
38
39; CHECK-LABEL: define i1 @test_and4
40; CHECK: [[R:%[0-9]+]] = icmp uge i32 %nn, %x
41; CHECK: ret i1 [[R]]
42define i1 @test_and4(i32 %x, i32 %n) {
43  %nn = and i32 %n, 2147483647
44  %a = icmp sge i32 %nn, %x
45  %b = icmp sge i32 %x, 0
46  %c = and i1 %a, %b
47  ret i1 %c
48}
49
50; CHECK-LABEL: define i1 @test_or1
51; CHECK: [[R:%[0-9]+]] = icmp ule i32 %nn, %x
52; CHECK: ret i1 [[R]]
53define i1 @test_or1(i32 %x, i32 %n) {
54  %nn = and i32 %n, 2147483647
55  %a = icmp slt i32 %x, 0
56  %b = icmp sge i32 %x, %nn
57  %c = or i1 %a, %b
58  ret i1 %c
59}
60
61; CHECK-LABEL: define i1 @test_or2
62; CHECK: [[R:%[0-9]+]] = icmp ult i32 %nn, %x
63; CHECK: ret i1 [[R]]
64define i1 @test_or2(i32 %x, i32 %n) {
65  %nn = and i32 %n, 2147483647
66  %a = icmp sle i32 %x, -1
67  %b = icmp sgt i32 %x, %nn
68  %c = or i1 %a, %b
69  ret i1 %c
70}
71
72; CHECK-LABEL: define i1 @test_or3
73; CHECK: [[R:%[0-9]+]] = icmp ule i32 %nn, %x
74; CHECK: ret i1 [[R]]
75define i1 @test_or3(i32 %x, i32 %n) {
76  %nn = and i32 %n, 2147483647
77  %a = icmp sle i32 %nn, %x
78  %b = icmp slt i32 %x, 0
79  %c = or i1 %a, %b
80  ret i1 %c
81}
82
83; CHECK-LABEL: define i1 @test_or4
84; CHECK: [[R:%[0-9]+]] = icmp ult i32 %nn, %x
85; CHECK: ret i1 [[R]]
86define i1 @test_or4(i32 %x, i32 %n) {
87  %nn = and i32 %n, 2147483647
88  %a = icmp slt i32 %nn, %x
89  %b = icmp slt i32 %x, 0
90  %c = or i1 %a, %b
91  ret i1 %c
92}
93
94; Negative tests
95
96; CHECK-LABEL: define i1 @negative1
97; CHECK: %a = icmp
98; CHECK: %b = icmp
99; CHECK: %c = and i1 %a, %b
100; CHECK: ret i1 %c
101define i1 @negative1(i32 %x, i32 %n) {
102  %nn = and i32 %n, 2147483647
103  %a = icmp slt i32 %x, %nn
104  %b = icmp sgt i32 %x, 0      ; should be: icmp sge
105  %c = and i1 %a, %b
106  ret i1 %c
107}
108
109; CHECK-LABEL: define i1 @negative2
110; CHECK: %a = icmp
111; CHECK: %b = icmp
112; CHECK: %c = and i1 %a, %b
113; CHECK: ret i1 %c
114define i1 @negative2(i32 %x, i32 %n) {
115  %a = icmp slt i32 %x, %n     ; n can be negative
116  %b = icmp sge i32 %x, 0
117  %c = and i1 %a, %b
118  ret i1 %c
119}
120
121; CHECK-LABEL: define i1 @negative3
122; CHECK: %a = icmp
123; CHECK: %b = icmp
124; CHECK: %c = and i1 %a, %b
125; CHECK: ret i1 %c
126define i1 @negative3(i32 %x, i32 %y, i32 %n) {
127  %nn = and i32 %n, 2147483647
128  %a = icmp slt i32 %x, %nn
129  %b = icmp sge i32 %y, 0      ; should compare %x and not %y
130  %c = and i1 %a, %b
131  ret i1 %c
132}
133
134; CHECK-LABEL: define i1 @negative4
135; CHECK: %a = icmp
136; CHECK: %b = icmp
137; CHECK: %c = and i1 %a, %b
138; CHECK: ret i1 %c
139define i1 @negative4(i32 %x, i32 %n) {
140  %nn = and i32 %n, 2147483647
141  %a = icmp ne i32 %x, %nn     ; should be: icmp slt/sle
142  %b = icmp sge i32 %x, 0
143  %c = and i1 %a, %b
144  ret i1 %c
145}
146
147; CHECK-LABEL: define i1 @negative5
148; CHECK: %a = icmp
149; CHECK: %b = icmp
150; CHECK: %c = or i1 %a, %b
151; CHECK: ret i1 %c
152define i1 @negative5(i32 %x, i32 %n) {
153  %nn = and i32 %n, 2147483647
154  %a = icmp slt i32 %x, %nn
155  %b = icmp sge i32 %x, 0
156  %c = or i1 %a, %b            ; should be: and
157  ret i1 %c
158}
159
160