blob: 1810beb2371c2e8aef4312b5b64762c6122edfda [file] [log] [blame]
David Bolvansky1b826172018-07-27 20:18:12 +00001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
David Bolvansky9800b712018-07-28 13:52:45 +00002; RUN: opt < %s -instsimplify -S | FileCheck %s
David Bolvansky1b826172018-07-27 20:18:12 +00003
David Bolvansky1b826172018-07-27 20:18:12 +00004define i32 @select_or_icmp(i32 %x, i32 %y, i32 %z) {
5; CHECK-LABEL: @select_or_icmp(
David Bolvanskyf9476082018-07-28 06:55:51 +00006; CHECK-NEXT: ret i32 [[Z:%.*]]
David Bolvansky1b826172018-07-27 20:18:12 +00007;
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
15define <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(
David Bolvanskyf9476082018-07-28 06:55:51 +000017; CHECK-NEXT: ret <2 x i8> [[Z:%.*]]
David Bolvansky1b826172018-07-27 20:18:12 +000018;
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
26define i32 @select_or_icmp2(i32 %x, i32 %y, i32 %z) {
27; CHECK-LABEL: @select_or_icmp2(
David Bolvanskyf9476082018-07-28 06:55:51 +000028; CHECK-NEXT: ret i32 [[Z:%.*]]
David Bolvansky1b826172018-07-27 20:18:12 +000029;
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
David Bolvansky76e95862018-07-30 18:22:18 +000037define 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
52define 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
67define 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
82define 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
97define <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
David Bolvansky1b826172018-07-27 20:18:12 +0000112define i32 @select_or_inv_icmp(i32 %x, i32 %y, i32 %z) {
113; CHECK-LABEL: @select_or_inv_icmp(
David Bolvanskyf9476082018-07-28 06:55:51 +0000114; CHECK-NEXT: ret i32 [[Z:%.*]]
David Bolvansky1b826172018-07-27 20:18:12 +0000115;
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
123define i32 @select_or_icmp_inv(i32 %x, i32 %y, i32 %z) {
124; CHECK-LABEL: @select_or_icmp_inv(
David Bolvanskyf9476082018-07-28 06:55:51 +0000125; CHECK-NEXT: ret i32 [[Z:%.*]]
David Bolvansky1b826172018-07-27 20:18:12 +0000126;
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
135define 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
150define 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
165define 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
180define 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
195define 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
210define 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
225define 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
241define 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}
David Bolvansky76e95862018-07-30 18:22:18 +0000255
256define 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
271define 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
286define 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
301define 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
316define 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
331define 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
346define 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}