OSDN Git Service

[InstSimplify] Fold another Select with And/Or pattern
[android-x86/external-llvm.git] / test / Transforms / InstSimplify / select-or-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_or_icmp(i32 %x, i32 %y, i32 %z) {
5 ; CHECK-LABEL: @select_or_icmp(
6 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
7 ;
8   %A = icmp ne i32 %x, %z
9   %B = icmp ne i32 %y, %z
10   %C = or i1 %A, %B
11   %D = select i1 %C, i32 %z, i32 %x
12   ret i32 %D
13 }
14
15 define <2 x i8> @select_or_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
16 ; CHECK-LABEL: @select_or_icmp_vec(
17 ; CHECK-NEXT:    ret <2 x i8> [[Z:%.*]]
18 ;
19   %A = icmp ne <2 x i8> %x, %z
20   %B = icmp ne <2 x i8> %y, %z
21   %C = or <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_or_icmp2(i32 %x, i32 %y, i32 %z) {
27 ; CHECK-LABEL: @select_or_icmp2(
28 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
29 ;
30   %A = icmp ne i32 %x, %z
31   %B = icmp ne i32 %y, %z
32   %C = or i1 %A, %B
33   %D = select i1 %C, i32 %z, i32 %y
34   ret i32 %D
35 }
36
37 define i32 @select_or_icmp_alt(i32 %x, i32 %y, i32 %z) {
38 ; CHECK-LABEL: @select_or_icmp_alt(
39 ; CHECK-NEXT:    ret i32 [[X:%.*]]
40 ;
41   %A = icmp ne i32 %x, %z
42   %B = icmp ne i32 %y, %z
43   %C = or i1 %A, %B
44   %D = select i1 %C, i32 %x, i32 %z
45   ret i32 %D
46 }
47
48 define i32 @select_or_icmp_alt2(i32 %x, i32 %y, i32 %z) {
49 ; CHECK-LABEL: @select_or_icmp_alt2(
50 ; CHECK-NEXT:    ret i32 [[Y:%.*]]
51 ;
52   %A = icmp ne i32 %x, %z
53   %B = icmp ne i32 %y, %z
54   %C = or i1 %A, %B
55   %D = select i1 %C, i32 %y, i32 %z
56   ret i32 %D
57 }
58
59 define i32 @select_or_icmp_inv_alt(i32 %x, i32 %y, i32 %z) {
60 ; CHECK-LABEL: @select_or_icmp_inv_alt(
61 ; CHECK-NEXT:    ret i32 [[X:%.*]]
62 ;
63   %A = icmp ne i32 %z, %x
64   %B = icmp ne i32 %z, %y
65   %C = or i1 %A, %B
66   %D = select i1 %C, i32 %x, i32 %z
67   ret i32 %D
68 }
69
70 define i32 @select_or_inv_icmp_alt(i32 %x, i32 %y, i32 %z) {
71 ; CHECK-LABEL: @select_or_inv_icmp_alt(
72 ; CHECK-NEXT:    ret i32 [[X:%.*]]
73 ;
74   %A = icmp ne i32 %z, %x
75   %B = icmp ne i32 %z, %y
76   %C = or i1 %B, %A
77   %D = select i1 %C, i32 %x, i32 %z
78   ret i32 %D
79 }
80
81 define <2 x i8> @select_or_icmp_alt_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
82 ; CHECK-LABEL: @select_or_icmp_alt_vec(
83 ; CHECK-NEXT:    ret <2 x i8> [[X:%.*]]
84 ;
85   %A = icmp ne <2 x i8> %x, %z
86   %B = icmp ne <2 x i8> %y, %z
87   %C = or <2 x i1> %A, %B
88   %D = select <2 x i1> %C, <2 x i8> %x, <2 x i8> %z
89   ret <2 x i8> %D
90 }
91
92 define i32 @select_or_inv_icmp(i32 %x, i32 %y, i32 %z) {
93 ; CHECK-LABEL: @select_or_inv_icmp(
94 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
95 ;
96   %A = icmp ne i32 %x, %z
97   %B = icmp ne i32 %y, %z
98   %C = or i1 %B , %A
99   %D = select i1 %C, i32 %z, i32 %x
100   ret i32 %D
101 }
102
103 define i32 @select_or_icmp_inv(i32 %x, i32 %y, i32 %z) {
104 ; CHECK-LABEL: @select_or_icmp_inv(
105 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
106 ;
107   %A = icmp ne i32 %z, %x
108   %B = icmp ne i32 %z, %y
109   %C = or i1 %A, %B
110   %D = select i1 %C, i32 %z, i32 %x
111   ret i32 %D
112 }
113
114 ; Negative tests
115 define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
116 ; CHECK-LABEL: @select_and_icmp_pred_bad_1(
117 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
118 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
119 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
120 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
121 ; CHECK-NEXT:    ret i32 [[D]]
122 ;
123   %A = icmp eq i32 %x, %z
124   %B = icmp ne i32 %y, %z
125   %C = or i1 %A, %B
126   %D = select i1 %C, i32 %z, i32 %x
127   ret i32 %D
128 }
129
130 define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
131 ; CHECK-LABEL: @select_and_icmp_pred_bad_2(
132 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
133 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
134 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
135 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
136 ; CHECK-NEXT:    ret i32 [[D]]
137 ;
138   %A = icmp ne i32 %x, %z
139   %B = icmp eq i32 %y, %z
140   %C = or i1 %A, %B
141   %D = select i1 %C, i32 %z, i32 %x
142   ret i32 %D
143 }
144
145 define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
146 ; CHECK-LABEL: @select_and_icmp_pred_bad_3(
147 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
148 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
149 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
150 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
151 ; CHECK-NEXT:    ret i32 [[D]]
152 ;
153   %A = icmp eq i32 %x, %z
154   %B = icmp eq i32 %y, %z
155   %C = or i1 %A, %B
156   %D = select i1 %C, i32 %z, i32 %x
157   ret i32 %D
158 }
159
160 define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
161 ; CHECK-LABEL: @select_and_icmp_pred_bad_4(
162 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
163 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
164 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
165 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
166 ; CHECK-NEXT:    ret i32 [[D]]
167 ;
168   %A = icmp ne i32 %x, %z
169   %B = icmp ne i32 %y, %z
170   %C = and i1 %A, %B
171   %D = select i1 %C, i32 %z, i32 %x
172   ret i32 %D
173 }
174
175 define i32 @select_or_icmp_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
176 ; CHECK-LABEL: @select_or_icmp_bad_true_val(
177 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
178 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
179 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
180 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[X]]
181 ; CHECK-NEXT:    ret i32 [[D]]
182 ;
183   %A = icmp ne i32 %x, %z
184   %B = icmp ne i32 %y, %z
185   %C = or i1 %A, %B
186   %D = select i1 %C, i32 %k, i32 %x
187   ret i32 %D
188 }
189
190 define i32 @select_or_icmp_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
191 ; CHECK-LABEL: @select_or_icmp_bad_false_val(
192 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
193 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
194 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
195 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[K:%.*]]
196 ; CHECK-NEXT:    ret i32 [[D]]
197 ;
198   %A = icmp ne i32 %x, %z
199   %B = icmp ne i32 %y, %z
200   %C = or i1 %A, %B
201   %D = select i1 %C, i32 %z, i32 %k
202   ret i32 %D
203 }
204
205 define i32 @select_or_icmp_bad_op(i32 %x, i32 %y, i32 %z, i32 %k) {
206 ; CHECK-LABEL: @select_or_icmp_bad_op(
207 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[K:%.*]], [[Z:%.*]]
208 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
209 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
210 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X:%.*]]
211 ; CHECK-NEXT:    ret i32 [[D]]
212 ;
213   %A = icmp ne i32 %k, %z
214   %B = icmp ne i32 %y, %z
215   %C = or i1 %A, %B
216   %D = select i1 %C, i32 %z, i32 %x
217   ret i32 %D
218 }
219
220
221 define i32 @select_or_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {
222 ; CHECK-LABEL: @select_or_icmp_bad_op_2(
223 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]]
224 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z:%.*]]
225 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
226 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
227 ; CHECK-NEXT:    ret i32 [[D]]
228 ;
229   %A = icmp ne i32 %x, %k
230   %B = icmp ne i32 %y, %z
231   %C = or i1 %A, %B
232   %D = select i1 %C, i32 %z, i32 %x
233   ret i32 %D
234 }
235
236 define i32 @select_or_icmp_alt_bad_1(i32 %x, i32 %y, i32 %z) {
237 ; CHECK-LABEL: @select_or_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:%.*]] = or 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 = or i1 %A, %B
247   %D = select i1 %C, i32 %x, i32 %z
248   ret i32 %D
249 }
250
251 define i32 @select_or_icmp_alt_bad_2(i32 %x, i32 %y, i32 %z) {
252 ; CHECK-LABEL: @select_or_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:%.*]] = or 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 = or i1 %A, %B
262   %D = select i1 %C, i32 %x, i32 %z
263   ret i32 %D
264 }
265
266 define i32 @select_or_icmp_alt_bad_3(i32 %x, i32 %y, i32 %z) {
267 ; CHECK-LABEL: @select_or_icmp_alt_bad_3(
268 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
269 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
270 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
271 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
272 ; CHECK-NEXT:    ret i32 [[D]]
273 ;
274   %A = icmp eq i32 %x, %z
275   %B = icmp eq i32 %y, %z
276   %C = or i1 %A, %B
277   %D = select i1 %C, i32 %x, i32 %z
278   ret i32 %D
279 }
280
281 define i32 @select_or_icmp_alt_bad_4(i32 %x, i32 %y, i32 %z) {
282 ; CHECK-LABEL: @select_or_icmp_alt_bad_4(
283 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
284 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
285 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
286 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
287 ; CHECK-NEXT:    ret i32 [[D]]
288 ;
289   %A = icmp ne i32 %x, %z
290   %B = icmp ne i32 %y, %z
291   %C = and i1 %A, %B
292   %D = select i1 %C, i32 %x, i32 %z
293   ret i32 %D
294 }
295
296 define i32 @select_or_icmp_alt_bad_5(i32 %x, i32 %y, i32 %z, i32 %k) {
297 ; CHECK-LABEL: @select_or_icmp_alt_bad_5(
298 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]]
299 ; CHECK-NEXT:    [[B:%.*]] = icmp ne 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 ne i32 %x, %k
305   %B = icmp ne 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_or_icmp_alt_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
312 ; CHECK-LABEL: @select_or_icmp_alt_bad_true_val(
313 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
314 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
315 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
316 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[Z]]
317 ; CHECK-NEXT:    ret i32 [[D]]
318 ;
319   %A = icmp ne i32 %x, %z
320   %B = icmp ne i32 %y, %z
321   %C = or i1 %A, %B
322   %D = select i1 %C, i32 %k, i32 %z
323   ret i32 %D
324 }
325
326 define i32 @select_or_icmp_alt_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
327 ; CHECK-LABEL: @select_or_icmp_alt_bad_false_val(
328 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
329 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
330 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
331 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[K:%.*]]
332 ; CHECK-NEXT:    ret i32 [[D]]
333 ;
334   %A = icmp ne i32 %x, %z
335   %B = icmp ne i32 %y, %z
336   %C = or i1 %A, %B
337   %D = select i1 %C, i32 %x, i32 %k
338   ret i32 %D
339 }