[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / PowerPC / select_const.ll
blob606cfe22887802e73aa106199860e369647477db
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs -mattr=+isel | FileCheck %s --check-prefix=ALL --check-prefix=ISEL
3 ; RUN: llc < %s -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs -mattr=-isel | FileCheck %s --check-prefix=ALL --check-prefix=NO_ISEL
5 ; Select of constants: control flow / conditional moves can always be replaced by logic+math (but may not be worth it?).
6 ; Test the zeroext/signext variants of each pattern to see if that makes a difference.
8 ; select Cond, 0, 1 --> zext (!Cond)
10 define i32 @select_0_or_1(i1 %cond) {
11 ; ALL-LABEL: select_0_or_1:
12 ; ALL:       # %bb.0:
13 ; ALL-NEXT:    not 3, 3
14 ; ALL-NEXT:    clrldi 3, 3, 63
15 ; ALL-NEXT:    blr
16   %sel = select i1 %cond, i32 0, i32 1
17   ret i32 %sel
20 define i32 @select_0_or_1_zeroext(i1 zeroext %cond) {
21 ; ALL-LABEL: select_0_or_1_zeroext:
22 ; ALL:       # %bb.0:
23 ; ALL-NEXT:    xori 3, 3, 1
24 ; ALL-NEXT:    blr
25   %sel = select i1 %cond, i32 0, i32 1
26   ret i32 %sel
29 define i32 @select_0_or_1_signext(i1 signext %cond) {
30 ; ALL-LABEL: select_0_or_1_signext:
31 ; ALL:       # %bb.0:
32 ; ALL-NEXT:    not 3, 3
33 ; ALL-NEXT:    clrldi 3, 3, 63
34 ; ALL-NEXT:    blr
35   %sel = select i1 %cond, i32 0, i32 1
36   ret i32 %sel
39 ; select Cond, 1, 0 --> zext (Cond)
41 define i32 @select_1_or_0(i1 %cond) {
42 ; ALL-LABEL: select_1_or_0:
43 ; ALL:       # %bb.0:
44 ; ALL-NEXT:    clrldi 3, 3, 63
45 ; ALL-NEXT:    blr
46   %sel = select i1 %cond, i32 1, i32 0
47   ret i32 %sel
50 define i32 @select_1_or_0_zeroext(i1 zeroext %cond) {
51 ; ALL-LABEL: select_1_or_0_zeroext:
52 ; ALL:       # %bb.0:
53 ; ALL-NEXT:    blr
54   %sel = select i1 %cond, i32 1, i32 0
55   ret i32 %sel
58 define i32 @select_1_or_0_signext(i1 signext %cond) {
59 ; ALL-LABEL: select_1_or_0_signext:
60 ; ALL:       # %bb.0:
61 ; ALL-NEXT:    clrldi 3, 3, 63
62 ; ALL-NEXT:    blr
63   %sel = select i1 %cond, i32 1, i32 0
64   ret i32 %sel
67 ; select Cond, 0, -1 --> sext (!Cond)
69 define i32 @select_0_or_neg1(i1 %cond) {
70 ; ALL-LABEL: select_0_or_neg1:
71 ; ALL:       # %bb.0:
72 ; ALL-NEXT:    clrldi 3, 3, 63
73 ; ALL-NEXT:    addi 3, 3, -1
74 ; ALL-NEXT:    blr
75   %sel = select i1 %cond, i32 0, i32 -1
76   ret i32 %sel
79 define i32 @select_0_or_neg1_zeroext(i1 zeroext %cond) {
80 ; ALL-LABEL: select_0_or_neg1_zeroext:
81 ; ALL:       # %bb.0:
82 ; ALL-NEXT:    addi 3, 3, -1
83 ; ALL-NEXT:    blr
84   %sel = select i1 %cond, i32 0, i32 -1
85   ret i32 %sel
88 define i32 @select_0_or_neg1_signext(i1 signext %cond) {
89 ; ALL-LABEL: select_0_or_neg1_signext:
90 ; ALL:       # %bb.0:
91 ; ALL-NEXT:    not 3, 3
92 ; ALL-NEXT:    blr
93   %sel = select i1 %cond, i32 0, i32 -1
94   ret i32 %sel
97 ; select Cond, -1, 0 --> sext (Cond)
99 define i32 @select_neg1_or_0(i1 %cond) {
100 ; ALL-LABEL: select_neg1_or_0:
101 ; ALL:       # %bb.0:
102 ; ALL-NEXT:    clrldi 3, 3, 63
103 ; ALL-NEXT:    neg 3, 3
104 ; ALL-NEXT:    blr
105   %sel = select i1 %cond, i32 -1, i32 0
106   ret i32 %sel
109 define i32 @select_neg1_or_0_zeroext(i1 zeroext %cond) {
110 ; ALL-LABEL: select_neg1_or_0_zeroext:
111 ; ALL:       # %bb.0:
112 ; ALL-NEXT:    neg 3, 3
113 ; ALL-NEXT:    blr
114   %sel = select i1 %cond, i32 -1, i32 0
115   ret i32 %sel
118 define i32 @select_neg1_or_0_signext(i1 signext %cond) {
119 ; ALL-LABEL: select_neg1_or_0_signext:
120 ; ALL:       # %bb.0:
121 ; ALL-NEXT:    blr
122   %sel = select i1 %cond, i32 -1, i32 0
123   ret i32 %sel
126 ; select Cond, C+1, C --> add (zext Cond), C
128 define i32 @select_Cplus1_C(i1 %cond) {
129 ; ALL-LABEL: select_Cplus1_C:
130 ; ALL:       # %bb.0:
131 ; ALL-NEXT:    clrldi 3, 3, 63
132 ; ALL-NEXT:    addi 3, 3, 41
133 ; ALL-NEXT:    blr
134   %sel = select i1 %cond, i32 42, i32 41
135   ret i32 %sel
138 define i32 @select_Cplus1_C_zeroext(i1 zeroext %cond) {
139 ; ALL-LABEL: select_Cplus1_C_zeroext:
140 ; ALL:       # %bb.0:
141 ; ALL-NEXT:    addi 3, 3, 41
142 ; ALL-NEXT:    blr
143   %sel = select i1 %cond, i32 42, i32 41
144   ret i32 %sel
147 define i32 @select_Cplus1_C_signext(i1 signext %cond) {
148 ; ALL-LABEL: select_Cplus1_C_signext:
149 ; ALL:       # %bb.0:
150 ; ALL-NEXT:    subfic 3, 3, 41
151 ; ALL-NEXT:    blr
152   %sel = select i1 %cond, i32 42, i32 41
153   ret i32 %sel
156 ; select Cond, C, C+1 --> add (sext Cond), C
158 define i32 @select_C_Cplus1(i1 %cond) {
159 ; ALL-LABEL: select_C_Cplus1:
160 ; ALL:       # %bb.0:
161 ; ALL-NEXT:    clrldi 3, 3, 63
162 ; ALL-NEXT:    subfic 3, 3, 42
163 ; ALL-NEXT:    blr
164   %sel = select i1 %cond, i32 41, i32 42
165   ret i32 %sel
168 define i32 @select_C_Cplus1_zeroext(i1 zeroext %cond) {
169 ; ALL-LABEL: select_C_Cplus1_zeroext:
170 ; ALL:       # %bb.0:
171 ; ALL-NEXT:    subfic 3, 3, 42
172 ; ALL-NEXT:    blr
173   %sel = select i1 %cond, i32 41, i32 42
174   ret i32 %sel
177 define i32 @select_C_Cplus1_signext(i1 signext %cond) {
178 ; ALL-LABEL: select_C_Cplus1_signext:
179 ; ALL:       # %bb.0:
180 ; ALL-NEXT:    addi 3, 3, 42
181 ; ALL-NEXT:    blr
182   %sel = select i1 %cond, i32 41, i32 42
183   ret i32 %sel
186 ; In general, select of 2 constants could be:
187 ; select Cond, C1, C2 --> add (mul (zext Cond), C1-C2), C2 --> add (and (sext Cond), C1-C2), C2
189 define i32 @select_C1_C2(i1 %cond) {
190 ; ISEL-LABEL: select_C1_C2:
191 ; ISEL:       # %bb.0:
192 ; ISEL-NEXT:    andi. 3, 3, 1
193 ; ISEL-NEXT:    li 3, 42
194 ; ISEL-NEXT:    li 4, 421
195 ; ISEL-NEXT:    iselgt 3, 4, 3
196 ; ISEL-NEXT:    blr
198 ; NO_ISEL-LABEL: select_C1_C2:
199 ; NO_ISEL:       # %bb.0:
200 ; NO_ISEL-NEXT:    andi. 3, 3, 1
201 ; NO_ISEL-NEXT:    li 3, 42
202 ; NO_ISEL-NEXT:    li 4, 421
203 ; NO_ISEL-NEXT:    bc 12, 1, .LBB18_1
204 ; NO_ISEL-NEXT:    blr
205 ; NO_ISEL-NEXT:  .LBB18_1:
206 ; NO_ISEL-NEXT:    addi 3, 4, 0
207 ; NO_ISEL-NEXT:    blr
208   %sel = select i1 %cond, i32 421, i32 42
209   ret i32 %sel
212 define i32 @select_C1_C2_zeroext(i1 zeroext %cond) {
213 ; ISEL-LABEL: select_C1_C2_zeroext:
214 ; ISEL:       # %bb.0:
215 ; ISEL-NEXT:    andi. 3, 3, 1
216 ; ISEL-NEXT:    li 3, 42
217 ; ISEL-NEXT:    li 4, 421
218 ; ISEL-NEXT:    iselgt 3, 4, 3
219 ; ISEL-NEXT:    blr
221 ; NO_ISEL-LABEL: select_C1_C2_zeroext:
222 ; NO_ISEL:       # %bb.0:
223 ; NO_ISEL-NEXT:    andi. 3, 3, 1
224 ; NO_ISEL-NEXT:    li 3, 42
225 ; NO_ISEL-NEXT:    li 4, 421
226 ; NO_ISEL-NEXT:    bc 12, 1, .LBB19_1
227 ; NO_ISEL-NEXT:    blr
228 ; NO_ISEL-NEXT:  .LBB19_1:
229 ; NO_ISEL-NEXT:    addi 3, 4, 0
230 ; NO_ISEL-NEXT:    blr
231   %sel = select i1 %cond, i32 421, i32 42
232   ret i32 %sel
235 define i32 @select_C1_C2_signext(i1 signext %cond) {
236 ; ISEL-LABEL: select_C1_C2_signext:
237 ; ISEL:       # %bb.0:
238 ; ISEL-NEXT:    andi. 3, 3, 1
239 ; ISEL-NEXT:    li 3, 42
240 ; ISEL-NEXT:    li 4, 421
241 ; ISEL-NEXT:    iselgt 3, 4, 3
242 ; ISEL-NEXT:    blr
244 ; NO_ISEL-LABEL: select_C1_C2_signext:
245 ; NO_ISEL:       # %bb.0:
246 ; NO_ISEL-NEXT:    andi. 3, 3, 1
247 ; NO_ISEL-NEXT:    li 3, 42
248 ; NO_ISEL-NEXT:    li 4, 421
249 ; NO_ISEL-NEXT:    bc 12, 1, .LBB20_1
250 ; NO_ISEL-NEXT:    blr
251 ; NO_ISEL-NEXT:  .LBB20_1:
252 ; NO_ISEL-NEXT:    addi 3, 4, 0
253 ; NO_ISEL-NEXT:    blr
254   %sel = select i1 %cond, i32 421, i32 42
255   ret i32 %sel
258 ; A binary operator with constant after the select should always get folded into the select.
260 define i8 @sel_constants_add_constant(i1 %cond) {
261 ; ISEL-LABEL: sel_constants_add_constant:
262 ; ISEL:       # %bb.0:
263 ; ISEL-NEXT:    andi. 3, 3, 1
264 ; ISEL-NEXT:    li 3, 28
265 ; ISEL-NEXT:    li 4, 1
266 ; ISEL-NEXT:    iselgt 3, 4, 3
267 ; ISEL-NEXT:    blr
269 ; NO_ISEL-LABEL: sel_constants_add_constant:
270 ; NO_ISEL:       # %bb.0:
271 ; NO_ISEL-NEXT:    andi. 3, 3, 1
272 ; NO_ISEL-NEXT:    li 3, 28
273 ; NO_ISEL-NEXT:    li 4, 1
274 ; NO_ISEL-NEXT:    bc 12, 1, .LBB21_1
275 ; NO_ISEL-NEXT:    blr
276 ; NO_ISEL-NEXT:  .LBB21_1:
277 ; NO_ISEL-NEXT:    addi 3, 4, 0
278 ; NO_ISEL-NEXT:    blr
279   %sel = select i1 %cond, i8 -4, i8 23
280   %bo = add i8 %sel, 5
281   ret i8 %bo
284 define i8 @sel_constants_sub_constant(i1 %cond) {
285 ; ISEL-LABEL: sel_constants_sub_constant:
286 ; ISEL:       # %bb.0:
287 ; ISEL-NEXT:    andi. 3, 3, 1
288 ; ISEL-NEXT:    li 3, 18
289 ; ISEL-NEXT:    li 4, -9
290 ; ISEL-NEXT:    iselgt 3, 4, 3
291 ; ISEL-NEXT:    blr
293 ; NO_ISEL-LABEL: sel_constants_sub_constant:
294 ; NO_ISEL:       # %bb.0:
295 ; NO_ISEL-NEXT:    andi. 3, 3, 1
296 ; NO_ISEL-NEXT:    li 3, 18
297 ; NO_ISEL-NEXT:    li 4, -9
298 ; NO_ISEL-NEXT:    bc 12, 1, .LBB22_1
299 ; NO_ISEL-NEXT:    blr
300 ; NO_ISEL-NEXT:  .LBB22_1:
301 ; NO_ISEL-NEXT:    addi 3, 4, 0
302 ; NO_ISEL-NEXT:    blr
303   %sel = select i1 %cond, i8 -4, i8 23
304   %bo = sub i8 %sel, 5
305   ret i8 %bo
308 define i8 @sel_constants_sub_constant_sel_constants(i1 %cond) {
309 ; ISEL-LABEL: sel_constants_sub_constant_sel_constants:
310 ; ISEL:       # %bb.0:
311 ; ISEL-NEXT:    andi. 3, 3, 1
312 ; ISEL-NEXT:    li 3, 2
313 ; ISEL-NEXT:    li 4, 9
314 ; ISEL-NEXT:    iselgt 3, 4, 3
315 ; ISEL-NEXT:    blr
317 ; NO_ISEL-LABEL: sel_constants_sub_constant_sel_constants:
318 ; NO_ISEL:       # %bb.0:
319 ; NO_ISEL-NEXT:    andi. 3, 3, 1
320 ; NO_ISEL-NEXT:    li 3, 2
321 ; NO_ISEL-NEXT:    li 4, 9
322 ; NO_ISEL-NEXT:    bc 12, 1, .LBB23_1
323 ; NO_ISEL-NEXT:    blr
324 ; NO_ISEL-NEXT:  .LBB23_1:
325 ; NO_ISEL-NEXT:    addi 3, 4, 0
326 ; NO_ISEL-NEXT:    blr
327   %sel = select i1 %cond, i8 -4, i8 3
328   %bo = sub i8 5, %sel
329   ret i8 %bo
332 define i8 @sel_constants_mul_constant(i1 %cond) {
333 ; ISEL-LABEL: sel_constants_mul_constant:
334 ; ISEL:       # %bb.0:
335 ; ISEL-NEXT:    andi. 3, 3, 1
336 ; ISEL-NEXT:    li 3, 115
337 ; ISEL-NEXT:    li 4, -20
338 ; ISEL-NEXT:    iselgt 3, 4, 3
339 ; ISEL-NEXT:    blr
341 ; NO_ISEL-LABEL: sel_constants_mul_constant:
342 ; NO_ISEL:       # %bb.0:
343 ; NO_ISEL-NEXT:    andi. 3, 3, 1
344 ; NO_ISEL-NEXT:    li 3, 115
345 ; NO_ISEL-NEXT:    li 4, -20
346 ; NO_ISEL-NEXT:    bc 12, 1, .LBB24_1
347 ; NO_ISEL-NEXT:    blr
348 ; NO_ISEL-NEXT:  .LBB24_1:
349 ; NO_ISEL-NEXT:    addi 3, 4, 0
350 ; NO_ISEL-NEXT:    blr
351   %sel = select i1 %cond, i8 -4, i8 23
352   %bo = mul i8 %sel, 5
353   ret i8 %bo
356 define i8 @sel_constants_sdiv_constant(i1 %cond) {
357 ; ISEL-LABEL: sel_constants_sdiv_constant:
358 ; ISEL:       # %bb.0:
359 ; ISEL-NEXT:    andi. 3, 3, 1
360 ; ISEL-NEXT:    li 3, 4
361 ; ISEL-NEXT:    iselgt 3, 0, 3
362 ; ISEL-NEXT:    blr
364 ; NO_ISEL-LABEL: sel_constants_sdiv_constant:
365 ; NO_ISEL:       # %bb.0:
366 ; NO_ISEL-NEXT:    andi. 3, 3, 1
367 ; NO_ISEL-NEXT:    li 3, 4
368 ; NO_ISEL-NEXT:    bc 12, 1, .LBB25_1
369 ; NO_ISEL-NEXT:    blr
370 ; NO_ISEL-NEXT:  .LBB25_1:
371 ; NO_ISEL-NEXT:    li 3, 0
372 ; NO_ISEL-NEXT:    blr
373   %sel = select i1 %cond, i8 -4, i8 23
374   %bo = sdiv i8 %sel, 5
375   ret i8 %bo
378 define i8 @sdiv_constant_sel_constants(i1 %cond) {
379 ; ISEL-LABEL: sdiv_constant_sel_constants:
380 ; ISEL:       # %bb.0:
381 ; ISEL-NEXT:    andi. 3, 3, 1
382 ; ISEL-NEXT:    li 3, 5
383 ; ISEL-NEXT:    iselgt 3, 0, 3
384 ; ISEL-NEXT:    blr
386 ; NO_ISEL-LABEL: sdiv_constant_sel_constants:
387 ; NO_ISEL:       # %bb.0:
388 ; NO_ISEL-NEXT:    andi. 3, 3, 1
389 ; NO_ISEL-NEXT:    li 3, 5
390 ; NO_ISEL-NEXT:    bc 12, 1, .LBB26_1
391 ; NO_ISEL-NEXT:    blr
392 ; NO_ISEL-NEXT:  .LBB26_1:
393 ; NO_ISEL-NEXT:    li 3, 0
394 ; NO_ISEL-NEXT:    blr
395   %sel = select i1 %cond, i8 121, i8 23
396   %bo = sdiv i8 120, %sel
397   ret i8 %bo
400 define i8 @sel_constants_udiv_constant(i1 %cond) {
401 ; ISEL-LABEL: sel_constants_udiv_constant:
402 ; ISEL:       # %bb.0:
403 ; ISEL-NEXT:    andi. 3, 3, 1
404 ; ISEL-NEXT:    li 3, 4
405 ; ISEL-NEXT:    li 4, 50
406 ; ISEL-NEXT:    iselgt 3, 4, 3
407 ; ISEL-NEXT:    blr
409 ; NO_ISEL-LABEL: sel_constants_udiv_constant:
410 ; NO_ISEL:       # %bb.0:
411 ; NO_ISEL-NEXT:    andi. 3, 3, 1
412 ; NO_ISEL-NEXT:    li 3, 4
413 ; NO_ISEL-NEXT:    li 4, 50
414 ; NO_ISEL-NEXT:    bc 12, 1, .LBB27_1
415 ; NO_ISEL-NEXT:    blr
416 ; NO_ISEL-NEXT:  .LBB27_1:
417 ; NO_ISEL-NEXT:    addi 3, 4, 0
418 ; NO_ISEL-NEXT:    blr
419   %sel = select i1 %cond, i8 -4, i8 23
420   %bo = udiv i8 %sel, 5
421   ret i8 %bo
424 define i8 @udiv_constant_sel_constants(i1 %cond) {
425 ; ISEL-LABEL: udiv_constant_sel_constants:
426 ; ISEL:       # %bb.0:
427 ; ISEL-NEXT:    andi. 3, 3, 1
428 ; ISEL-NEXT:    li 3, 5
429 ; ISEL-NEXT:    iselgt 3, 0, 3
430 ; ISEL-NEXT:    blr
432 ; NO_ISEL-LABEL: udiv_constant_sel_constants:
433 ; NO_ISEL:       # %bb.0:
434 ; NO_ISEL-NEXT:    andi. 3, 3, 1
435 ; NO_ISEL-NEXT:    li 3, 5
436 ; NO_ISEL-NEXT:    bc 12, 1, .LBB28_1
437 ; NO_ISEL-NEXT:    blr
438 ; NO_ISEL-NEXT:  .LBB28_1:
439 ; NO_ISEL-NEXT:    li 3, 0
440 ; NO_ISEL-NEXT:    blr
441   %sel = select i1 %cond, i8 -4, i8 23
442   %bo = udiv i8 120, %sel
443   ret i8 %bo
446 define i8 @sel_constants_srem_constant(i1 %cond) {
447 ; ISEL-LABEL: sel_constants_srem_constant:
448 ; ISEL:       # %bb.0:
449 ; ISEL-NEXT:    andi. 3, 3, 1
450 ; ISEL-NEXT:    li 3, 3
451 ; ISEL-NEXT:    li 4, -4
452 ; ISEL-NEXT:    iselgt 3, 4, 3
453 ; ISEL-NEXT:    blr
455 ; NO_ISEL-LABEL: sel_constants_srem_constant:
456 ; NO_ISEL:       # %bb.0:
457 ; NO_ISEL-NEXT:    andi. 3, 3, 1
458 ; NO_ISEL-NEXT:    li 3, 3
459 ; NO_ISEL-NEXT:    li 4, -4
460 ; NO_ISEL-NEXT:    bc 12, 1, .LBB29_1
461 ; NO_ISEL-NEXT:    blr
462 ; NO_ISEL-NEXT:  .LBB29_1:
463 ; NO_ISEL-NEXT:    addi 3, 4, 0
464 ; NO_ISEL-NEXT:    blr
465   %sel = select i1 %cond, i8 -4, i8 23
466   %bo = srem i8 %sel, 5
467   ret i8 %bo
470 define i8 @srem_constant_sel_constants(i1 %cond) {
471 ; ISEL-LABEL: srem_constant_sel_constants:
472 ; ISEL:       # %bb.0:
473 ; ISEL-NEXT:    andi. 3, 3, 1
474 ; ISEL-NEXT:    li 3, 5
475 ; ISEL-NEXT:    li 4, 120
476 ; ISEL-NEXT:    iselgt 3, 4, 3
477 ; ISEL-NEXT:    blr
479 ; NO_ISEL-LABEL: srem_constant_sel_constants:
480 ; NO_ISEL:       # %bb.0:
481 ; NO_ISEL-NEXT:    andi. 3, 3, 1
482 ; NO_ISEL-NEXT:    li 3, 5
483 ; NO_ISEL-NEXT:    li 4, 120
484 ; NO_ISEL-NEXT:    bc 12, 1, .LBB30_1
485 ; NO_ISEL-NEXT:    blr
486 ; NO_ISEL-NEXT:  .LBB30_1:
487 ; NO_ISEL-NEXT:    addi 3, 4, 0
488 ; NO_ISEL-NEXT:    blr
489   %sel = select i1 %cond, i8 121, i8 23
490   %bo = srem i8 120, %sel
491   ret i8 %bo
494 define i8 @sel_constants_urem_constant(i1 %cond) {
495 ; ALL-LABEL: sel_constants_urem_constant:
496 ; ALL:       # %bb.0:
497 ; ALL-NEXT:    clrldi 3, 3, 63
498 ; ALL-NEXT:    xori 3, 3, 3
499 ; ALL-NEXT:    blr
500   %sel = select i1 %cond, i8 -4, i8 23
501   %bo = urem i8 %sel, 5
502   ret i8 %bo
505 define i8 @urem_constant_sel_constants(i1 %cond) {
506 ; ISEL-LABEL: urem_constant_sel_constants:
507 ; ISEL:       # %bb.0:
508 ; ISEL-NEXT:    andi. 3, 3, 1
509 ; ISEL-NEXT:    li 3, 5
510 ; ISEL-NEXT:    li 4, 120
511 ; ISEL-NEXT:    iselgt 3, 4, 3
512 ; ISEL-NEXT:    blr
514 ; NO_ISEL-LABEL: urem_constant_sel_constants:
515 ; NO_ISEL:       # %bb.0:
516 ; NO_ISEL-NEXT:    andi. 3, 3, 1
517 ; NO_ISEL-NEXT:    li 3, 5
518 ; NO_ISEL-NEXT:    li 4, 120
519 ; NO_ISEL-NEXT:    bc 12, 1, .LBB32_1
520 ; NO_ISEL-NEXT:    blr
521 ; NO_ISEL-NEXT:  .LBB32_1:
522 ; NO_ISEL-NEXT:    addi 3, 4, 0
523 ; NO_ISEL-NEXT:    blr
524   %sel = select i1 %cond, i8 -4, i8 23
525   %bo = urem i8 120, %sel
526   ret i8 %bo
529 define i8 @sel_constants_and_constant(i1 %cond) {
530 ; ALL-LABEL: sel_constants_and_constant:
531 ; ALL:       # %bb.0:
532 ; ALL-NEXT:    clrldi 3, 3, 63
533 ; ALL-NEXT:    xori 3, 3, 5
534 ; ALL-NEXT:    blr
535   %sel = select i1 %cond, i8 -4, i8 23
536   %bo = and i8 %sel, 5
537   ret i8 %bo
540 define i8 @sel_constants_or_constant(i1 %cond) {
541 ; ISEL-LABEL: sel_constants_or_constant:
542 ; ISEL:       # %bb.0:
543 ; ISEL-NEXT:    andi. 3, 3, 1
544 ; ISEL-NEXT:    li 3, 23
545 ; ISEL-NEXT:    li 4, -3
546 ; ISEL-NEXT:    iselgt 3, 4, 3
547 ; ISEL-NEXT:    blr
549 ; NO_ISEL-LABEL: sel_constants_or_constant:
550 ; NO_ISEL:       # %bb.0:
551 ; NO_ISEL-NEXT:    andi. 3, 3, 1
552 ; NO_ISEL-NEXT:    li 3, 23
553 ; NO_ISEL-NEXT:    li 4, -3
554 ; NO_ISEL-NEXT:    bc 12, 1, .LBB34_1
555 ; NO_ISEL-NEXT:    blr
556 ; NO_ISEL-NEXT:  .LBB34_1:
557 ; NO_ISEL-NEXT:    addi 3, 4, 0
558 ; NO_ISEL-NEXT:    blr
559   %sel = select i1 %cond, i8 -4, i8 23
560   %bo = or i8 %sel, 5
561   ret i8 %bo
564 define i8 @sel_constants_xor_constant(i1 %cond) {
565 ; ISEL-LABEL: sel_constants_xor_constant:
566 ; ISEL:       # %bb.0:
567 ; ISEL-NEXT:    andi. 3, 3, 1
568 ; ISEL-NEXT:    li 3, 18
569 ; ISEL-NEXT:    li 4, -7
570 ; ISEL-NEXT:    iselgt 3, 4, 3
571 ; ISEL-NEXT:    blr
573 ; NO_ISEL-LABEL: sel_constants_xor_constant:
574 ; NO_ISEL:       # %bb.0:
575 ; NO_ISEL-NEXT:    andi. 3, 3, 1
576 ; NO_ISEL-NEXT:    li 3, 18
577 ; NO_ISEL-NEXT:    li 4, -7
578 ; NO_ISEL-NEXT:    bc 12, 1, .LBB35_1
579 ; NO_ISEL-NEXT:    blr
580 ; NO_ISEL-NEXT:  .LBB35_1:
581 ; NO_ISEL-NEXT:    addi 3, 4, 0
582 ; NO_ISEL-NEXT:    blr
583   %sel = select i1 %cond, i8 -4, i8 23
584   %bo = xor i8 %sel, 5
585   ret i8 %bo
588 define i8 @sel_constants_shl_constant(i1 %cond) {
589 ; ISEL-LABEL: sel_constants_shl_constant:
590 ; ISEL:       # %bb.0:
591 ; ISEL-NEXT:    andi. 3, 3, 1
592 ; ISEL-NEXT:    li 3, -32
593 ; ISEL-NEXT:    li 4, -128
594 ; ISEL-NEXT:    iselgt 3, 4, 3
595 ; ISEL-NEXT:    blr
597 ; NO_ISEL-LABEL: sel_constants_shl_constant:
598 ; NO_ISEL:       # %bb.0:
599 ; NO_ISEL-NEXT:    andi. 3, 3, 1
600 ; NO_ISEL-NEXT:    li 3, -32
601 ; NO_ISEL-NEXT:    li 4, -128
602 ; NO_ISEL-NEXT:    bc 12, 1, .LBB36_1
603 ; NO_ISEL-NEXT:    blr
604 ; NO_ISEL-NEXT:  .LBB36_1:
605 ; NO_ISEL-NEXT:    addi 3, 4, 0
606 ; NO_ISEL-NEXT:    blr
607   %sel = select i1 %cond, i8 -4, i8 23
608   %bo = shl i8 %sel, 5
609   ret i8 %bo
612 define i8 @shl_constant_sel_constants(i1 %cond) {
613 ; ALL-LABEL: shl_constant_sel_constants:
614 ; ALL:       # %bb.0:
615 ; ALL-NEXT:    clrlwi 3, 3, 31
616 ; ALL-NEXT:    li 4, 1
617 ; ALL-NEXT:    xori 3, 3, 3
618 ; ALL-NEXT:    slw 3, 4, 3
619 ; ALL-NEXT:    blr
620   %sel = select i1 %cond, i8 2, i8 3
621   %bo = shl i8 1, %sel
622   ret i8 %bo
625 define i8 @sel_constants_lshr_constant(i1 %cond) {
626 ; ISEL-LABEL: sel_constants_lshr_constant:
627 ; ISEL:       # %bb.0:
628 ; ISEL-NEXT:    andi. 3, 3, 1
629 ; ISEL-NEXT:    li 3, 0
630 ; ISEL-NEXT:    li 4, 7
631 ; ISEL-NEXT:    iselgt 3, 4, 3
632 ; ISEL-NEXT:    blr
634 ; NO_ISEL-LABEL: sel_constants_lshr_constant:
635 ; NO_ISEL:       # %bb.0:
636 ; NO_ISEL-NEXT:    andi. 3, 3, 1
637 ; NO_ISEL-NEXT:    li 3, 0
638 ; NO_ISEL-NEXT:    li 4, 7
639 ; NO_ISEL-NEXT:    bc 12, 1, .LBB38_1
640 ; NO_ISEL-NEXT:    blr
641 ; NO_ISEL-NEXT:  .LBB38_1:
642 ; NO_ISEL-NEXT:    addi 3, 4, 0
643 ; NO_ISEL-NEXT:    blr
644   %sel = select i1 %cond, i8 -4, i8 23
645   %bo = lshr i8 %sel, 5
646   ret i8 %bo
649 define i8 @lshr_constant_sel_constants(i1 %cond) {
650 ; ALL-LABEL: lshr_constant_sel_constants:
651 ; ALL:       # %bb.0:
652 ; ALL-NEXT:    clrlwi 3, 3, 31
653 ; ALL-NEXT:    li 4, 64
654 ; ALL-NEXT:    xori 3, 3, 3
655 ; ALL-NEXT:    srw 3, 4, 3
656 ; ALL-NEXT:    blr
657   %sel = select i1 %cond, i8 2, i8 3
658   %bo = lshr i8 64, %sel
659   ret i8 %bo
663 define i8 @sel_constants_ashr_constant(i1 %cond) {
664 ; ALL-LABEL: sel_constants_ashr_constant:
665 ; ALL:       # %bb.0:
666 ; ALL-NEXT:    clrlwi 3, 3, 31
667 ; ALL-NEXT:    neg 3, 3
668 ; ALL-NEXT:    blr
669   %sel = select i1 %cond, i8 -4, i8 23
670   %bo = ashr i8 %sel, 5
671   ret i8 %bo
674 define i8 @ashr_constant_sel_constants(i1 %cond) {
675 ; ALL-LABEL: ashr_constant_sel_constants:
676 ; ALL:       # %bb.0:
677 ; ALL-NEXT:    clrlwi 3, 3, 31
678 ; ALL-NEXT:    li 4, -128
679 ; ALL-NEXT:    xori 3, 3, 3
680 ; ALL-NEXT:    sraw 3, 4, 3
681 ; ALL-NEXT:    blr
682   %sel = select i1 %cond, i8 2, i8 3
683   %bo = ashr i8 128, %sel
684   ret i8 %bo
687 define double @sel_constants_fadd_constant(i1 %cond) {
688 ; ISEL-LABEL: sel_constants_fadd_constant:
689 ; ISEL:       # %bb.0:
690 ; ISEL-NEXT:    andi. 3, 3, 1
691 ; ISEL-NEXT:    addis 3, 2, .LCPI42_0@toc@ha
692 ; ISEL-NEXT:    addis 4, 2, .LCPI42_1@toc@ha
693 ; ISEL-NEXT:    addi 3, 3, .LCPI42_0@toc@l
694 ; ISEL-NEXT:    addi 4, 4, .LCPI42_1@toc@l
695 ; ISEL-NEXT:    iselgt 3, 4, 3
696 ; ISEL-NEXT:    lfd 1, 0(3)
697 ; ISEL-NEXT:    blr
699 ; NO_ISEL-LABEL: sel_constants_fadd_constant:
700 ; NO_ISEL:       # %bb.0:
701 ; NO_ISEL-NEXT:    andi. 3, 3, 1
702 ; NO_ISEL-NEXT:    addis 3, 2, .LCPI42_0@toc@ha
703 ; NO_ISEL-NEXT:    addis 4, 2, .LCPI42_1@toc@ha
704 ; NO_ISEL-NEXT:    addi 3, 3, .LCPI42_0@toc@l
705 ; NO_ISEL-NEXT:    addi 4, 4, .LCPI42_1@toc@l
706 ; NO_ISEL-NEXT:    bc 12, 1, .LBB42_1
707 ; NO_ISEL-NEXT:    b .LBB42_2
708 ; NO_ISEL-NEXT:  .LBB42_1:
709 ; NO_ISEL-NEXT:    addi 3, 4, 0
710 ; NO_ISEL-NEXT:  .LBB42_2:
711 ; NO_ISEL-NEXT:    lfd 1, 0(3)
712 ; NO_ISEL-NEXT:    blr
713   %sel = select i1 %cond, double -4.0, double 23.3
714   %bo = fadd double %sel, 5.1
715   ret double %bo
718 define double @sel_constants_fsub_constant(i1 %cond) {
719 ; ISEL-LABEL: sel_constants_fsub_constant:
720 ; ISEL:       # %bb.0:
721 ; ISEL-NEXT:    andi. 3, 3, 1
722 ; ISEL-NEXT:    addis 3, 2, .LCPI43_0@toc@ha
723 ; ISEL-NEXT:    addis 4, 2, .LCPI43_1@toc@ha
724 ; ISEL-NEXT:    addi 3, 3, .LCPI43_0@toc@l
725 ; ISEL-NEXT:    addi 4, 4, .LCPI43_1@toc@l
726 ; ISEL-NEXT:    iselgt 3, 4, 3
727 ; ISEL-NEXT:    lfd 1, 0(3)
728 ; ISEL-NEXT:    blr
730 ; NO_ISEL-LABEL: sel_constants_fsub_constant:
731 ; NO_ISEL:       # %bb.0:
732 ; NO_ISEL-NEXT:    andi. 3, 3, 1
733 ; NO_ISEL-NEXT:    addis 3, 2, .LCPI43_0@toc@ha
734 ; NO_ISEL-NEXT:    addis 4, 2, .LCPI43_1@toc@ha
735 ; NO_ISEL-NEXT:    addi 3, 3, .LCPI43_0@toc@l
736 ; NO_ISEL-NEXT:    addi 4, 4, .LCPI43_1@toc@l
737 ; NO_ISEL-NEXT:    bc 12, 1, .LBB43_1
738 ; NO_ISEL-NEXT:    b .LBB43_2
739 ; NO_ISEL-NEXT:  .LBB43_1:
740 ; NO_ISEL-NEXT:    addi 3, 4, 0
741 ; NO_ISEL-NEXT:  .LBB43_2:
742 ; NO_ISEL-NEXT:    lfd 1, 0(3)
743 ; NO_ISEL-NEXT:    blr
744   %sel = select i1 %cond, double -4.0, double 23.3
745   %bo = fsub double %sel, 5.1
746   ret double %bo
749 define double @fsub_constant_sel_constants(i1 %cond) {
750 ; ISEL-LABEL: fsub_constant_sel_constants:
751 ; ISEL:       # %bb.0:
752 ; ISEL-NEXT:    andi. 3, 3, 1
753 ; ISEL-NEXT:    addis 3, 2, .LCPI44_0@toc@ha
754 ; ISEL-NEXT:    addis 4, 2, .LCPI44_1@toc@ha
755 ; ISEL-NEXT:    addi 3, 3, .LCPI44_0@toc@l
756 ; ISEL-NEXT:    addi 4, 4, .LCPI44_1@toc@l
757 ; ISEL-NEXT:    iselgt 3, 4, 3
758 ; ISEL-NEXT:    lfd 1, 0(3)
759 ; ISEL-NEXT:    blr
761 ; NO_ISEL-LABEL: fsub_constant_sel_constants:
762 ; NO_ISEL:       # %bb.0:
763 ; NO_ISEL-NEXT:    andi. 3, 3, 1
764 ; NO_ISEL-NEXT:    addis 3, 2, .LCPI44_0@toc@ha
765 ; NO_ISEL-NEXT:    addis 4, 2, .LCPI44_1@toc@ha
766 ; NO_ISEL-NEXT:    addi 3, 3, .LCPI44_0@toc@l
767 ; NO_ISEL-NEXT:    addi 4, 4, .LCPI44_1@toc@l
768 ; NO_ISEL-NEXT:    bc 12, 1, .LBB44_1
769 ; NO_ISEL-NEXT:    b .LBB44_2
770 ; NO_ISEL-NEXT:  .LBB44_1:
771 ; NO_ISEL-NEXT:    addi 3, 4, 0
772 ; NO_ISEL-NEXT:  .LBB44_2:
773 ; NO_ISEL-NEXT:    lfd 1, 0(3)
774 ; NO_ISEL-NEXT:    blr
775   %sel = select i1 %cond, double -4.0, double 23.3
776   %bo = fsub double 5.1, %sel
777   ret double %bo
780 define double @sel_constants_fmul_constant(i1 %cond) {
781 ; ISEL-LABEL: sel_constants_fmul_constant:
782 ; ISEL:       # %bb.0:
783 ; ISEL-NEXT:    andi. 3, 3, 1
784 ; ISEL-NEXT:    addis 3, 2, .LCPI45_0@toc@ha
785 ; ISEL-NEXT:    addis 4, 2, .LCPI45_1@toc@ha
786 ; ISEL-NEXT:    addi 3, 3, .LCPI45_0@toc@l
787 ; ISEL-NEXT:    addi 4, 4, .LCPI45_1@toc@l
788 ; ISEL-NEXT:    iselgt 3, 4, 3
789 ; ISEL-NEXT:    lfd 1, 0(3)
790 ; ISEL-NEXT:    blr
792 ; NO_ISEL-LABEL: sel_constants_fmul_constant:
793 ; NO_ISEL:       # %bb.0:
794 ; NO_ISEL-NEXT:    andi. 3, 3, 1
795 ; NO_ISEL-NEXT:    addis 3, 2, .LCPI45_0@toc@ha
796 ; NO_ISEL-NEXT:    addis 4, 2, .LCPI45_1@toc@ha
797 ; NO_ISEL-NEXT:    addi 3, 3, .LCPI45_0@toc@l
798 ; NO_ISEL-NEXT:    addi 4, 4, .LCPI45_1@toc@l
799 ; NO_ISEL-NEXT:    bc 12, 1, .LBB45_1
800 ; NO_ISEL-NEXT:    b .LBB45_2
801 ; NO_ISEL-NEXT:  .LBB45_1:
802 ; NO_ISEL-NEXT:    addi 3, 4, 0
803 ; NO_ISEL-NEXT:  .LBB45_2:
804 ; NO_ISEL-NEXT:    lfd 1, 0(3)
805 ; NO_ISEL-NEXT:    blr
806   %sel = select i1 %cond, double -4.0, double 23.3
807   %bo = fmul double %sel, 5.1
808   ret double %bo
811 define double @sel_constants_fdiv_constant(i1 %cond) {
812 ; ISEL-LABEL: sel_constants_fdiv_constant:
813 ; ISEL:       # %bb.0:
814 ; ISEL-NEXT:    andi. 3, 3, 1
815 ; ISEL-NEXT:    addis 3, 2, .LCPI46_0@toc@ha
816 ; ISEL-NEXT:    addis 4, 2, .LCPI46_1@toc@ha
817 ; ISEL-NEXT:    addi 3, 3, .LCPI46_0@toc@l
818 ; ISEL-NEXT:    addi 4, 4, .LCPI46_1@toc@l
819 ; ISEL-NEXT:    iselgt 3, 4, 3
820 ; ISEL-NEXT:    lfd 1, 0(3)
821 ; ISEL-NEXT:    blr
823 ; NO_ISEL-LABEL: sel_constants_fdiv_constant:
824 ; NO_ISEL:       # %bb.0:
825 ; NO_ISEL-NEXT:    andi. 3, 3, 1
826 ; NO_ISEL-NEXT:    addis 3, 2, .LCPI46_0@toc@ha
827 ; NO_ISEL-NEXT:    addis 4, 2, .LCPI46_1@toc@ha
828 ; NO_ISEL-NEXT:    addi 3, 3, .LCPI46_0@toc@l
829 ; NO_ISEL-NEXT:    addi 4, 4, .LCPI46_1@toc@l
830 ; NO_ISEL-NEXT:    bc 12, 1, .LBB46_1
831 ; NO_ISEL-NEXT:    b .LBB46_2
832 ; NO_ISEL-NEXT:  .LBB46_1:
833 ; NO_ISEL-NEXT:    addi 3, 4, 0
834 ; NO_ISEL-NEXT:  .LBB46_2:
835 ; NO_ISEL-NEXT:    lfd 1, 0(3)
836 ; NO_ISEL-NEXT:    blr
837   %sel = select i1 %cond, double -4.0, double 23.3
838   %bo = fdiv double %sel, 5.1
839   ret double %bo
842 define double @fdiv_constant_sel_constants(i1 %cond) {
843 ; ISEL-LABEL: fdiv_constant_sel_constants:
844 ; ISEL:       # %bb.0:
845 ; ISEL-NEXT:    andi. 3, 3, 1
846 ; ISEL-NEXT:    addis 3, 2, .LCPI47_0@toc@ha
847 ; ISEL-NEXT:    addis 4, 2, .LCPI47_1@toc@ha
848 ; ISEL-NEXT:    addi 3, 3, .LCPI47_0@toc@l
849 ; ISEL-NEXT:    addi 4, 4, .LCPI47_1@toc@l
850 ; ISEL-NEXT:    iselgt 3, 4, 3
851 ; ISEL-NEXT:    lfd 1, 0(3)
852 ; ISEL-NEXT:    blr
854 ; NO_ISEL-LABEL: fdiv_constant_sel_constants:
855 ; NO_ISEL:       # %bb.0:
856 ; NO_ISEL-NEXT:    andi. 3, 3, 1
857 ; NO_ISEL-NEXT:    addis 3, 2, .LCPI47_0@toc@ha
858 ; NO_ISEL-NEXT:    addis 4, 2, .LCPI47_1@toc@ha
859 ; NO_ISEL-NEXT:    addi 3, 3, .LCPI47_0@toc@l
860 ; NO_ISEL-NEXT:    addi 4, 4, .LCPI47_1@toc@l
861 ; NO_ISEL-NEXT:    bc 12, 1, .LBB47_1
862 ; NO_ISEL-NEXT:    b .LBB47_2
863 ; NO_ISEL-NEXT:  .LBB47_1:
864 ; NO_ISEL-NEXT:    addi 3, 4, 0
865 ; NO_ISEL-NEXT:  .LBB47_2:
866 ; NO_ISEL-NEXT:    lfd 1, 0(3)
867 ; NO_ISEL-NEXT:    blr
868   %sel = select i1 %cond, double -4.0, double 23.3
869   %bo = fdiv double 5.1, %sel
870   ret double %bo
873 define double @sel_constants_frem_constant(i1 %cond) {
874 ; ALL-LABEL: sel_constants_frem_constant:
875 ; ALL:       # %bb.0:
876 ; ALL-NEXT:    andi. 3, 3, 1
877 ; ALL-NEXT:    bc 12, 1, .LBB48_2
878 ; ALL-NEXT:  # %bb.1:
879 ; ALL-NEXT:    addis 3, 2, .LCPI48_0@toc@ha
880 ; ALL-NEXT:    lfd 1, .LCPI48_0@toc@l(3)
881 ; ALL-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
882 ; ALL-NEXT:    blr
883 ; ALL-NEXT:  .LBB48_2:
884 ; ALL-NEXT:    vspltisw 2, -4
885 ; ALL-NEXT:    xvcvsxwdp 1, 34
886 ; ALL-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
887 ; ALL-NEXT:    blr
888   %sel = select i1 %cond, double -4.0, double 23.3
889   %bo = frem double %sel, 5.1
890   ret double %bo
893 define double @frem_constant_sel_constants(i1 %cond) {
894 ; ISEL-LABEL: frem_constant_sel_constants:
895 ; ISEL:       # %bb.0:
896 ; ISEL-NEXT:    andi. 3, 3, 1
897 ; ISEL-NEXT:    addis 3, 2, .LCPI49_0@toc@ha
898 ; ISEL-NEXT:    addis 4, 2, .LCPI49_1@toc@ha
899 ; ISEL-NEXT:    addi 3, 3, .LCPI49_0@toc@l
900 ; ISEL-NEXT:    addi 4, 4, .LCPI49_1@toc@l
901 ; ISEL-NEXT:    iselgt 3, 4, 3
902 ; ISEL-NEXT:    lfd 1, 0(3)
903 ; ISEL-NEXT:    blr
905 ; NO_ISEL-LABEL: frem_constant_sel_constants:
906 ; NO_ISEL:       # %bb.0:
907 ; NO_ISEL-NEXT:    andi. 3, 3, 1
908 ; NO_ISEL-NEXT:    addis 3, 2, .LCPI49_0@toc@ha
909 ; NO_ISEL-NEXT:    addis 4, 2, .LCPI49_1@toc@ha
910 ; NO_ISEL-NEXT:    addi 3, 3, .LCPI49_0@toc@l
911 ; NO_ISEL-NEXT:    addi 4, 4, .LCPI49_1@toc@l
912 ; NO_ISEL-NEXT:    bc 12, 1, .LBB49_1
913 ; NO_ISEL-NEXT:    b .LBB49_2
914 ; NO_ISEL-NEXT:  .LBB49_1:
915 ; NO_ISEL-NEXT:    addi 3, 4, 0
916 ; NO_ISEL-NEXT:  .LBB49_2:
917 ; NO_ISEL-NEXT:    lfd 1, 0(3)
918 ; NO_ISEL-NEXT:    blr
919   %sel = select i1 %cond, double -4.0, double 23.3
920   %bo = frem double 5.1, %sel
921   ret double %bo