blob: eb18b2a1b8fe92f687b980b6529bf67570f9619a [file] [log] [blame]
David Bolvansky1b826172018-07-27 20:18:12 +00001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instcombine -S | FileCheck %s
3
4target triple = "x86_64-unknown-linux-gnu"
5
6define i32 @select_or_icmp(i32 %x, i32 %y, i32 %z) {
7; CHECK-LABEL: @select_or_icmp(
8; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
9; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
10; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
11; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
12; CHECK-NEXT: ret i32 [[D]]
13;
14 %A = icmp ne i32 %x, %z
15 %B = icmp ne i32 %y, %z
16 %C = or i1 %A, %B
17 %D = select i1 %C, i32 %z, i32 %x
18 ret i32 %D
19}
20
21define <2 x i8> @select_or_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
22; CHECK-LABEL: @select_or_icmp_vec(
23; CHECK-NEXT: [[A:%.*]] = icmp ne <2 x i8> [[X:%.*]], [[Z:%.*]]
24; CHECK-NEXT: [[B:%.*]] = icmp ne <2 x i8> [[Y:%.*]], [[Z]]
25; CHECK-NEXT: [[C:%.*]] = or <2 x i1> [[A]], [[B]]
26; CHECK-NEXT: [[D:%.*]] = select <2 x i1> [[C]], <2 x i8> [[Z]], <2 x i8> [[X]]
27; CHECK-NEXT: ret <2 x i8> [[D]]
28;
29 %A = icmp ne <2 x i8> %x, %z
30 %B = icmp ne <2 x i8> %y, %z
31 %C = or <2 x i1> %A, %B
32 %D = select <2 x i1> %C, <2 x i8> %z, <2 x i8> %x
33 ret <2 x i8> %D
34}
35
36define i32 @select_or_icmp2(i32 %x, i32 %y, i32 %z) {
37; CHECK-LABEL: @select_or_icmp2(
38; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
39; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
40; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
41; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[Y]]
42; CHECK-NEXT: ret i32 [[D]]
43;
44 %A = icmp ne i32 %x, %z
45 %B = icmp ne i32 %y, %z
46 %C = or i1 %A, %B
47 %D = select i1 %C, i32 %z, i32 %y
48 ret i32 %D
49}
50
51define i32 @select_or_inv_icmp(i32 %x, i32 %y, i32 %z) {
52; CHECK-LABEL: @select_or_inv_icmp(
53; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
54; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
55; CHECK-NEXT: [[C:%.*]] = or i1 [[B]], [[A]]
56; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
57; CHECK-NEXT: ret i32 [[D]]
58;
59 %A = icmp ne i32 %x, %z
60 %B = icmp ne i32 %y, %z
61 %C = or i1 %B , %A
62 %D = select i1 %C, i32 %z, i32 %x
63 ret i32 %D
64}
65
66define i32 @select_or_icmp_inv(i32 %x, i32 %y, i32 %z) {
67; CHECK-LABEL: @select_or_icmp_inv(
68; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[Z:%.*]], [[X:%.*]]
69; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Z]], [[Y:%.*]]
70; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
71; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
72; CHECK-NEXT: ret i32 [[D]]
73;
74 %A = icmp ne i32 %z, %x
75 %B = icmp ne i32 %z, %y
76 %C = or i1 %A, %B
77 %D = select i1 %C, i32 %z, i32 %x
78 ret i32 %D
79}
80
81; Negative tests
82define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
83; CHECK-LABEL: @select_and_icmp_pred_bad_1(
84; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
85; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
86; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
87; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
88; CHECK-NEXT: ret i32 [[D]]
89;
90 %A = icmp eq i32 %x, %z
91 %B = icmp ne i32 %y, %z
92 %C = or i1 %A, %B
93 %D = select i1 %C, i32 %z, i32 %x
94 ret i32 %D
95}
96
97define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
98; CHECK-LABEL: @select_and_icmp_pred_bad_2(
99; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
100; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
101; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
102; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
103; CHECK-NEXT: ret i32 [[D]]
104;
105 %A = icmp ne i32 %x, %z
106 %B = icmp eq i32 %y, %z
107 %C = or i1 %A, %B
108 %D = select i1 %C, i32 %z, i32 %x
109 ret i32 %D
110}
111
112define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
113; CHECK-LABEL: @select_and_icmp_pred_bad_3(
114; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
115; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
116; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
117; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
118; CHECK-NEXT: ret i32 [[D]]
119;
120 %A = icmp eq i32 %x, %z
121 %B = icmp eq i32 %y, %z
122 %C = or i1 %A, %B
123 %D = select i1 %C, i32 %z, i32 %x
124 ret i32 %D
125}
126
127define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
128; CHECK-LABEL: @select_and_icmp_pred_bad_4(
129; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
130; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
131; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
132; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
133; CHECK-NEXT: ret i32 [[D]]
134;
135 %A = icmp ne i32 %x, %z
136 %B = icmp ne i32 %y, %z
137 %C = and i1 %A, %B
138 %D = select i1 %C, i32 %z, i32 %x
139 ret i32 %D
140}
141
142define i32 @select_or_icmp_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
143; CHECK-LABEL: @select_or_icmp_bad_true_val(
144; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
145; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
146; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
147; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[X]]
148; CHECK-NEXT: ret i32 [[D]]
149;
150 %A = icmp ne i32 %x, %z
151 %B = icmp ne i32 %y, %z
152 %C = or i1 %A, %B
153 %D = select i1 %C, i32 %k, i32 %x
154 ret i32 %D
155}
156
157define i32 @select_or_icmp_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
158; CHECK-LABEL: @select_or_icmp_bad_false_val(
159; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
160; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
161; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
162; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[K:%.*]]
163; CHECK-NEXT: ret i32 [[D]]
164;
165 %A = icmp ne i32 %x, %z
166 %B = icmp ne i32 %y, %z
167 %C = or i1 %A, %B
168 %D = select i1 %C, i32 %z, i32 %k
169 ret i32 %D
170}
171
172define i32 @select_or_icmp_bad_op(i32 %x, i32 %y, i32 %z, i32 %k) {
173; CHECK-LABEL: @select_or_icmp_bad_op(
174; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[K:%.*]], [[Z:%.*]]
175; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
176; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
177; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X:%.*]]
178; CHECK-NEXT: ret i32 [[D]]
179;
180 %A = icmp ne i32 %k, %z
181 %B = icmp ne i32 %y, %z
182 %C = or i1 %A, %B
183 %D = select i1 %C, i32 %z, i32 %x
184 ret i32 %D
185}
186
187
188define i32 @select_or_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {
189; CHECK-LABEL: @select_or_icmp_bad_op_2(
190; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]]
191; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z:%.*]]
192; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
193; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
194; CHECK-NEXT: ret i32 [[D]]
195;
196 %A = icmp ne i32 %x, %k
197 %B = icmp ne i32 %y, %z
198 %C = or i1 %A, %B
199 %D = select i1 %C, i32 %z, i32 %x
200 ret i32 %D
201}
202; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
203; RUN: opt < %s -instcombine -S | FileCheck %s
204
205target triple = "x86_64-unknown-linux-gnu"
206
207define i32 @select_or_icmp(i32 %x, i32 %y, i32 %z) {
208; CHECK-LABEL: @select_or_icmp(
209; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
210; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
211; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
212; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
213; CHECK-NEXT: ret i32 [[D]]
214;
215 %A = icmp ne i32 %x, %z
216 %B = icmp ne i32 %y, %z
217 %C = or i1 %A, %B
218 %D = select i1 %C, i32 %z, i32 %x
219 ret i32 %D
220}
221
222define <2 x i8> @select_or_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
223; CHECK-LABEL: @select_or_icmp_vec(
224; CHECK-NEXT: [[A:%.*]] = icmp ne <2 x i8> [[X:%.*]], [[Z:%.*]]
225; CHECK-NEXT: [[B:%.*]] = icmp ne <2 x i8> [[Y:%.*]], [[Z]]
226; CHECK-NEXT: [[C:%.*]] = or <2 x i1> [[A]], [[B]]
227; CHECK-NEXT: [[D:%.*]] = select <2 x i1> [[C]], <2 x i8> [[Z]], <2 x i8> [[X]]
228; CHECK-NEXT: ret <2 x i8> [[D]]
229;
230 %A = icmp ne <2 x i8> %x, %z
231 %B = icmp ne <2 x i8> %y, %z
232 %C = or <2 x i1> %A, %B
233 %D = select <2 x i1> %C, <2 x i8> %z, <2 x i8> %x
234 ret <2 x i8> %D
235}
236
237define i32 @select_or_icmp2(i32 %x, i32 %y, i32 %z) {
238; CHECK-LABEL: @select_or_icmp2(
239; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
240; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
241; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
242; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[Y]]
243; CHECK-NEXT: ret i32 [[D]]
244;
245 %A = icmp ne i32 %x, %z
246 %B = icmp ne i32 %y, %z
247 %C = or i1 %A, %B
248 %D = select i1 %C, i32 %z, i32 %y
249 ret i32 %D
250}
251
252define i32 @select_or_inv_icmp(i32 %x, i32 %y, i32 %z) {
253; CHECK-LABEL: @select_or_inv_icmp(
254; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
255; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
256; CHECK-NEXT: [[C:%.*]] = or i1 [[B]], [[A]]
257; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
258; CHECK-NEXT: ret i32 [[D]]
259;
260 %A = icmp ne i32 %x, %z
261 %B = icmp ne i32 %y, %z
262 %C = or i1 %B , %A
263 %D = select i1 %C, i32 %z, i32 %x
264 ret i32 %D
265}
266
267define i32 @select_or_icmp_inv(i32 %x, i32 %y, i32 %z) {
268; CHECK-LABEL: @select_or_icmp_inv(
269; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[Z:%.*]], [[X:%.*]]
270; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Z]], [[Y:%.*]]
271; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
272; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
273; CHECK-NEXT: ret i32 [[D]]
274;
275 %A = icmp ne i32 %z, %x
276 %B = icmp ne i32 %z, %y
277 %C = or i1 %A, %B
278 %D = select i1 %C, i32 %z, i32 %x
279 ret i32 %D
280}
281
282; Negative tests
283define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
284; CHECK-LABEL: @select_and_icmp_pred_bad_1(
285; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
286; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
287; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
288; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
289; CHECK-NEXT: ret i32 [[D]]
290;
291 %A = icmp eq i32 %x, %z
292 %B = icmp ne i32 %y, %z
293 %C = or i1 %A, %B
294 %D = select i1 %C, i32 %z, i32 %x
295 ret i32 %D
296}
297
298define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
299; CHECK-LABEL: @select_and_icmp_pred_bad_2(
300; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
301; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
302; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
303; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
304; CHECK-NEXT: ret i32 [[D]]
305;
306 %A = icmp ne i32 %x, %z
307 %B = icmp eq i32 %y, %z
308 %C = or i1 %A, %B
309 %D = select i1 %C, i32 %z, i32 %x
310 ret i32 %D
311}
312
313define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
314; CHECK-LABEL: @select_and_icmp_pred_bad_3(
315; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
316; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
317; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
318; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
319; CHECK-NEXT: ret i32 [[D]]
320;
321 %A = icmp eq i32 %x, %z
322 %B = icmp eq i32 %y, %z
323 %C = or i1 %A, %B
324 %D = select i1 %C, i32 %z, i32 %x
325 ret i32 %D
326}
327
328define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
329; CHECK-LABEL: @select_and_icmp_pred_bad_4(
330; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
331; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
332; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
333; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
334; CHECK-NEXT: ret i32 [[D]]
335;
336 %A = icmp ne i32 %x, %z
337 %B = icmp ne i32 %y, %z
338 %C = and i1 %A, %B
339 %D = select i1 %C, i32 %z, i32 %x
340 ret i32 %D
341}
342
343define i32 @select_or_icmp_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
344; CHECK-LABEL: @select_or_icmp_bad_true_val(
345; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
346; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
347; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
348; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[X]]
349; CHECK-NEXT: ret i32 [[D]]
350;
351 %A = icmp ne i32 %x, %z
352 %B = icmp ne i32 %y, %z
353 %C = or i1 %A, %B
354 %D = select i1 %C, i32 %k, i32 %x
355 ret i32 %D
356}
357
358define i32 @select_or_icmp_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
359; CHECK-LABEL: @select_or_icmp_bad_false_val(
360; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
361; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
362; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
363; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[K:%.*]]
364; CHECK-NEXT: ret i32 [[D]]
365;
366 %A = icmp ne i32 %x, %z
367 %B = icmp ne i32 %y, %z
368 %C = or i1 %A, %B
369 %D = select i1 %C, i32 %z, i32 %k
370 ret i32 %D
371}
372
373define i32 @select_or_icmp_bad_op(i32 %x, i32 %y, i32 %z, i32 %k) {
374; CHECK-LABEL: @select_or_icmp_bad_op(
375; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[K:%.*]], [[Z:%.*]]
376; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
377; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
378; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X:%.*]]
379; CHECK-NEXT: ret i32 [[D]]
380;
381 %A = icmp ne i32 %k, %z
382 %B = icmp ne i32 %y, %z
383 %C = or i1 %A, %B
384 %D = select i1 %C, i32 %z, i32 %x
385 ret i32 %D
386}
387
388
389define i32 @select_or_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {
390; CHECK-LABEL: @select_or_icmp_bad_op_2(
391; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]]
392; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z:%.*]]
393; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
394; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
395; CHECK-NEXT: ret i32 [[D]]
396;
397 %A = icmp ne i32 %x, %k
398 %B = icmp ne i32 %y, %z
399 %C = or i1 %A, %B
400 %D = select i1 %C, i32 %z, i32 %x
401 ret i32 %D
402}