Follow up to d0858bffa11, add missing REQUIRES x86
[llvm-project.git] / llvm / test / Transforms / InstSimplify / select-and-cmp.ll
blob41a4ab96bd62cca3cb936f880b57befd88f2af55
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
4 define i32 @select_and_icmp(i32 %x, i32 %y, i32 %z) {
5 ; CHECK-LABEL: @select_and_icmp(
6 ; CHECK-NEXT:    ret i32 [[X:%.*]]
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
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:%.*]]
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
26 define i32 @select_and_icmp2(i32 %x, i32 %y, i32 %z) {
27 ; CHECK-LABEL: @select_and_icmp2(
28 ; CHECK-NEXT:    ret i32 [[Y:%.*]]
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
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:%.*]]
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
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:%.*]]
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
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:%.*]]
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
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:%.*]]
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
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:%.*]]
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
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:%.*]]
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
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:%.*]]
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
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]]
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
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]]
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
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]]
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
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]]
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
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]]
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
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]]
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
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]]
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
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]]
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
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]]
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
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]]
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
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]]
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
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]]
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
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]]
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
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]]
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
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]]
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