1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
4 ; TODO: All of these should be optimized to less than or equal to a single
5 ; instruction of select/and/or.
7 ; --- (A op B) op' A / (B op A) op' A ---
10 define i1 @land_land_left1(i1 %A, i1 %B) {
11 ; CHECK-LABEL: @land_land_left1(
12 ; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
13 ; CHECK-NEXT: ret i1 [[C]]
15 %c = select i1 %A, i1 %B, i1 false
16 %res = select i1 %c, i1 %A, i1 false
19 define i1 @land_land_left2(i1 %A, i1 %B) {
20 ; CHECK-LABEL: @land_land_left2(
21 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
22 ; CHECK-NEXT: ret i1 [[RES]]
24 %c = select i1 %B, i1 %A, i1 false
25 %res = select i1 %c, i1 %A, i1 false
30 define i1 @land_band_left1(i1 %A, i1 %B) {
31 ; CHECK-LABEL: @land_band_left1(
32 ; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
33 ; CHECK-NEXT: ret i1 [[C]]
35 %c = select i1 %A, i1 %B, i1 false
39 define i1 @land_band_left2(i1 %A, i1 %B) {
40 ; CHECK-LABEL: @land_band_left2(
41 ; CHECK-NEXT: [[C:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
42 ; CHECK-NEXT: ret i1 [[C]]
44 %c = select i1 %B, i1 %A, i1 false
50 define i1 @land_lor_left1(i1 %A, i1 %B) {
51 ; CHECK-LABEL: @land_lor_left1(
52 ; CHECK-NEXT: ret i1 [[A:%.*]]
54 %c = select i1 %A, i1 %B, i1 false
55 %res = select i1 %c, i1 true, i1 %A
58 define i1 @land_lor_left2(i1 %A, i1 %B) {
59 ; CHECK-LABEL: @land_lor_left2(
60 ; CHECK-NEXT: [[C:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
61 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[C]], i1 true, i1 [[A]]
62 ; CHECK-NEXT: ret i1 [[RES]]
64 %c = select i1 %B, i1 %A, i1 false
65 %res = select i1 %c, i1 true, i1 %A
70 define i1 @land_bor_left1(i1 %A, i1 %B) {
71 ; CHECK-LABEL: @land_bor_left1(
72 ; CHECK-NEXT: ret i1 [[A:%.*]]
74 %c = select i1 %A, i1 %B, i1 false
78 define i1 @land_bor_left2(i1 %A, i1 %B) {
79 ; CHECK-LABEL: @land_bor_left2(
80 ; CHECK-NEXT: ret i1 [[A:%.*]]
82 %c = select i1 %B, i1 %A, i1 false
88 define i1 @band_land_left1(i1 %A, i1 %B) {
89 ; CHECK-LABEL: @band_land_left1(
90 ; CHECK-NEXT: [[C:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
91 ; CHECK-NEXT: ret i1 [[C]]
94 %res = select i1 %c, i1 %A, i1 false
97 define i1 @band_land_left2(i1 %A, i1 %B) {
98 ; CHECK-LABEL: @band_land_left2(
99 ; CHECK-NEXT: [[C:%.*]] = and i1 [[B:%.*]], [[A:%.*]]
100 ; CHECK-NEXT: ret i1 [[C]]
103 %res = select i1 %c, i1 %A, i1 false
108 define i1 @band_lor_left1(i1 %A, i1 %B) {
109 ; CHECK-LABEL: @band_lor_left1(
110 ; CHECK-NEXT: ret i1 [[A:%.*]]
113 %res = select i1 %c, i1 true, i1 %A
116 define i1 @band_lor_left2(i1 %A, i1 %B) {
117 ; CHECK-LABEL: @band_lor_left2(
118 ; CHECK-NEXT: ret i1 [[A:%.*]]
121 %res = select i1 %c, i1 true, i1 %A
126 define i1 @lor_land_left1(i1 %A, i1 %B) {
127 ; CHECK-LABEL: @lor_land_left1(
128 ; CHECK-NEXT: ret i1 [[A:%.*]]
130 %c = select i1 %A, i1 true, i1 %B
131 %res = select i1 %c, i1 %A, i1 false
134 define i1 @lor_land_left2(i1 %A, i1 %B) {
135 ; CHECK-LABEL: @lor_land_left2(
136 ; CHECK-NEXT: [[C:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
137 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[C]], i1 [[A]], i1 false
138 ; CHECK-NEXT: ret i1 [[RES]]
140 %c = select i1 %B, i1 true, i1 %A
141 %res = select i1 %c, i1 %A, i1 false
146 define i1 @lor_band_left1(i1 %A, i1 %B) {
147 ; CHECK-LABEL: @lor_band_left1(
148 ; CHECK-NEXT: ret i1 [[A:%.*]]
150 %c = select i1 %A, i1 true, i1 %B
154 define i1 @lor_band_left2(i1 %A, i1 %B) {
155 ; CHECK-LABEL: @lor_band_left2(
156 ; CHECK-NEXT: ret i1 [[A:%.*]]
158 %c = select i1 %B, i1 true, i1 %A
164 define i1 @lor_lor_left1(i1 %A, i1 %B) {
165 ; CHECK-LABEL: @lor_lor_left1(
166 ; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
167 ; CHECK-NEXT: ret i1 [[C]]
169 %c = select i1 %A, i1 true, i1 %B
170 %res = select i1 %c, i1 true, i1 %A
173 define i1 @lor_lor_left2(i1 %A, i1 %B) {
174 ; CHECK-LABEL: @lor_lor_left2(
175 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
176 ; CHECK-NEXT: ret i1 [[RES]]
178 %c = select i1 %B, i1 true, i1 %A
179 %res = select i1 %c, i1 true, i1 %A
184 define i1 @lor_bor_left1(i1 %A, i1 %B) {
185 ; CHECK-LABEL: @lor_bor_left1(
186 ; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
187 ; CHECK-NEXT: ret i1 [[C]]
189 %c = select i1 %A, i1 true, i1 %B
193 define i1 @lor_bor_left2(i1 %A, i1 %B) {
194 ; CHECK-LABEL: @lor_bor_left2(
195 ; CHECK-NEXT: [[C:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
196 ; CHECK-NEXT: ret i1 [[C]]
198 %c = select i1 %B, i1 true, i1 %A
204 define i1 @bor_land_left1(i1 %A, i1 %B) {
205 ; CHECK-LABEL: @bor_land_left1(
206 ; CHECK-NEXT: ret i1 [[A:%.*]]
209 %res = select i1 %c, i1 %A, i1 false
212 define i1 @bor_land_left2(i1 %A, i1 %B) {
213 ; CHECK-LABEL: @bor_land_left2(
214 ; CHECK-NEXT: ret i1 [[A:%.*]]
217 %res = select i1 %c, i1 %A, i1 false
222 define i1 @bor_lor_left1(i1 %A, i1 %B) {
223 ; CHECK-LABEL: @bor_lor_left1(
224 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A:%.*]], [[B:%.*]]
225 ; CHECK-NEXT: ret i1 [[C]]
228 %res = select i1 %c, i1 true, i1 %A
231 define i1 @bor_lor_left2(i1 %A, i1 %B) {
232 ; CHECK-LABEL: @bor_lor_left2(
233 ; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], [[A:%.*]]
234 ; CHECK-NEXT: ret i1 [[C]]
237 %res = select i1 %c, i1 true, i1 %A
241 ; --- A op (A op' B) / A op (B op' A) ---
244 define i1 @land_land_right1(i1 %A, i1 %B) {
245 ; CHECK-LABEL: @land_land_right1(
246 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
247 ; CHECK-NEXT: ret i1 [[RES]]
249 %c = select i1 %A, i1 %B, i1 false
250 %res = select i1 %A, i1 %c, i1 false
253 define i1 @land_land_right2(i1 %A, i1 %B) {
254 ; CHECK-LABEL: @land_land_right2(
255 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
256 ; CHECK-NEXT: ret i1 [[RES]]
258 %c = select i1 %B, i1 %A, i1 false
259 %res = select i1 %A, i1 %c, i1 false
264 define i1 @land_band_right1(i1 %A, i1 %B) {
265 ; CHECK-LABEL: @land_band_right1(
266 ; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
267 ; CHECK-NEXT: ret i1 [[C]]
269 %c = select i1 %A, i1 %B, i1 false
273 define i1 @land_band_right2(i1 %A, i1 %B) {
274 ; CHECK-LABEL: @land_band_right2(
275 ; CHECK-NEXT: [[C:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
276 ; CHECK-NEXT: ret i1 [[C]]
278 %c = select i1 %B, i1 %A, i1 false
284 define i1 @land_lor_right1(i1 %A, i1 %B) {
285 ; CHECK-LABEL: @land_lor_right1(
286 ; CHECK-NEXT: ret i1 [[A:%.*]]
288 %c = select i1 %A, i1 %B, i1 false
289 %res = select i1 %A, i1 true, i1 %c
292 define i1 @land_lor_right2(i1 %A, i1 %B) {
293 ; CHECK-LABEL: @land_lor_right2(
294 ; CHECK-NEXT: ret i1 [[A:%.*]]
296 %c = select i1 %B, i1 %A, i1 false
297 %res = select i1 %A, i1 true, i1 %c
302 define i1 @land_bor_right1(i1 %A, i1 %B) {
303 ; CHECK-LABEL: @land_bor_right1(
304 ; CHECK-NEXT: ret i1 [[A:%.*]]
306 %c = select i1 %A, i1 %B, i1 false
310 define i1 @land_bor_right2(i1 %A, i1 %B) {
311 ; CHECK-LABEL: @land_bor_right2(
312 ; CHECK-NEXT: ret i1 [[A:%.*]]
314 %c = select i1 %B, i1 %A, i1 false
320 define i1 @band_land_right1(i1 %A, i1 %B) {
321 ; CHECK-LABEL: @band_land_right1(
322 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
323 ; CHECK-NEXT: ret i1 [[RES]]
326 %res = select i1 %A, i1 %c, i1 false
329 define i1 @band_land_right2(i1 %A, i1 %B) {
330 ; CHECK-LABEL: @band_land_right2(
331 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
332 ; CHECK-NEXT: ret i1 [[RES]]
335 %res = select i1 %A, i1 %c, i1 false
340 define i1 @band_lor_right1(i1 %A, i1 %B) {
341 ; CHECK-LABEL: @band_lor_right1(
342 ; CHECK-NEXT: ret i1 [[A:%.*]]
345 %res = select i1 %A, i1 true, i1 %c
348 define i1 @band_lor_right2(i1 %A, i1 %B) {
349 ; CHECK-LABEL: @band_lor_right2(
350 ; CHECK-NEXT: ret i1 [[A:%.*]]
353 %res = select i1 %A, i1 true, i1 %c
358 define i1 @lor_land_right1(i1 %A, i1 %B) {
359 ; CHECK-LABEL: @lor_land_right1(
360 ; CHECK-NEXT: ret i1 [[A:%.*]]
362 %c = select i1 %A, i1 true, i1 %B
363 %res = select i1 %A, i1 %c, i1 false
366 define i1 @lor_land_right2(i1 %A, i1 %B) {
367 ; CHECK-LABEL: @lor_land_right2(
368 ; CHECK-NEXT: ret i1 [[A:%.*]]
370 %c = select i1 %B, i1 true, i1 %A
371 %res = select i1 %A, i1 %c, i1 false
376 define i1 @lor_band_right1(i1 %A, i1 %B) {
377 ; CHECK-LABEL: @lor_band_right1(
378 ; CHECK-NEXT: ret i1 [[A:%.*]]
380 %c = select i1 %A, i1 true, i1 %B
384 define i1 @lor_band_right2(i1 %A, i1 %B) {
385 ; CHECK-LABEL: @lor_band_right2(
386 ; CHECK-NEXT: ret i1 [[A:%.*]]
388 %c = select i1 %B, i1 true, i1 %A
394 define i1 @lor_lor_right1(i1 %A, i1 %B) {
395 ; CHECK-LABEL: @lor_lor_right1(
396 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
397 ; CHECK-NEXT: ret i1 [[RES]]
399 %c = select i1 %A, i1 true, i1 %B
400 %res = select i1 %A, i1 true, i1 %c
403 define i1 @lor_lor_right2(i1 %A, i1 %B) {
404 ; CHECK-LABEL: @lor_lor_right2(
405 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
406 ; CHECK-NEXT: ret i1 [[RES]]
408 %c = select i1 %B, i1 true, i1 %A
409 %res = select i1 %A, i1 true, i1 %c
414 define i1 @lor_bor_right1(i1 %A, i1 %B) {
415 ; CHECK-LABEL: @lor_bor_right1(
416 ; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
417 ; CHECK-NEXT: ret i1 [[C]]
419 %c = select i1 %A, i1 true, i1 %B
423 define i1 @lor_bor_right2(i1 %A, i1 %B) {
424 ; CHECK-LABEL: @lor_bor_right2(
425 ; CHECK-NEXT: [[C:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
426 ; CHECK-NEXT: ret i1 [[C]]
428 %c = select i1 %B, i1 true, i1 %A
434 define i1 @bor_land_right1(i1 %A, i1 %B) {
435 ; CHECK-LABEL: @bor_land_right1(
436 ; CHECK-NEXT: ret i1 [[A:%.*]]
439 %res = select i1 %A, i1 %c, i1 false
442 define i1 @bor_land_right2(i1 %A, i1 %B) {
443 ; CHECK-LABEL: @bor_land_right2(
444 ; CHECK-NEXT: ret i1 [[A:%.*]]
447 %res = select i1 %A, i1 %c, i1 false
452 define i1 @bor_lor_right1(i1 %A, i1 %B) {
453 ; CHECK-LABEL: @bor_lor_right1(
454 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
455 ; CHECK-NEXT: ret i1 [[RES]]
458 %res = select i1 %A, i1 true, i1 %c
461 define i1 @bor_lor_right2(i1 %A, i1 %B) {
462 ; CHECK-LABEL: @bor_lor_right2(
463 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
464 ; CHECK-NEXT: ret i1 [[RES]]
467 %res = select i1 %A, i1 true, i1 %c
471 ; Value equivalence substitution does not account for vector
472 ; transforms, so it needs a scalar condition operand.
473 ; For example, this would miscompile if %a = {1, 0}.
475 define <2 x i1> @PR50500_trueval(<2 x i1> %a, <2 x i1> %b) {
476 ; CHECK-LABEL: @PR50500_trueval(
477 ; CHECK-NEXT: [[S:%.*]] = shufflevector <2 x i1> [[A:%.*]], <2 x i1> poison, <2 x i32> <i32 1, i32 0>
478 ; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[A]], <2 x i1> [[S]], <2 x i1> [[B:%.*]]
479 ; CHECK-NEXT: ret <2 x i1> [[R]]
481 %s = shufflevector <2 x i1> %a, <2 x i1> poison, <2 x i32> <i32 1, i32 0>
482 %r = select <2 x i1> %a, <2 x i1> %s, <2 x i1> %b
486 define <2 x i1> @PR50500_falseval(<2 x i1> %a, <2 x i1> %b) {
487 ; CHECK-LABEL: @PR50500_falseval(
488 ; CHECK-NEXT: [[S:%.*]] = shufflevector <2 x i1> [[A:%.*]], <2 x i1> poison, <2 x i32> <i32 1, i32 0>
489 ; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[A]], <2 x i1> [[B:%.*]], <2 x i1> [[S]]
490 ; CHECK-NEXT: ret <2 x i1> [[R]]
492 %s = shufflevector <2 x i1> %a, <2 x i1> poison, <2 x i32> <i32 1, i32 0>
493 %r = select <2 x i1> %a, <2 x i1> %b, <2 x i1> %s