OSDN Git Service

1810beb2371c2e8aef4312b5b64762c6122edfda
[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:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
40 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
41 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
42 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
43 ; CHECK-NEXT:    ret i32 [[D]]
44 ;
45   %A = icmp ne i32 %x, %z
46   %B = icmp ne i32 %y, %z
47   %C = or i1 %A, %B
48   %D = select i1 %C, i32 %x, i32 %z
49   ret i32 %D
50 }
51
52 define i32 @select_or_icmp_alt2(i32 %x, i32 %y, i32 %z) {
53 ; CHECK-LABEL: @select_or_icmp_alt2(
54 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
55 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
56 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
57 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Y]], i32 [[Z]]
58 ; CHECK-NEXT:    ret i32 [[D]]
59 ;
60   %A = icmp ne i32 %x, %z
61   %B = icmp ne i32 %y, %z
62   %C = or i1 %A, %B
63   %D = select i1 %C, i32 %y, i32 %z
64   ret i32 %D
65 }
66
67 define i32 @select_or_icmp_inv_alt(i32 %x, i32 %y, i32 %z) {
68 ; CHECK-LABEL: @select_or_icmp_inv_alt(
69 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[Z:%.*]], [[X:%.*]]
70 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Z]], [[Y:%.*]]
71 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
72 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
73 ; CHECK-NEXT:    ret i32 [[D]]
74 ;
75   %A = icmp ne i32 %z, %x
76   %B = icmp ne i32 %z, %y
77   %C = or i1 %A, %B
78   %D = select i1 %C, i32 %x, i32 %z
79   ret i32 %D
80 }
81
82 define i32 @select_or_inv_icmp_alt(i32 %x, i32 %y, i32 %z) {
83 ; CHECK-LABEL: @select_or_inv_icmp_alt(
84 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[Z:%.*]], [[X:%.*]]
85 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Z]], [[Y:%.*]]
86 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[B]], [[A]]
87 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
88 ; CHECK-NEXT:    ret i32 [[D]]
89 ;
90   %A = icmp ne i32 %z, %x
91   %B = icmp ne i32 %z, %y
92   %C = or i1 %B, %A
93   %D = select i1 %C, i32 %x, i32 %z
94   ret i32 %D
95 }
96
97 define <2 x i8> @select_or_icmp_alt_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
98 ; CHECK-LABEL: @select_or_icmp_alt_vec(
99 ; CHECK-NEXT:    [[A:%.*]] = icmp ne <2 x i8> [[X:%.*]], [[Z:%.*]]
100 ; CHECK-NEXT:    [[B:%.*]] = icmp ne <2 x i8> [[Y:%.*]], [[Z]]
101 ; CHECK-NEXT:    [[C:%.*]] = or <2 x i1> [[A]], [[B]]
102 ; CHECK-NEXT:    [[D:%.*]] = select <2 x i1> [[C]], <2 x i8> [[X]], <2 x i8> [[Z]]
103 ; CHECK-NEXT:    ret <2 x i8> [[D]]
104 ;
105   %A = icmp ne <2 x i8> %x, %z
106   %B = icmp ne <2 x i8> %y, %z
107   %C = or <2 x i1> %A, %B
108   %D = select <2 x i1> %C, <2 x i8> %x, <2 x i8> %z
109   ret <2 x i8> %D
110 }
111
112 define i32 @select_or_inv_icmp(i32 %x, i32 %y, i32 %z) {
113 ; CHECK-LABEL: @select_or_inv_icmp(
114 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
115 ;
116   %A = icmp ne i32 %x, %z
117   %B = icmp ne i32 %y, %z
118   %C = or i1 %B , %A
119   %D = select i1 %C, i32 %z, i32 %x
120   ret i32 %D
121 }
122
123 define i32 @select_or_icmp_inv(i32 %x, i32 %y, i32 %z) {
124 ; CHECK-LABEL: @select_or_icmp_inv(
125 ; CHECK-NEXT:    ret i32 [[Z:%.*]]
126 ;
127   %A = icmp ne i32 %z, %x
128   %B = icmp ne i32 %z, %y
129   %C = or i1 %A, %B
130   %D = select i1 %C, i32 %z, i32 %x
131   ret i32 %D
132 }
133
134 ; Negative tests
135 define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
136 ; CHECK-LABEL: @select_and_icmp_pred_bad_1(
137 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
138 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
139 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
140 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
141 ; CHECK-NEXT:    ret i32 [[D]]
142 ;
143   %A = icmp eq i32 %x, %z
144   %B = icmp ne i32 %y, %z
145   %C = or i1 %A, %B
146   %D = select i1 %C, i32 %z, i32 %x
147   ret i32 %D
148 }
149
150 define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
151 ; CHECK-LABEL: @select_and_icmp_pred_bad_2(
152 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
153 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
154 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
155 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
156 ; CHECK-NEXT:    ret i32 [[D]]
157 ;
158   %A = icmp ne i32 %x, %z
159   %B = icmp eq i32 %y, %z
160   %C = or i1 %A, %B
161   %D = select i1 %C, i32 %z, i32 %x
162   ret i32 %D
163 }
164
165 define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
166 ; CHECK-LABEL: @select_and_icmp_pred_bad_3(
167 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
168 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
169 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
170 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
171 ; CHECK-NEXT:    ret i32 [[D]]
172 ;
173   %A = icmp eq i32 %x, %z
174   %B = icmp eq i32 %y, %z
175   %C = or i1 %A, %B
176   %D = select i1 %C, i32 %z, i32 %x
177   ret i32 %D
178 }
179
180 define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
181 ; CHECK-LABEL: @select_and_icmp_pred_bad_4(
182 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
183 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
184 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
185 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
186 ; CHECK-NEXT:    ret i32 [[D]]
187 ;
188   %A = icmp ne i32 %x, %z
189   %B = icmp ne i32 %y, %z
190   %C = and i1 %A, %B
191   %D = select i1 %C, i32 %z, i32 %x
192   ret i32 %D
193 }
194
195 define i32 @select_or_icmp_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
196 ; CHECK-LABEL: @select_or_icmp_bad_true_val(
197 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
198 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
199 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
200 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[X]]
201 ; CHECK-NEXT:    ret i32 [[D]]
202 ;
203   %A = icmp ne i32 %x, %z
204   %B = icmp ne i32 %y, %z
205   %C = or i1 %A, %B
206   %D = select i1 %C, i32 %k, i32 %x
207   ret i32 %D
208 }
209
210 define i32 @select_or_icmp_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
211 ; CHECK-LABEL: @select_or_icmp_bad_false_val(
212 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
213 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
214 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
215 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[K:%.*]]
216 ; CHECK-NEXT:    ret i32 [[D]]
217 ;
218   %A = icmp ne i32 %x, %z
219   %B = icmp ne i32 %y, %z
220   %C = or i1 %A, %B
221   %D = select i1 %C, i32 %z, i32 %k
222   ret i32 %D
223 }
224
225 define i32 @select_or_icmp_bad_op(i32 %x, i32 %y, i32 %z, i32 %k) {
226 ; CHECK-LABEL: @select_or_icmp_bad_op(
227 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[K:%.*]], [[Z:%.*]]
228 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
229 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
230 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X:%.*]]
231 ; CHECK-NEXT:    ret i32 [[D]]
232 ;
233   %A = icmp ne i32 %k, %z
234   %B = icmp ne i32 %y, %z
235   %C = or i1 %A, %B
236   %D = select i1 %C, i32 %z, i32 %x
237   ret i32 %D
238 }
239
240
241 define i32 @select_or_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {
242 ; CHECK-LABEL: @select_or_icmp_bad_op_2(
243 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]]
244 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z:%.*]]
245 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
246 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
247 ; CHECK-NEXT:    ret i32 [[D]]
248 ;
249   %A = icmp ne i32 %x, %k
250   %B = icmp ne i32 %y, %z
251   %C = or i1 %A, %B
252   %D = select i1 %C, i32 %z, i32 %x
253   ret i32 %D
254 }
255
256 define i32 @select_or_icmp_alt_bad_1(i32 %x, i32 %y, i32 %z) {
257 ; CHECK-LABEL: @select_or_icmp_alt_bad_1(
258 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
259 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
260 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
261 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
262 ; CHECK-NEXT:    ret i32 [[D]]
263 ;
264   %A = icmp eq i32 %x, %z
265   %B = icmp ne i32 %y, %z
266   %C = or i1 %A, %B
267   %D = select i1 %C, i32 %x, i32 %z
268   ret i32 %D
269 }
270
271 define i32 @select_or_icmp_alt_bad_2(i32 %x, i32 %y, i32 %z) {
272 ; CHECK-LABEL: @select_or_icmp_alt_bad_2(
273 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
274 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
275 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
276 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
277 ; CHECK-NEXT:    ret i32 [[D]]
278 ;
279   %A = icmp ne i32 %x, %z
280   %B = icmp eq i32 %y, %z
281   %C = or i1 %A, %B
282   %D = select i1 %C, i32 %x, i32 %z
283   ret i32 %D
284 }
285
286 define i32 @select_or_icmp_alt_bad_3(i32 %x, i32 %y, i32 %z) {
287 ; CHECK-LABEL: @select_or_icmp_alt_bad_3(
288 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
289 ; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
290 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
291 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
292 ; CHECK-NEXT:    ret i32 [[D]]
293 ;
294   %A = icmp eq i32 %x, %z
295   %B = icmp eq i32 %y, %z
296   %C = or i1 %A, %B
297   %D = select i1 %C, i32 %x, i32 %z
298   ret i32 %D
299 }
300
301 define i32 @select_or_icmp_alt_bad_4(i32 %x, i32 %y, i32 %z) {
302 ; CHECK-LABEL: @select_or_icmp_alt_bad_4(
303 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
304 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
305 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
306 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
307 ; CHECK-NEXT:    ret i32 [[D]]
308 ;
309   %A = icmp ne i32 %x, %z
310   %B = icmp ne i32 %y, %z
311   %C = and i1 %A, %B
312   %D = select i1 %C, i32 %x, i32 %z
313   ret i32 %D
314 }
315
316 define i32 @select_or_icmp_alt_bad_5(i32 %x, i32 %y, i32 %z, i32 %k) {
317 ; CHECK-LABEL: @select_or_icmp_alt_bad_5(
318 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]]
319 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z:%.*]]
320 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
321 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
322 ; CHECK-NEXT:    ret i32 [[D]]
323 ;
324   %A = icmp ne i32 %x, %k
325   %B = icmp ne i32 %y, %z
326   %C = or i1 %A, %B
327   %D = select i1 %C, i32 %x, i32 %z
328   ret i32 %D
329 }
330
331 define i32 @select_or_icmp_alt_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
332 ; CHECK-LABEL: @select_or_icmp_alt_bad_true_val(
333 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
334 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
335 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
336 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[Z]]
337 ; CHECK-NEXT:    ret i32 [[D]]
338 ;
339   %A = icmp ne i32 %x, %z
340   %B = icmp ne i32 %y, %z
341   %C = or i1 %A, %B
342   %D = select i1 %C, i32 %k, i32 %z
343   ret i32 %D
344 }
345
346 define i32 @select_or_icmp_alt_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
347 ; CHECK-LABEL: @select_or_icmp_alt_bad_false_val(
348 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
349 ; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
350 ; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
351 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[K:%.*]]
352 ; CHECK-NEXT:    ret i32 [[D]]
353 ;
354   %A = icmp ne i32 %x, %z
355   %B = icmp ne i32 %y, %z
356   %C = or i1 %A, %B
357   %D = select i1 %C, i32 %x, i32 %k
358   ret i32 %D
359 }