OSDN Git Service

[InstSimplify] Fold another Select with And/Or pattern
[android-x86/external-llvm.git] / test / Transforms / InstSimplify / select-and-cmp.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instsimplify -S | FileCheck %s
3
4 define i32 @select_and_icmp(i32 %x, i32 %y, i32 %z) {
5 ; CHECK-LABEL: @select_and_icmp(
6 ; CHECK-NEXT:    ret i32 [[X:%.*]]
7 ;
8   %A = icmp eq i32 %x, %z
9   %B = icmp eq i32 %y, %z
10   %C = and i1 %A, %B
11   %D = select i1 %C, i32 %z, i32 %x
12   ret i32 %D
13 }
14
15 define <2 x i8> @select_and_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
16 ; CHECK-LABEL: @select_and_icmp_vec(
17 ; CHECK-NEXT:    ret <2 x i8> [[X:%.*]]
18 ;
19   %A = icmp eq <2 x i8> %x, %z
20   %B = icmp eq <2 x i8> %y, %z
21   %C = and <2 x i1> %A, %B
22   %D = select <2 x i1> %C, <2 x i8> %z, <2 x i8> %x
23   ret <2 x i8> %D
24 }
25
26 define i32 @select_and_icmp2(i32 %x, i32 %y, i32 %z) {
27 ; CHECK-LABEL: @select_and_icmp2(
28 ; CHECK-NEXT:    ret i32 [[Y:%.*]]
29 ;
30   %A = icmp eq i32 %x, %z
31   %B = icmp eq i32 %y, %z
32   %C = and i1 %A, %B
33   %D = select i1 %C, i32 %z, i32 %y
34   ret i32 %D
35 }
36
37 define i32 @select_and_icmp_alt(i32 %x, i32 %y, i32 %z) {
38 ; CHECK-LABEL: @select_and_icmp_alt(
39 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
40 ;
41   %A = icmp eq i32 %x, %z
42   %B = icmp eq i32 %y, %z
43   %C = and i1 %A, %B
44   %D = select i1 %C, i32 %x, i32 %z
45   ret i32 %D
46 }
47
48 define i32 @select_and_icmp_alt2(i32 %x, i32 %y, i32 %z) {
49 ; CHECK-LABEL: @select_and_icmp_alt2(
50 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
51 ;
52   %A = icmp eq i32 %x, %z
53   %B = icmp eq i32 %y, %z
54   %C = and i1 %A, %B
55   %D = select i1 %C, i32 %y, i32 %z
56   ret i32 %D
57 }
58
59 define i32 @select_and_icmp_inv_alt(i32 %x, i32 %y, i32 %z) {
60 ; CHECK-LABEL: @select_and_icmp_inv_alt(
61 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
62 ;
63   %A = icmp eq i32 %z, %x
64   %B = icmp eq i32 %z, %y
65   %C = and i1 %A, %B
66   %D = select i1 %C, i32 %x, i32 %z
67   ret i32 %D
68 }
69
70 define i32 @select_and_inv_icmp_alt(i32 %x, i32 %y, i32 %z) {
71 ; CHECK-LABEL: @select_and_inv_icmp_alt(
72 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
73 ;
74   %A = icmp eq i32 %x, %z
75   %B = icmp eq i32 %y, %z
76   %C = and i1 %B, %A
77   %D = select i1 %C, i32 %x, i32 %z
78   ret i32 %D
79 }
80
81 define i32 @select_and_inv_icmp(i32 %x, i32 %y, i32 %z) {
82 ; CHECK-LABEL: @select_and_inv_icmp(
83 ; CHECK-NEXT:    ret i32 [[X:%.*]]
84 ;
85   %A = icmp eq i32 %x, %z
86   %B = icmp eq i32 %y, %z
87   %C = and i1 %B , %A
88   %D = select i1 %C, i32 %z, i32 %x
89   ret i32 %D
90 }
91
92 define <2 x i8> @select_and_icmp_alt_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
93 ; CHECK-LABEL: @select_and_icmp_alt_vec(
94 ; CHECK-NEXT:    ret <2 x i8> [[Z:%.*]]
95 ;
96   %A = icmp eq <2 x i8> %x, %z
97   %B = icmp eq <2 x i8> %y, %z
98   %C = and <2 x i1> %A, %B
99   %D = select <2 x i1> %C, <2 x i8> %x, <2 x i8> %z
100   ret <2 x i8> %D
101 }
102
103
104 define i32 @select_and_icmp_inv(i32 %x, i32 %y, i32 %z) {
105 ; CHECK-LABEL: @select_and_icmp_inv(
106 ; CHECK-NEXT:    ret i32 [[X:%.*]]
107 ;
108   %A = icmp eq i32 %z, %x
109   %B = icmp eq i32 %z, %y
110   %C = and i1 %A, %B
111   %D = select i1 %C, i32 %z, i32 %x
112   ret i32 %D
113 }
114
115 ; Negative tests
116 define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
117 ; CHECK-LABEL: @select_and_icmp_pred_bad_1(
118 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
119 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
120 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
121 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
122 ; CHECK-NEXT:    ret i32 [[D]]
123 ;
124   %A = icmp eq i32 %x, %z
125   %B = icmp ne i32 %y, %z
126   %C = and i1 %A, %B
127   %D = select i1 %C, i32 %z, i32 %x
128   ret i32 %D
129 }
130
131 define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
132 ; CHECK-LABEL: @select_and_icmp_pred_bad_2(
133 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
134 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
135 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
136 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
137 ; CHECK-NEXT:    ret i32 [[D]]
138 ;
139   %A = icmp ne i32 %x, %z
140   %B = icmp eq i32 %y, %z
141   %C = and i1 %A, %B
142   %D = select i1 %C, i32 %z, i32 %x
143   ret i32 %D
144 }
145
146 define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
147 ; CHECK-LABEL: @select_and_icmp_pred_bad_3(
148 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
149 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
150 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
151 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
152 ; CHECK-NEXT:    ret i32 [[D]]
153 ;
154   %A = icmp ne i32 %x, %z
155   %B = icmp ne i32 %y, %z
156   %C = and i1 %A, %B
157   %D = select i1 %C, i32 %z, i32 %x
158   ret i32 %D
159 }
160
161 define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
162 ; CHECK-LABEL: @select_and_icmp_pred_bad_4(
163 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
164 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
165 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
166 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
167 ; CHECK-NEXT:    ret i32 [[D]]
168 ;
169   %A = icmp eq i32 %x, %z
170   %B = icmp eq i32 %y, %z
171   %C = or i1 %A, %B
172   %D = select i1 %C, i32 %z, i32 %x
173   ret i32 %D
174 }
175
176 define i32 @select_and_icmp_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
177 ; CHECK-LABEL: @select_and_icmp_bad_true_val(
178 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
179 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
180 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
181 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[X]]
182 ; CHECK-NEXT:    ret i32 [[D]]
183 ;
184   %A = icmp eq i32 %x, %z
185   %B = icmp eq i32 %y, %z
186   %C = and i1 %A, %B
187   %D = select i1 %C, i32 %k, i32 %x
188   ret i32 %D
189 }
190
191 define i32 @select_and_icmp_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
192 ; CHECK-LABEL: @select_and_icmp_bad_false_val(
193 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
194 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
195 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
196 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[K:%.*]]
197 ; CHECK-NEXT:    ret i32 [[D]]
198 ;
199   %A = icmp eq i32 %x, %z
200   %B = icmp eq i32 %y, %z
201   %C = and i1 %A, %B
202   %D = select i1 %C, i32 %z, i32 %k
203   ret i32 %D
204 }
205
206 define i32 @select_and_icmp_bad_op(i32 %x, i32 %y, i32 %z, i32 %k) {
207 ; CHECK-LABEL: @select_and_icmp_bad_op(
208 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[K:%.*]], [[Z:%.*]]
209 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
210 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
211 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X:%.*]]
212 ; CHECK-NEXT:    ret i32 [[D]]
213 ;
214   %A = icmp eq i32 %k, %z
215   %B = icmp eq i32 %y, %z
216   %C = and i1 %A, %B
217   %D = select i1 %C, i32 %z, i32 %x
218   ret i32 %D
219 }
220
221 define i32 @select_and_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {
222 ; CHECK-LABEL: @select_and_icmp_bad_op_2(
223 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]
224 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]
225 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
226 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
227 ; CHECK-NEXT:    ret i32 [[D]]
228 ;
229   %A = icmp eq i32 %x, %k
230   %B = icmp eq i32 %y, %z
231   %C = and i1 %A, %B
232   %D = select i1 %C, i32 %z, i32 %x
233   ret i32 %D
234 }
235
236 define i32 @select_and_icmp_alt_bad_1(i32 %x, i32 %y, i32 %z) {
237 ; CHECK-LABEL: @select_and_icmp_alt_bad_1(
238 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
239 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
240 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
241 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
242 ; CHECK-NEXT:    ret i32 [[D]]
243 ;
244   %A = icmp eq i32 %x, %z
245   %B = icmp ne i32 %y, %z
246   %C = and i1 %A, %B
247   %D = select i1 %C, i32 %x, i32 %z
248   ret i32 %D
249 }
250
251 define i32 @select_and_icmp_alt_bad_2(i32 %x, i32 %y, i32 %z) {
252 ; CHECK-LABEL: @select_and_icmp_alt_bad_2(
253 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
254 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
255 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
256 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
257 ; CHECK-NEXT:    ret i32 [[D]]
258 ;
259   %A = icmp ne i32 %x, %z
260   %B = icmp eq i32 %y, %z
261   %C = and i1 %A, %B
262   %D = select i1 %C, i32 %x, i32 %z
263   ret i32 %D
264 }
265
266 define i32 @select_and_icmp_alt_bad_3(i32 %x, i32 %y, i32 %z) {
267 ; CHECK-LABEL: @select_and_icmp_alt_bad_3(
268 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
269 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
270 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
271 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
272 ; CHECK-NEXT:    ret i32 [[D]]
273 ;
274   %A = icmp ne i32 %x, %z
275   %B = icmp ne i32 %y, %z
276   %C = and i1 %A, %B
277   %D = select i1 %C, i32 %x, i32 %z
278   ret i32 %D
279 }
280
281 define i32 @select_and_icmp_alt_bad_4(i32 %x, i32 %y, i32 %z) {
282 ; CHECK-LABEL: @select_and_icmp_alt_bad_4(
283 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
284 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
285 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
286 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
287 ; CHECK-NEXT:    ret i32 [[D]]
288 ;
289   %A = icmp eq i32 %x, %z
290   %B = icmp eq i32 %y, %z
291   %C = or i1 %A, %B
292   %D = select i1 %C, i32 %x, i32 %z
293   ret i32 %D
294 }
295
296 define i32 @select_and_icmp_alt_bad_5(i32 %x, i32 %y, i32 %z, i32 %k) {
297 ; CHECK-LABEL: @select_and_icmp_alt_bad_5(
298 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]
299 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]
300 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
301 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
302 ; CHECK-NEXT:    ret i32 [[D]]
303 ;
304   %A = icmp eq i32 %x, %k
305   %B = icmp eq i32 %y, %z
306   %C = or i1 %A, %B
307   %D = select i1 %C, i32 %x, i32 %z
308   ret i32 %D
309 }
310
311 define i32 @select_and_icmp_alt_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
312 ; CHECK-LABEL: @select_and_icmp_alt_bad_true_val(
313 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
314 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
315 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
316 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[Z]]
317 ; CHECK-NEXT:    ret i32 [[D]]
318 ;
319   %A = icmp eq i32 %x, %z
320   %B = icmp eq i32 %y, %z
321   %C = and i1 %A, %B
322   %D = select i1 %C, i32 %k, i32 %z
323   ret i32 %D
324 }
325
326 define i32 @select_and_icmp_alt_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
327 ; CHECK-LABEL: @select_and_icmp_alt_bad_false_val(
328 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
329 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
330 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
331 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[K:%.*]]
332 ; CHECK-NEXT:    ret i32 [[D]]
333 ;
334   %A = icmp eq i32 %x, %z
335   %B = icmp eq i32 %y, %z
336   %C = and i1 %A, %B
337   %D = select i1 %C, i32 %x, i32 %k
338   ret i32 %D
339 }