blob: ea29bff7d1c466f9af4a3a91a6b869155ec2494e [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(
David Bolvansky16d8a692018-07-31 14:17:15 +000039; CHECK-NEXT: ret i32 [[X:%.*]]
David Bolvansky76e95862018-07-30 18:22:18 +000040;
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
48define i32 @select_or_icmp_alt2(i32 %x, i32 %y, i32 %z) {
49; CHECK-LABEL: @select_or_icmp_alt2(
David Bolvansky16d8a692018-07-31 14:17:15 +000050; CHECK-NEXT: ret i32 [[Y:%.*]]
David Bolvansky76e95862018-07-30 18:22:18 +000051;
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
59define i32 @select_or_icmp_inv_alt(i32 %x, i32 %y, i32 %z) {
60; CHECK-LABEL: @select_or_icmp_inv_alt(
David Bolvansky16d8a692018-07-31 14:17:15 +000061; CHECK-NEXT: ret i32 [[X:%.*]]
David Bolvansky76e95862018-07-30 18:22:18 +000062;
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
70define i32 @select_or_inv_icmp_alt(i32 %x, i32 %y, i32 %z) {
71; CHECK-LABEL: @select_or_inv_icmp_alt(
David Bolvansky16d8a692018-07-31 14:17:15 +000072; CHECK-NEXT: ret i32 [[X:%.*]]
David Bolvansky76e95862018-07-30 18:22:18 +000073;
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
81define <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(
David Bolvansky16d8a692018-07-31 14:17:15 +000083; CHECK-NEXT: ret <2 x i8> [[X:%.*]]
David Bolvansky76e95862018-07-30 18:22:18 +000084;
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
David Bolvansky1b826172018-07-27 20:18:12 +000092define i32 @select_or_inv_icmp(i32 %x, i32 %y, i32 %z) {
93; CHECK-LABEL: @select_or_inv_icmp(
David Bolvanskyf9476082018-07-28 06:55:51 +000094; CHECK-NEXT: ret i32 [[Z:%.*]]
David Bolvansky1b826172018-07-27 20:18:12 +000095;
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
103define i32 @select_or_icmp_inv(i32 %x, i32 %y, i32 %z) {
104; CHECK-LABEL: @select_or_icmp_inv(
David Bolvanskyf9476082018-07-28 06:55:51 +0000105; CHECK-NEXT: ret i32 [[Z:%.*]]
David Bolvansky1b826172018-07-27 20:18:12 +0000106;
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
115define 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
130define 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
145define 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
160define 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
175define 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
190define 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
205define 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
221define 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}
David Bolvansky76e95862018-07-30 18:22:18 +0000235
236define 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
251define 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
266define 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
281define 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
296define 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
311define 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
326define 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}