xref: /llvm-project/llvm/test/CodeGen/PowerPC/select_const.ll (revision 53c37f300dd1b450671f2aee4cc649c380adb5ad)
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
4
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.
7
8; select Cond, 0, 1 --> zext (!Cond)
9
10define 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
18}
19
20define 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
27}
28
29define 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
37}
38
39; select Cond, 1, 0 --> zext (Cond)
40
41define 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
48}
49
50define 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
56}
57
58define 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
65}
66
67; select Cond, 0, -1 --> sext (!Cond)
68
69define 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
77}
78
79define 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
86}
87
88define 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
95}
96
97; select Cond, -1, 0 --> sext (Cond)
98
99define 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
107}
108
109define 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
116}
117
118define 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
124}
125
126; select Cond, C+1, C --> add (zext Cond), C
127
128define 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
136}
137
138define 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
145}
146
147define 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
154}
155
156; select Cond, C, C+1 --> add (sext Cond), C
157
158define 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
166}
167
168define 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
175}
176
177define 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
184}
185
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
188
189define 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
197;
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, 421
202; NO_ISEL-NEXT:    bclr 12, 1, 0
203; NO_ISEL-NEXT:  # %bb.1:
204; NO_ISEL-NEXT:    li 3, 42
205; NO_ISEL-NEXT:    blr
206  %sel = select i1 %cond, i32 421, i32 42
207  ret i32 %sel
208}
209
210define i32 @select_C1_C2_zeroext(i1 zeroext %cond) {
211; ISEL-LABEL: select_C1_C2_zeroext:
212; ISEL:       # %bb.0:
213; ISEL-NEXT:    andi. 3, 3, 1
214; ISEL-NEXT:    li 3, 42
215; ISEL-NEXT:    li 4, 421
216; ISEL-NEXT:    iselgt 3, 4, 3
217; ISEL-NEXT:    blr
218;
219; NO_ISEL-LABEL: select_C1_C2_zeroext:
220; NO_ISEL:       # %bb.0:
221; NO_ISEL-NEXT:    andi. 3, 3, 1
222; NO_ISEL-NEXT:    li 3, 421
223; NO_ISEL-NEXT:    bclr 12, 1, 0
224; NO_ISEL-NEXT:  # %bb.1:
225; NO_ISEL-NEXT:    li 3, 42
226; NO_ISEL-NEXT:    blr
227  %sel = select i1 %cond, i32 421, i32 42
228  ret i32 %sel
229}
230
231define i32 @select_C1_C2_signext(i1 signext %cond) {
232; ISEL-LABEL: select_C1_C2_signext:
233; ISEL:       # %bb.0:
234; ISEL-NEXT:    andi. 3, 3, 1
235; ISEL-NEXT:    li 3, 42
236; ISEL-NEXT:    li 4, 421
237; ISEL-NEXT:    iselgt 3, 4, 3
238; ISEL-NEXT:    blr
239;
240; NO_ISEL-LABEL: select_C1_C2_signext:
241; NO_ISEL:       # %bb.0:
242; NO_ISEL-NEXT:    andi. 3, 3, 1
243; NO_ISEL-NEXT:    li 3, 421
244; NO_ISEL-NEXT:    bclr 12, 1, 0
245; NO_ISEL-NEXT:  # %bb.1:
246; NO_ISEL-NEXT:    li 3, 42
247; NO_ISEL-NEXT:    blr
248  %sel = select i1 %cond, i32 421, i32 42
249  ret i32 %sel
250}
251
252; A binary operator with constant after the select should always get folded into the select.
253
254define i8 @sel_constants_add_constant(i1 %cond) {
255; ISEL-LABEL: sel_constants_add_constant:
256; ISEL:       # %bb.0:
257; ISEL-NEXT:    andi. 3, 3, 1
258; ISEL-NEXT:    li 3, 28
259; ISEL-NEXT:    li 4, 1
260; ISEL-NEXT:    iselgt 3, 4, 3
261; ISEL-NEXT:    blr
262;
263; NO_ISEL-LABEL: sel_constants_add_constant:
264; NO_ISEL:       # %bb.0:
265; NO_ISEL-NEXT:    andi. 3, 3, 1
266; NO_ISEL-NEXT:    li 3, 1
267; NO_ISEL-NEXT:    bclr 12, 1, 0
268; NO_ISEL-NEXT:  # %bb.1:
269; NO_ISEL-NEXT:    li 3, 28
270; NO_ISEL-NEXT:    blr
271  %sel = select i1 %cond, i8 -4, i8 23
272  %bo = add i8 %sel, 5
273  ret i8 %bo
274}
275
276define i8 @sel_constants_sub_constant(i1 %cond) {
277; ISEL-LABEL: sel_constants_sub_constant:
278; ISEL:       # %bb.0:
279; ISEL-NEXT:    andi. 3, 3, 1
280; ISEL-NEXT:    li 3, 18
281; ISEL-NEXT:    li 4, -9
282; ISEL-NEXT:    iselgt 3, 4, 3
283; ISEL-NEXT:    blr
284;
285; NO_ISEL-LABEL: sel_constants_sub_constant:
286; NO_ISEL:       # %bb.0:
287; NO_ISEL-NEXT:    andi. 3, 3, 1
288; NO_ISEL-NEXT:    li 3, -9
289; NO_ISEL-NEXT:    bclr 12, 1, 0
290; NO_ISEL-NEXT:  # %bb.1:
291; NO_ISEL-NEXT:    li 3, 18
292; NO_ISEL-NEXT:    blr
293  %sel = select i1 %cond, i8 -4, i8 23
294  %bo = sub i8 %sel, 5
295  ret i8 %bo
296}
297
298define i8 @sel_constants_sub_constant_sel_constants(i1 %cond) {
299; ISEL-LABEL: sel_constants_sub_constant_sel_constants:
300; ISEL:       # %bb.0:
301; ISEL-NEXT:    andi. 3, 3, 1
302; ISEL-NEXT:    li 3, 2
303; ISEL-NEXT:    li 4, 9
304; ISEL-NEXT:    iselgt 3, 4, 3
305; ISEL-NEXT:    blr
306;
307; NO_ISEL-LABEL: sel_constants_sub_constant_sel_constants:
308; NO_ISEL:       # %bb.0:
309; NO_ISEL-NEXT:    andi. 3, 3, 1
310; NO_ISEL-NEXT:    li 3, 9
311; NO_ISEL-NEXT:    bclr 12, 1, 0
312; NO_ISEL-NEXT:  # %bb.1:
313; NO_ISEL-NEXT:    li 3, 2
314; NO_ISEL-NEXT:    blr
315  %sel = select i1 %cond, i8 -4, i8 3
316  %bo = sub i8 5, %sel
317  ret i8 %bo
318}
319
320define i8 @sel_constants_mul_constant(i1 %cond) {
321; ISEL-LABEL: sel_constants_mul_constant:
322; ISEL:       # %bb.0:
323; ISEL-NEXT:    andi. 3, 3, 1
324; ISEL-NEXT:    li 3, 115
325; ISEL-NEXT:    li 4, -20
326; ISEL-NEXT:    iselgt 3, 4, 3
327; ISEL-NEXT:    blr
328;
329; NO_ISEL-LABEL: sel_constants_mul_constant:
330; NO_ISEL:       # %bb.0:
331; NO_ISEL-NEXT:    andi. 3, 3, 1
332; NO_ISEL-NEXT:    li 3, -20
333; NO_ISEL-NEXT:    bclr 12, 1, 0
334; NO_ISEL-NEXT:  # %bb.1:
335; NO_ISEL-NEXT:    li 3, 115
336; NO_ISEL-NEXT:    blr
337  %sel = select i1 %cond, i8 -4, i8 23
338  %bo = mul i8 %sel, 5
339  ret i8 %bo
340}
341
342define i8 @sel_constants_sdiv_constant(i1 %cond) {
343; ISEL-LABEL: sel_constants_sdiv_constant:
344; ISEL:       # %bb.0:
345; ISEL-NEXT:    andi. 3, 3, 1
346; ISEL-NEXT:    li 3, 4
347; ISEL-NEXT:    iselgt 3, 0, 3
348; ISEL-NEXT:    blr
349;
350; NO_ISEL-LABEL: sel_constants_sdiv_constant:
351; NO_ISEL:       # %bb.0:
352; NO_ISEL-NEXT:    andi. 3, 3, 1
353; NO_ISEL-NEXT:    li 3, 0
354; NO_ISEL-NEXT:    bclr 12, 1, 0
355; NO_ISEL-NEXT:  # %bb.1:
356; NO_ISEL-NEXT:    li 3, 4
357; NO_ISEL-NEXT:    blr
358  %sel = select i1 %cond, i8 -4, i8 23
359  %bo = sdiv i8 %sel, 5
360  ret i8 %bo
361}
362
363define i8 @sdiv_constant_sel_constants(i1 %cond) {
364; ISEL-LABEL: sdiv_constant_sel_constants:
365; ISEL:       # %bb.0:
366; ISEL-NEXT:    andi. 3, 3, 1
367; ISEL-NEXT:    li 3, 5
368; ISEL-NEXT:    iselgt 3, 0, 3
369; ISEL-NEXT:    blr
370;
371; NO_ISEL-LABEL: sdiv_constant_sel_constants:
372; NO_ISEL:       # %bb.0:
373; NO_ISEL-NEXT:    andi. 3, 3, 1
374; NO_ISEL-NEXT:    li 3, 0
375; NO_ISEL-NEXT:    bclr 12, 1, 0
376; NO_ISEL-NEXT:  # %bb.1:
377; NO_ISEL-NEXT:    li 3, 5
378; NO_ISEL-NEXT:    blr
379  %sel = select i1 %cond, i8 121, i8 23
380  %bo = sdiv i8 120, %sel
381  ret i8 %bo
382}
383
384define i8 @sel_constants_udiv_constant(i1 %cond) {
385; ISEL-LABEL: sel_constants_udiv_constant:
386; ISEL:       # %bb.0:
387; ISEL-NEXT:    andi. 3, 3, 1
388; ISEL-NEXT:    li 3, 4
389; ISEL-NEXT:    li 4, 50
390; ISEL-NEXT:    iselgt 3, 4, 3
391; ISEL-NEXT:    blr
392;
393; NO_ISEL-LABEL: sel_constants_udiv_constant:
394; NO_ISEL:       # %bb.0:
395; NO_ISEL-NEXT:    andi. 3, 3, 1
396; NO_ISEL-NEXT:    li 3, 50
397; NO_ISEL-NEXT:    bclr 12, 1, 0
398; NO_ISEL-NEXT:  # %bb.1:
399; NO_ISEL-NEXT:    li 3, 4
400; NO_ISEL-NEXT:    blr
401  %sel = select i1 %cond, i8 -4, i8 23
402  %bo = udiv i8 %sel, 5
403  ret i8 %bo
404}
405
406define i8 @udiv_constant_sel_constants(i1 %cond) {
407; ISEL-LABEL: udiv_constant_sel_constants:
408; ISEL:       # %bb.0:
409; ISEL-NEXT:    andi. 3, 3, 1
410; ISEL-NEXT:    li 3, 5
411; ISEL-NEXT:    iselgt 3, 0, 3
412; ISEL-NEXT:    blr
413;
414; NO_ISEL-LABEL: udiv_constant_sel_constants:
415; NO_ISEL:       # %bb.0:
416; NO_ISEL-NEXT:    andi. 3, 3, 1
417; NO_ISEL-NEXT:    li 3, 0
418; NO_ISEL-NEXT:    bclr 12, 1, 0
419; NO_ISEL-NEXT:  # %bb.1:
420; NO_ISEL-NEXT:    li 3, 5
421; NO_ISEL-NEXT:    blr
422  %sel = select i1 %cond, i8 -4, i8 23
423  %bo = udiv i8 120, %sel
424  ret i8 %bo
425}
426
427define i8 @sel_constants_srem_constant(i1 %cond) {
428; ISEL-LABEL: sel_constants_srem_constant:
429; ISEL:       # %bb.0:
430; ISEL-NEXT:    andi. 3, 3, 1
431; ISEL-NEXT:    li 3, 3
432; ISEL-NEXT:    li 4, -4
433; ISEL-NEXT:    iselgt 3, 4, 3
434; ISEL-NEXT:    blr
435;
436; NO_ISEL-LABEL: sel_constants_srem_constant:
437; NO_ISEL:       # %bb.0:
438; NO_ISEL-NEXT:    andi. 3, 3, 1
439; NO_ISEL-NEXT:    li 3, -4
440; NO_ISEL-NEXT:    bclr 12, 1, 0
441; NO_ISEL-NEXT:  # %bb.1:
442; NO_ISEL-NEXT:    li 3, 3
443; NO_ISEL-NEXT:    blr
444  %sel = select i1 %cond, i8 -4, i8 23
445  %bo = srem i8 %sel, 5
446  ret i8 %bo
447}
448
449define i8 @srem_constant_sel_constants(i1 %cond) {
450; ISEL-LABEL: srem_constant_sel_constants:
451; ISEL:       # %bb.0:
452; ISEL-NEXT:    andi. 3, 3, 1
453; ISEL-NEXT:    li 3, 5
454; ISEL-NEXT:    li 4, 120
455; ISEL-NEXT:    iselgt 3, 4, 3
456; ISEL-NEXT:    blr
457;
458; NO_ISEL-LABEL: srem_constant_sel_constants:
459; NO_ISEL:       # %bb.0:
460; NO_ISEL-NEXT:    andi. 3, 3, 1
461; NO_ISEL-NEXT:    li 3, 120
462; NO_ISEL-NEXT:    bclr 12, 1, 0
463; NO_ISEL-NEXT:  # %bb.1:
464; NO_ISEL-NEXT:    li 3, 5
465; NO_ISEL-NEXT:    blr
466  %sel = select i1 %cond, i8 121, i8 23
467  %bo = srem i8 120, %sel
468  ret i8 %bo
469}
470
471define i8 @sel_constants_urem_constant(i1 %cond) {
472; ALL-LABEL: sel_constants_urem_constant:
473; ALL:       # %bb.0:
474; ALL-NEXT:    clrldi 3, 3, 63
475; ALL-NEXT:    xori 3, 3, 3
476; ALL-NEXT:    blr
477  %sel = select i1 %cond, i8 -4, i8 23
478  %bo = urem i8 %sel, 5
479  ret i8 %bo
480}
481
482define i8 @urem_constant_sel_constants(i1 %cond) {
483; ISEL-LABEL: urem_constant_sel_constants:
484; ISEL:       # %bb.0:
485; ISEL-NEXT:    andi. 3, 3, 1
486; ISEL-NEXT:    li 3, 5
487; ISEL-NEXT:    li 4, 120
488; ISEL-NEXT:    iselgt 3, 4, 3
489; ISEL-NEXT:    blr
490;
491; NO_ISEL-LABEL: urem_constant_sel_constants:
492; NO_ISEL:       # %bb.0:
493; NO_ISEL-NEXT:    andi. 3, 3, 1
494; NO_ISEL-NEXT:    li 3, 120
495; NO_ISEL-NEXT:    bclr 12, 1, 0
496; NO_ISEL-NEXT:  # %bb.1:
497; NO_ISEL-NEXT:    li 3, 5
498; NO_ISEL-NEXT:    blr
499  %sel = select i1 %cond, i8 -4, i8 23
500  %bo = urem i8 120, %sel
501  ret i8 %bo
502}
503
504define i8 @sel_constants_and_constant(i1 %cond) {
505; ALL-LABEL: sel_constants_and_constant:
506; ALL:       # %bb.0:
507; ALL-NEXT:    clrldi 3, 3, 63
508; ALL-NEXT:    xori 3, 3, 5
509; ALL-NEXT:    blr
510  %sel = select i1 %cond, i8 -4, i8 23
511  %bo = and i8 %sel, 5
512  ret i8 %bo
513}
514
515define i8 @sel_constants_or_constant(i1 %cond) {
516; ISEL-LABEL: sel_constants_or_constant:
517; ISEL:       # %bb.0:
518; ISEL-NEXT:    andi. 3, 3, 1
519; ISEL-NEXT:    li 3, 23
520; ISEL-NEXT:    li 4, -3
521; ISEL-NEXT:    iselgt 3, 4, 3
522; ISEL-NEXT:    blr
523;
524; NO_ISEL-LABEL: sel_constants_or_constant:
525; NO_ISEL:       # %bb.0:
526; NO_ISEL-NEXT:    andi. 3, 3, 1
527; NO_ISEL-NEXT:    li 3, -3
528; NO_ISEL-NEXT:    bclr 12, 1, 0
529; NO_ISEL-NEXT:  # %bb.1:
530; NO_ISEL-NEXT:    li 3, 23
531; NO_ISEL-NEXT:    blr
532  %sel = select i1 %cond, i8 -4, i8 23
533  %bo = or i8 %sel, 5
534  ret i8 %bo
535}
536
537define i8 @sel_constants_xor_constant(i1 %cond) {
538; ISEL-LABEL: sel_constants_xor_constant:
539; ISEL:       # %bb.0:
540; ISEL-NEXT:    andi. 3, 3, 1
541; ISEL-NEXT:    li 3, 18
542; ISEL-NEXT:    li 4, -7
543; ISEL-NEXT:    iselgt 3, 4, 3
544; ISEL-NEXT:    blr
545;
546; NO_ISEL-LABEL: sel_constants_xor_constant:
547; NO_ISEL:       # %bb.0:
548; NO_ISEL-NEXT:    andi. 3, 3, 1
549; NO_ISEL-NEXT:    li 3, -7
550; NO_ISEL-NEXT:    bclr 12, 1, 0
551; NO_ISEL-NEXT:  # %bb.1:
552; NO_ISEL-NEXT:    li 3, 18
553; NO_ISEL-NEXT:    blr
554  %sel = select i1 %cond, i8 -4, i8 23
555  %bo = xor i8 %sel, 5
556  ret i8 %bo
557}
558
559define i8 @sel_constants_shl_constant(i1 %cond) {
560; ISEL-LABEL: sel_constants_shl_constant:
561; ISEL:       # %bb.0:
562; ISEL-NEXT:    andi. 3, 3, 1
563; ISEL-NEXT:    li 3, -32
564; ISEL-NEXT:    li 4, -128
565; ISEL-NEXT:    iselgt 3, 4, 3
566; ISEL-NEXT:    blr
567;
568; NO_ISEL-LABEL: sel_constants_shl_constant:
569; NO_ISEL:       # %bb.0:
570; NO_ISEL-NEXT:    andi. 3, 3, 1
571; NO_ISEL-NEXT:    li 3, -128
572; NO_ISEL-NEXT:    bclr 12, 1, 0
573; NO_ISEL-NEXT:  # %bb.1:
574; NO_ISEL-NEXT:    li 3, -32
575; NO_ISEL-NEXT:    blr
576  %sel = select i1 %cond, i8 -4, i8 23
577  %bo = shl i8 %sel, 5
578  ret i8 %bo
579}
580
581define i8 @shl_constant_sel_constants(i1 %cond) {
582; ALL-LABEL: shl_constant_sel_constants:
583; ALL:       # %bb.0:
584; ALL-NEXT:    clrlwi 3, 3, 31
585; ALL-NEXT:    li 4, 1
586; ALL-NEXT:    xori 3, 3, 3
587; ALL-NEXT:    slw 3, 4, 3
588; ALL-NEXT:    blr
589  %sel = select i1 %cond, i8 2, i8 3
590  %bo = shl i8 1, %sel
591  ret i8 %bo
592}
593
594define i8 @sel_constants_lshr_constant(i1 %cond) {
595; ISEL-LABEL: sel_constants_lshr_constant:
596; ISEL:       # %bb.0:
597; ISEL-NEXT:    andi. 3, 3, 1
598; ISEL-NEXT:    li 3, 0
599; ISEL-NEXT:    li 4, 7
600; ISEL-NEXT:    iselgt 3, 4, 3
601; ISEL-NEXT:    blr
602;
603; NO_ISEL-LABEL: sel_constants_lshr_constant:
604; NO_ISEL:       # %bb.0:
605; NO_ISEL-NEXT:    andi. 3, 3, 1
606; NO_ISEL-NEXT:    li 3, 7
607; NO_ISEL-NEXT:    bclr 12, 1, 0
608; NO_ISEL-NEXT:  # %bb.1:
609; NO_ISEL-NEXT:    li 3, 0
610; NO_ISEL-NEXT:    blr
611  %sel = select i1 %cond, i8 -4, i8 23
612  %bo = lshr i8 %sel, 5
613  ret i8 %bo
614}
615
616define i8 @lshr_constant_sel_constants(i1 %cond) {
617; ALL-LABEL: lshr_constant_sel_constants:
618; ALL:       # %bb.0:
619; ALL-NEXT:    clrlwi 3, 3, 31
620; ALL-NEXT:    li 4, 64
621; ALL-NEXT:    xori 3, 3, 3
622; ALL-NEXT:    srw 3, 4, 3
623; ALL-NEXT:    blr
624  %sel = select i1 %cond, i8 2, i8 3
625  %bo = lshr i8 64, %sel
626  ret i8 %bo
627}
628
629
630define i8 @sel_constants_ashr_constant(i1 %cond) {
631; ALL-LABEL: sel_constants_ashr_constant:
632; ALL:       # %bb.0:
633; ALL-NEXT:    clrlwi 3, 3, 31
634; ALL-NEXT:    neg 3, 3
635; ALL-NEXT:    blr
636  %sel = select i1 %cond, i8 -4, i8 23
637  %bo = ashr i8 %sel, 5
638  ret i8 %bo
639}
640
641define i8 @ashr_constant_sel_constants(i1 %cond) {
642; ALL-LABEL: ashr_constant_sel_constants:
643; ALL:       # %bb.0:
644; ALL-NEXT:    clrlwi 3, 3, 31
645; ALL-NEXT:    li 4, -128
646; ALL-NEXT:    xori 3, 3, 3
647; ALL-NEXT:    sraw 3, 4, 3
648; ALL-NEXT:    blr
649  %sel = select i1 %cond, i8 2, i8 3
650  %bo = ashr i8 128, %sel
651  ret i8 %bo
652}
653
654define double @sel_constants_fadd_constant(i1 %cond) {
655; ISEL-LABEL: sel_constants_fadd_constant:
656; ISEL:       # %bb.0:
657; ISEL-NEXT:    andi. 3, 3, 1
658; ISEL-NEXT:    addis 3, 2, .LCPI42_0@toc@ha
659; ISEL-NEXT:    addis 4, 2, .LCPI42_1@toc@ha
660; ISEL-NEXT:    addi 3, 3, .LCPI42_0@toc@l
661; ISEL-NEXT:    addi 4, 4, .LCPI42_1@toc@l
662; ISEL-NEXT:    iselgt 3, 4, 3
663; ISEL-NEXT:    lfd 1, 0(3)
664; ISEL-NEXT:    blr
665;
666; NO_ISEL-LABEL: sel_constants_fadd_constant:
667; NO_ISEL:       # %bb.0:
668; NO_ISEL-NEXT:    andi. 3, 3, 1
669; NO_ISEL-NEXT:    bc 12, 1, .LBB42_2
670; NO_ISEL-NEXT:  # %bb.1:
671; NO_ISEL-NEXT:    addis 3, 2, .LCPI42_0@toc@ha
672; NO_ISEL-NEXT:    addi 3, 3, .LCPI42_0@toc@l
673; NO_ISEL-NEXT:    lfd 1, 0(3)
674; NO_ISEL-NEXT:    blr
675; NO_ISEL-NEXT:  .LBB42_2:
676; NO_ISEL-NEXT:    addis 3, 2, .LCPI42_1@toc@ha
677; NO_ISEL-NEXT:    addi 3, 3, .LCPI42_1@toc@l
678; NO_ISEL-NEXT:    lfd 1, 0(3)
679; NO_ISEL-NEXT:    blr
680  %sel = select i1 %cond, double -4.0, double 23.3
681  %bo = fadd double %sel, 5.1
682  ret double %bo
683}
684
685define double @sel_constants_fsub_constant(i1 %cond) {
686; ISEL-LABEL: sel_constants_fsub_constant:
687; ISEL:       # %bb.0:
688; ISEL-NEXT:    andi. 3, 3, 1
689; ISEL-NEXT:    addis 3, 2, .LCPI43_0@toc@ha
690; ISEL-NEXT:    addis 4, 2, .LCPI43_1@toc@ha
691; ISEL-NEXT:    addi 3, 3, .LCPI43_0@toc@l
692; ISEL-NEXT:    addi 4, 4, .LCPI43_1@toc@l
693; ISEL-NEXT:    iselgt 3, 4, 3
694; ISEL-NEXT:    lfd 1, 0(3)
695; ISEL-NEXT:    blr
696;
697; NO_ISEL-LABEL: sel_constants_fsub_constant:
698; NO_ISEL:       # %bb.0:
699; NO_ISEL-NEXT:    andi. 3, 3, 1
700; NO_ISEL-NEXT:    bc 12, 1, .LBB43_2
701; NO_ISEL-NEXT:  # %bb.1:
702; NO_ISEL-NEXT:    addis 3, 2, .LCPI43_0@toc@ha
703; NO_ISEL-NEXT:    addi 3, 3, .LCPI43_0@toc@l
704; NO_ISEL-NEXT:    lfd 1, 0(3)
705; NO_ISEL-NEXT:    blr
706; NO_ISEL-NEXT:  .LBB43_2:
707; NO_ISEL-NEXT:    addis 3, 2, .LCPI43_1@toc@ha
708; NO_ISEL-NEXT:    addi 3, 3, .LCPI43_1@toc@l
709; NO_ISEL-NEXT:    lfd 1, 0(3)
710; NO_ISEL-NEXT:    blr
711  %sel = select i1 %cond, double -4.0, double 23.3
712  %bo = fsub double %sel, 5.1
713  ret double %bo
714}
715
716define double @fsub_constant_sel_constants(i1 %cond) {
717; ISEL-LABEL: fsub_constant_sel_constants:
718; ISEL:       # %bb.0:
719; ISEL-NEXT:    andi. 3, 3, 1
720; ISEL-NEXT:    addis 3, 2, .LCPI44_0@toc@ha
721; ISEL-NEXT:    addis 4, 2, .LCPI44_1@toc@ha
722; ISEL-NEXT:    addi 3, 3, .LCPI44_0@toc@l
723; ISEL-NEXT:    addi 4, 4, .LCPI44_1@toc@l
724; ISEL-NEXT:    iselgt 3, 4, 3
725; ISEL-NEXT:    lfd 1, 0(3)
726; ISEL-NEXT:    blr
727;
728; NO_ISEL-LABEL: fsub_constant_sel_constants:
729; NO_ISEL:       # %bb.0:
730; NO_ISEL-NEXT:    andi. 3, 3, 1
731; NO_ISEL-NEXT:    bc 12, 1, .LBB44_2
732; NO_ISEL-NEXT:  # %bb.1:
733; NO_ISEL-NEXT:    addis 3, 2, .LCPI44_0@toc@ha
734; NO_ISEL-NEXT:    addi 3, 3, .LCPI44_0@toc@l
735; NO_ISEL-NEXT:    lfd 1, 0(3)
736; NO_ISEL-NEXT:    blr
737; NO_ISEL-NEXT:  .LBB44_2:
738; NO_ISEL-NEXT:    addis 3, 2, .LCPI44_1@toc@ha
739; NO_ISEL-NEXT:    addi 3, 3, .LCPI44_1@toc@l
740; NO_ISEL-NEXT:    lfd 1, 0(3)
741; NO_ISEL-NEXT:    blr
742  %sel = select i1 %cond, double -4.0, double 23.3
743  %bo = fsub double 5.1, %sel
744  ret double %bo
745}
746
747define double @sel_constants_fmul_constant(i1 %cond) {
748; ISEL-LABEL: sel_constants_fmul_constant:
749; ISEL:       # %bb.0:
750; ISEL-NEXT:    andi. 3, 3, 1
751; ISEL-NEXT:    addis 3, 2, .LCPI45_0@toc@ha
752; ISEL-NEXT:    addis 4, 2, .LCPI45_1@toc@ha
753; ISEL-NEXT:    addi 3, 3, .LCPI45_0@toc@l
754; ISEL-NEXT:    addi 4, 4, .LCPI45_1@toc@l
755; ISEL-NEXT:    iselgt 3, 4, 3
756; ISEL-NEXT:    lfd 1, 0(3)
757; ISEL-NEXT:    blr
758;
759; NO_ISEL-LABEL: sel_constants_fmul_constant:
760; NO_ISEL:       # %bb.0:
761; NO_ISEL-NEXT:    andi. 3, 3, 1
762; NO_ISEL-NEXT:    bc 12, 1, .LBB45_2
763; NO_ISEL-NEXT:  # %bb.1:
764; NO_ISEL-NEXT:    addis 3, 2, .LCPI45_0@toc@ha
765; NO_ISEL-NEXT:    addi 3, 3, .LCPI45_0@toc@l
766; NO_ISEL-NEXT:    lfd 1, 0(3)
767; NO_ISEL-NEXT:    blr
768; NO_ISEL-NEXT:  .LBB45_2:
769; NO_ISEL-NEXT:    addis 3, 2, .LCPI45_1@toc@ha
770; NO_ISEL-NEXT:    addi 3, 3, .LCPI45_1@toc@l
771; NO_ISEL-NEXT:    lfd 1, 0(3)
772; NO_ISEL-NEXT:    blr
773  %sel = select i1 %cond, double -4.0, double 23.3
774  %bo = fmul double %sel, 5.1
775  ret double %bo
776}
777
778define double @sel_constants_fdiv_constant(i1 %cond) {
779; ISEL-LABEL: sel_constants_fdiv_constant:
780; ISEL:       # %bb.0:
781; ISEL-NEXT:    andi. 3, 3, 1
782; ISEL-NEXT:    addis 3, 2, .LCPI46_0@toc@ha
783; ISEL-NEXT:    addis 4, 2, .LCPI46_1@toc@ha
784; ISEL-NEXT:    addi 3, 3, .LCPI46_0@toc@l
785; ISEL-NEXT:    addi 4, 4, .LCPI46_1@toc@l
786; ISEL-NEXT:    iselgt 3, 4, 3
787; ISEL-NEXT:    lfd 1, 0(3)
788; ISEL-NEXT:    blr
789;
790; NO_ISEL-LABEL: sel_constants_fdiv_constant:
791; NO_ISEL:       # %bb.0:
792; NO_ISEL-NEXT:    andi. 3, 3, 1
793; NO_ISEL-NEXT:    bc 12, 1, .LBB46_2
794; NO_ISEL-NEXT:  # %bb.1:
795; NO_ISEL-NEXT:    addis 3, 2, .LCPI46_0@toc@ha
796; NO_ISEL-NEXT:    addi 3, 3, .LCPI46_0@toc@l
797; NO_ISEL-NEXT:    lfd 1, 0(3)
798; NO_ISEL-NEXT:    blr
799; NO_ISEL-NEXT:  .LBB46_2:
800; NO_ISEL-NEXT:    addis 3, 2, .LCPI46_1@toc@ha
801; NO_ISEL-NEXT:    addi 3, 3, .LCPI46_1@toc@l
802; NO_ISEL-NEXT:    lfd 1, 0(3)
803; NO_ISEL-NEXT:    blr
804  %sel = select i1 %cond, double -4.0, double 23.3
805  %bo = fdiv double %sel, 5.1
806  ret double %bo
807}
808
809define double @fdiv_constant_sel_constants(i1 %cond) {
810; ISEL-LABEL: fdiv_constant_sel_constants:
811; ISEL:       # %bb.0:
812; ISEL-NEXT:    andi. 3, 3, 1
813; ISEL-NEXT:    addis 3, 2, .LCPI47_0@toc@ha
814; ISEL-NEXT:    addis 4, 2, .LCPI47_1@toc@ha
815; ISEL-NEXT:    addi 3, 3, .LCPI47_0@toc@l
816; ISEL-NEXT:    addi 4, 4, .LCPI47_1@toc@l
817; ISEL-NEXT:    iselgt 3, 4, 3
818; ISEL-NEXT:    lfd 1, 0(3)
819; ISEL-NEXT:    blr
820;
821; NO_ISEL-LABEL: fdiv_constant_sel_constants:
822; NO_ISEL:       # %bb.0:
823; NO_ISEL-NEXT:    andi. 3, 3, 1
824; NO_ISEL-NEXT:    bc 12, 1, .LBB47_2
825; NO_ISEL-NEXT:  # %bb.1:
826; NO_ISEL-NEXT:    addis 3, 2, .LCPI47_0@toc@ha
827; NO_ISEL-NEXT:    addi 3, 3, .LCPI47_0@toc@l
828; NO_ISEL-NEXT:    lfd 1, 0(3)
829; NO_ISEL-NEXT:    blr
830; NO_ISEL-NEXT:  .LBB47_2:
831; NO_ISEL-NEXT:    addis 3, 2, .LCPI47_1@toc@ha
832; NO_ISEL-NEXT:    addi 3, 3, .LCPI47_1@toc@l
833; NO_ISEL-NEXT:    lfd 1, 0(3)
834; NO_ISEL-NEXT:    blr
835  %sel = select i1 %cond, double -4.0, double 23.3
836  %bo = fdiv double 5.1, %sel
837  ret double %bo
838}
839
840define double @sel_constants_frem_constant(i1 %cond) {
841; ALL-LABEL: sel_constants_frem_constant:
842; ALL:       # %bb.0:
843; ALL-NEXT:    andi. 3, 3, 1
844; ALL-NEXT:    bc 12, 1, .LBB48_2
845; ALL-NEXT:  # %bb.1:
846; ALL-NEXT:    addis 3, 2, .LCPI48_0@toc@ha
847; ALL-NEXT:    lfd 1, .LCPI48_0@toc@l(3)
848; ALL-NEXT:    blr
849; ALL-NEXT:  .LBB48_2:
850; ALL-NEXT:    vspltisw 2, -4
851; ALL-NEXT:    xvcvsxwdp 1, 34
852; ALL-NEXT:    blr
853  %sel = select i1 %cond, double -4.0, double 23.3
854  %bo = frem double %sel, 5.1
855  ret double %bo
856}
857
858define double @frem_constant_sel_constants(i1 %cond) {
859; ISEL-LABEL: frem_constant_sel_constants:
860; ISEL:       # %bb.0:
861; ISEL-NEXT:    andi. 3, 3, 1
862; ISEL-NEXT:    addis 3, 2, .LCPI49_0@toc@ha
863; ISEL-NEXT:    addis 4, 2, .LCPI49_1@toc@ha
864; ISEL-NEXT:    addi 3, 3, .LCPI49_0@toc@l
865; ISEL-NEXT:    addi 4, 4, .LCPI49_1@toc@l
866; ISEL-NEXT:    iselgt 3, 4, 3
867; ISEL-NEXT:    lfd 1, 0(3)
868; ISEL-NEXT:    blr
869;
870; NO_ISEL-LABEL: frem_constant_sel_constants:
871; NO_ISEL:       # %bb.0:
872; NO_ISEL-NEXT:    andi. 3, 3, 1
873; NO_ISEL-NEXT:    bc 12, 1, .LBB49_2
874; NO_ISEL-NEXT:  # %bb.1:
875; NO_ISEL-NEXT:    addis 3, 2, .LCPI49_0@toc@ha
876; NO_ISEL-NEXT:    addi 3, 3, .LCPI49_0@toc@l
877; NO_ISEL-NEXT:    lfd 1, 0(3)
878; NO_ISEL-NEXT:    blr
879; NO_ISEL-NEXT:  .LBB49_2:
880; NO_ISEL-NEXT:    addis 3, 2, .LCPI49_1@toc@ha
881; NO_ISEL-NEXT:    addi 3, 3, .LCPI49_1@toc@l
882; NO_ISEL-NEXT:    lfd 1, 0(3)
883; NO_ISEL-NEXT:    blr
884  %sel = select i1 %cond, double -4.0, double 23.3
885  %bo = frem double 5.1, %sel
886  ret double %bo
887}
888