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; ISEL-LABEL: select_0_or_neg1:
71; ISEL:       # BB#0:
72; ISEL-NEXT:    li 4, 0
73; ISEL-NEXT:    andi. 3, 3, 1
74; ISEL-NEXT:    oris 3, 4, 65535
75; ISEL-NEXT:    ori 3, 3, 65535
76; ISEL-NEXT:    isel 3, 0, 3, 1
77; ISEL-NEXT:    blr
78;
79; NO_ISEL-LABEL: select_0_or_neg1:
80; NO_ISEL:       # BB#0:
81; NO_ISEL-NEXT:    li 4, 0
82; NO_ISEL-NEXT:    andi. 3, 3, 1
83; NO_ISEL-NEXT:    oris 3, 4, 65535
84; NO_ISEL-NEXT:    ori 3, 3, 65535
85; NO_ISEL-NEXT:    bc 12, 1, .LBB6_1
86; NO_ISEL-NEXT:    blr
87; NO_ISEL-NEXT:  .LBB6_1:
88; NO_ISEL-NEXT:    addi 3, 0, 0
89; NO_ISEL-NEXT:    blr
90  %sel = select i1 %cond, i32 0, i32 -1
91  ret i32 %sel
92}
93
94define i32 @select_0_or_neg1_zeroext(i1 zeroext %cond) {
95; ISEL-LABEL: select_0_or_neg1_zeroext:
96; ISEL:       # BB#0:
97; ISEL-NEXT:    li 4, 0
98; ISEL-NEXT:    andi. 3, 3, 1
99; ISEL-NEXT:    oris 3, 4, 65535
100; ISEL-NEXT:    ori 3, 3, 65535
101; ISEL-NEXT:    isel 3, 0, 3, 1
102; ISEL-NEXT:    blr
103;
104; NO_ISEL-LABEL: select_0_or_neg1_zeroext:
105; NO_ISEL:       # BB#0:
106; NO_ISEL-NEXT:    li 4, 0
107; NO_ISEL-NEXT:    andi. 3, 3, 1
108; NO_ISEL-NEXT:    oris 3, 4, 65535
109; NO_ISEL-NEXT:    ori 3, 3, 65535
110; NO_ISEL-NEXT:    bc 12, 1, .LBB7_1
111; NO_ISEL-NEXT:    blr
112; NO_ISEL-NEXT:  .LBB7_1:
113; NO_ISEL-NEXT:    addi 3, 0, 0
114; NO_ISEL-NEXT:    blr
115  %sel = select i1 %cond, i32 0, i32 -1
116  ret i32 %sel
117}
118
119define i32 @select_0_or_neg1_signext(i1 signext %cond) {
120; ISEL-LABEL: select_0_or_neg1_signext:
121; ISEL:       # BB#0:
122; ISEL-NEXT:    li 4, 0
123; ISEL-NEXT:    andi. 3, 3, 1
124; ISEL-NEXT:    oris 3, 4, 65535
125; ISEL-NEXT:    ori 3, 3, 65535
126; ISEL-NEXT:    isel 3, 0, 3, 1
127; ISEL-NEXT:    blr
128;
129; NO_ISEL-LABEL: select_0_or_neg1_signext:
130; NO_ISEL:       # BB#0:
131; NO_ISEL-NEXT:    li 4, 0
132; NO_ISEL-NEXT:    andi. 3, 3, 1
133; NO_ISEL-NEXT:    oris 3, 4, 65535
134; NO_ISEL-NEXT:    ori 3, 3, 65535
135; NO_ISEL-NEXT:    bc 12, 1, .LBB8_1
136; NO_ISEL-NEXT:    blr
137; NO_ISEL-NEXT:  .LBB8_1:
138; NO_ISEL-NEXT:    addi 3, 0, 0
139; NO_ISEL-NEXT:    blr
140  %sel = select i1 %cond, i32 0, i32 -1
141  ret i32 %sel
142}
143
144; select Cond, -1, 0 --> sext (Cond)
145
146define i32 @select_neg1_or_0(i1 %cond) {
147; ISEL-LABEL: select_neg1_or_0:
148; ISEL:       # BB#0:
149; ISEL-NEXT:    li 4, 0
150; ISEL-NEXT:    andi. 3, 3, 1
151; ISEL-NEXT:    oris 3, 4, 65535
152; ISEL-NEXT:    ori 3, 3, 65535
153; ISEL-NEXT:    isel 3, 3, 4, 1
154; ISEL-NEXT:    blr
155;
156; NO_ISEL-LABEL: select_neg1_or_0:
157; NO_ISEL:       # BB#0:
158; NO_ISEL-NEXT:    li 4, 0
159; NO_ISEL-NEXT:    andi. 3, 3, 1
160; NO_ISEL-NEXT:    oris 3, 4, 65535
161; NO_ISEL-NEXT:    ori 3, 3, 65535
162; NO_ISEL-NEXT:    bclr 12, 1, 0
163; NO_ISEL-NEXT:  # BB#1:
164; NO_ISEL-NEXT:    ori 3, 4, 0
165; NO_ISEL-NEXT:    blr
166  %sel = select i1 %cond, i32 -1, i32 0
167  ret i32 %sel
168}
169
170define i32 @select_neg1_or_0_zeroext(i1 zeroext %cond) {
171; ISEL-LABEL: select_neg1_or_0_zeroext:
172; ISEL:       # BB#0:
173; ISEL-NEXT:    li 4, 0
174; ISEL-NEXT:    andi. 3, 3, 1
175; ISEL-NEXT:    oris 3, 4, 65535
176; ISEL-NEXT:    ori 3, 3, 65535
177; ISEL-NEXT:    isel 3, 3, 4, 1
178; ISEL-NEXT:    blr
179;
180; NO_ISEL-LABEL: select_neg1_or_0_zeroext:
181; NO_ISEL:       # BB#0:
182; NO_ISEL-NEXT:    li 4, 0
183; NO_ISEL-NEXT:    andi. 3, 3, 1
184; NO_ISEL-NEXT:    oris 3, 4, 65535
185; NO_ISEL-NEXT:    ori 3, 3, 65535
186; NO_ISEL-NEXT:    bclr 12, 1, 0
187; NO_ISEL-NEXT:  # BB#1:
188; NO_ISEL-NEXT:    ori 3, 4, 0
189; NO_ISEL-NEXT:    blr
190  %sel = select i1 %cond, i32 -1, i32 0
191  ret i32 %sel
192}
193
194define i32 @select_neg1_or_0_signext(i1 signext %cond) {
195; ISEL-LABEL: select_neg1_or_0_signext:
196; ISEL:       # BB#0:
197; ISEL-NEXT:    li 4, 0
198; ISEL-NEXT:    andi. 3, 3, 1
199; ISEL-NEXT:    oris 3, 4, 65535
200; ISEL-NEXT:    ori 3, 3, 65535
201; ISEL-NEXT:    isel 3, 3, 4, 1
202; ISEL-NEXT:    blr
203;
204; NO_ISEL-LABEL: select_neg1_or_0_signext:
205; NO_ISEL:       # BB#0:
206; NO_ISEL-NEXT:    li 4, 0
207; NO_ISEL-NEXT:    andi. 3, 3, 1
208; NO_ISEL-NEXT:    oris 3, 4, 65535
209; NO_ISEL-NEXT:    ori 3, 3, 65535
210; NO_ISEL-NEXT:    bclr 12, 1, 0
211; NO_ISEL-NEXT:  # BB#1:
212; NO_ISEL-NEXT:    ori 3, 4, 0
213; NO_ISEL-NEXT:    blr
214  %sel = select i1 %cond, i32 -1, i32 0
215  ret i32 %sel
216}
217
218; select Cond, C+1, C --> add (zext Cond), C
219
220define i32 @select_Cplus1_C(i1 %cond) {
221; ISEL-LABEL: select_Cplus1_C:
222; ISEL:       # BB#0:
223; ISEL-NEXT:    andi. 3, 3, 1
224; ISEL-NEXT:    li 4, 42
225; ISEL-NEXT:    li 3, 41
226; ISEL-NEXT:    isel 3, 4, 3, 1
227; ISEL-NEXT:    blr
228;
229; NO_ISEL-LABEL: select_Cplus1_C:
230; NO_ISEL:       # BB#0:
231; NO_ISEL-NEXT:    andi. 3, 3, 1
232; NO_ISEL-NEXT:    li 4, 42
233; NO_ISEL-NEXT:    li 3, 41
234; NO_ISEL-NEXT:    bc 12, 1, .LBB12_1
235; NO_ISEL-NEXT:    blr
236; NO_ISEL-NEXT:  .LBB12_1:
237; NO_ISEL-NEXT:    addi 3, 4, 0
238; NO_ISEL-NEXT:    blr
239  %sel = select i1 %cond, i32 42, i32 41
240  ret i32 %sel
241}
242
243define i32 @select_Cplus1_C_zeroext(i1 zeroext %cond) {
244; ISEL-LABEL: select_Cplus1_C_zeroext:
245; ISEL:       # BB#0:
246; ISEL-NEXT:    andi. 3, 3, 1
247; ISEL-NEXT:    li 4, 42
248; ISEL-NEXT:    li 3, 41
249; ISEL-NEXT:    isel 3, 4, 3, 1
250; ISEL-NEXT:    blr
251;
252; NO_ISEL-LABEL: select_Cplus1_C_zeroext:
253; NO_ISEL:       # BB#0:
254; NO_ISEL-NEXT:    andi. 3, 3, 1
255; NO_ISEL-NEXT:    li 4, 42
256; NO_ISEL-NEXT:    li 3, 41
257; NO_ISEL-NEXT:    bc 12, 1, .LBB13_1
258; NO_ISEL-NEXT:    blr
259; NO_ISEL-NEXT:  .LBB13_1:
260; NO_ISEL-NEXT:    addi 3, 4, 0
261; NO_ISEL-NEXT:    blr
262  %sel = select i1 %cond, i32 42, i32 41
263  ret i32 %sel
264}
265
266define i32 @select_Cplus1_C_signext(i1 signext %cond) {
267; ISEL-LABEL: select_Cplus1_C_signext:
268; ISEL:       # BB#0:
269; ISEL-NEXT:    andi. 3, 3, 1
270; ISEL-NEXT:    li 4, 42
271; ISEL-NEXT:    li 3, 41
272; ISEL-NEXT:    isel 3, 4, 3, 1
273; ISEL-NEXT:    blr
274;
275; NO_ISEL-LABEL: select_Cplus1_C_signext:
276; NO_ISEL:       # BB#0:
277; NO_ISEL-NEXT:    andi. 3, 3, 1
278; NO_ISEL-NEXT:    li 4, 42
279; NO_ISEL-NEXT:    li 3, 41
280; NO_ISEL-NEXT:    bc 12, 1, .LBB14_1
281; NO_ISEL-NEXT:    blr
282; NO_ISEL-NEXT:  .LBB14_1:
283; NO_ISEL-NEXT:    addi 3, 4, 0
284; NO_ISEL-NEXT:    blr
285  %sel = select i1 %cond, i32 42, i32 41
286  ret i32 %sel
287}
288
289; select Cond, C, C+1 --> add (sext Cond), C
290
291define i32 @select_C_Cplus1(i1 %cond) {
292; ISEL-LABEL: select_C_Cplus1:
293; ISEL:       # BB#0:
294; ISEL-NEXT:    andi. 3, 3, 1
295; ISEL-NEXT:    li 4, 41
296; ISEL-NEXT:    li 3, 42
297; ISEL-NEXT:    isel 3, 4, 3, 1
298; ISEL-NEXT:    blr
299;
300; NO_ISEL-LABEL: select_C_Cplus1:
301; NO_ISEL:       # BB#0:
302; NO_ISEL-NEXT:    andi. 3, 3, 1
303; NO_ISEL-NEXT:    li 4, 41
304; NO_ISEL-NEXT:    li 3, 42
305; NO_ISEL-NEXT:    bc 12, 1, .LBB15_1
306; NO_ISEL-NEXT:    blr
307; NO_ISEL-NEXT:  .LBB15_1:
308; NO_ISEL-NEXT:    addi 3, 4, 0
309; NO_ISEL-NEXT:    blr
310  %sel = select i1 %cond, i32 41, i32 42
311  ret i32 %sel
312}
313
314define i32 @select_C_Cplus1_zeroext(i1 zeroext %cond) {
315; ISEL-LABEL: select_C_Cplus1_zeroext:
316; ISEL:       # BB#0:
317; ISEL-NEXT:    andi. 3, 3, 1
318; ISEL-NEXT:    li 4, 41
319; ISEL-NEXT:    li 3, 42
320; ISEL-NEXT:    isel 3, 4, 3, 1
321; ISEL-NEXT:    blr
322;
323; NO_ISEL-LABEL: select_C_Cplus1_zeroext:
324; NO_ISEL:       # BB#0:
325; NO_ISEL-NEXT:    andi. 3, 3, 1
326; NO_ISEL-NEXT:    li 4, 41
327; NO_ISEL-NEXT:    li 3, 42
328; NO_ISEL-NEXT:    bc 12, 1, .LBB16_1
329; NO_ISEL-NEXT:    blr
330; NO_ISEL-NEXT:  .LBB16_1:
331; NO_ISEL-NEXT:    addi 3, 4, 0
332; NO_ISEL-NEXT:    blr
333  %sel = select i1 %cond, i32 41, i32 42
334  ret i32 %sel
335}
336
337define i32 @select_C_Cplus1_signext(i1 signext %cond) {
338; ISEL-LABEL: select_C_Cplus1_signext:
339; ISEL:       # BB#0:
340; ISEL-NEXT:    andi. 3, 3, 1
341; ISEL-NEXT:    li 4, 41
342; ISEL-NEXT:    li 3, 42
343; ISEL-NEXT:    isel 3, 4, 3, 1
344; ISEL-NEXT:    blr
345;
346; NO_ISEL-LABEL: select_C_Cplus1_signext:
347; NO_ISEL:       # BB#0:
348; NO_ISEL-NEXT:    andi. 3, 3, 1
349; NO_ISEL-NEXT:    li 4, 41
350; NO_ISEL-NEXT:    li 3, 42
351; NO_ISEL-NEXT:    bc 12, 1, .LBB17_1
352; NO_ISEL-NEXT:    blr
353; NO_ISEL-NEXT:  .LBB17_1:
354; NO_ISEL-NEXT:    addi 3, 4, 0
355; NO_ISEL-NEXT:    blr
356  %sel = select i1 %cond, i32 41, i32 42
357  ret i32 %sel
358}
359
360; In general, select of 2 constants could be:
361; select Cond, C1, C2 --> add (mul (zext Cond), C1-C2), C2 --> add (and (sext Cond), C1-C2), C2
362
363define i32 @select_C1_C2(i1 %cond) {
364; ISEL-LABEL: select_C1_C2:
365; ISEL:       # BB#0:
366; ISEL-NEXT:    andi. 3, 3, 1
367; ISEL-NEXT:    li 4, 421
368; ISEL-NEXT:    li 3, 42
369; ISEL-NEXT:    isel 3, 4, 3, 1
370; ISEL-NEXT:    blr
371;
372; NO_ISEL-LABEL: select_C1_C2:
373; NO_ISEL:       # BB#0:
374; NO_ISEL-NEXT:    andi. 3, 3, 1
375; NO_ISEL-NEXT:    li 4, 421
376; NO_ISEL-NEXT:    li 3, 42
377; NO_ISEL-NEXT:    bc 12, 1, .LBB18_1
378; NO_ISEL-NEXT:    blr
379; NO_ISEL-NEXT:  .LBB18_1:
380; NO_ISEL-NEXT:    addi 3, 4, 0
381; NO_ISEL-NEXT:    blr
382  %sel = select i1 %cond, i32 421, i32 42
383  ret i32 %sel
384}
385
386define i32 @select_C1_C2_zeroext(i1 zeroext %cond) {
387; ISEL-LABEL: select_C1_C2_zeroext:
388; ISEL:       # BB#0:
389; ISEL-NEXT:    andi. 3, 3, 1
390; ISEL-NEXT:    li 4, 421
391; ISEL-NEXT:    li 3, 42
392; ISEL-NEXT:    isel 3, 4, 3, 1
393; ISEL-NEXT:    blr
394;
395; NO_ISEL-LABEL: select_C1_C2_zeroext:
396; NO_ISEL:       # BB#0:
397; NO_ISEL-NEXT:    andi. 3, 3, 1
398; NO_ISEL-NEXT:    li 4, 421
399; NO_ISEL-NEXT:    li 3, 42
400; NO_ISEL-NEXT:    bc 12, 1, .LBB19_1
401; NO_ISEL-NEXT:    blr
402; NO_ISEL-NEXT:  .LBB19_1:
403; NO_ISEL-NEXT:    addi 3, 4, 0
404; NO_ISEL-NEXT:    blr
405  %sel = select i1 %cond, i32 421, i32 42
406  ret i32 %sel
407}
408
409define i32 @select_C1_C2_signext(i1 signext %cond) {
410; ISEL-LABEL: select_C1_C2_signext:
411; ISEL:       # BB#0:
412; ISEL-NEXT:    andi. 3, 3, 1
413; ISEL-NEXT:    li 4, 421
414; ISEL-NEXT:    li 3, 42
415; ISEL-NEXT:    isel 3, 4, 3, 1
416; ISEL-NEXT:    blr
417;
418; NO_ISEL-LABEL: select_C1_C2_signext:
419; NO_ISEL:       # BB#0:
420; NO_ISEL-NEXT:    andi. 3, 3, 1
421; NO_ISEL-NEXT:    li 4, 421
422; NO_ISEL-NEXT:    li 3, 42
423; NO_ISEL-NEXT:    bc 12, 1, .LBB20_1
424; NO_ISEL-NEXT:    blr
425; NO_ISEL-NEXT:  .LBB20_1:
426; NO_ISEL-NEXT:    addi 3, 4, 0
427; NO_ISEL-NEXT:    blr
428  %sel = select i1 %cond, i32 421, i32 42
429  ret i32 %sel
430}
431
432; A binary operator with constant after the select should always get folded into the select.
433
434define i8 @sel_constants_add_constant(i1 %cond) {
435; ISEL-LABEL: sel_constants_add_constant:
436; ISEL:       # BB#0:
437; ISEL-NEXT:    andi. 3, 3, 1
438; ISEL-NEXT:    li 4, 1
439; ISEL-NEXT:    li 3, 28
440; ISEL-NEXT:    isel 3, 4, 3, 1
441; ISEL-NEXT:    blr
442;
443; NO_ISEL-LABEL: sel_constants_add_constant:
444; NO_ISEL:       # BB#0:
445; NO_ISEL-NEXT:    andi. 3, 3, 1
446; NO_ISEL-NEXT:    li 4, 1
447; NO_ISEL-NEXT:    li 3, 28
448; NO_ISEL-NEXT:    bc 12, 1, .LBB21_1
449; NO_ISEL-NEXT:    blr
450; NO_ISEL-NEXT:  .LBB21_1:
451; NO_ISEL-NEXT:    addi 3, 4, 0
452; NO_ISEL-NEXT:    blr
453  %sel = select i1 %cond, i8 -4, i8 23
454  %bo = add i8 %sel, 5
455  ret i8 %bo
456}
457
458define i8 @sel_constants_sub_constant(i1 %cond) {
459; ISEL-LABEL: sel_constants_sub_constant:
460; ISEL:       # BB#0:
461; ISEL-NEXT:    li 4, 0
462; ISEL-NEXT:    andi. 3, 3, 1
463; ISEL-NEXT:    oris 3, 4, 65535
464; ISEL-NEXT:    li 4, 18
465; ISEL-NEXT:    ori 3, 3, 65527
466; ISEL-NEXT:    isel 3, 3, 4, 1
467; ISEL-NEXT:    blr
468;
469; NO_ISEL-LABEL: sel_constants_sub_constant:
470; NO_ISEL:       # BB#0:
471; NO_ISEL-NEXT:    li 4, 0
472; NO_ISEL-NEXT:    andi. 3, 3, 1
473; NO_ISEL-NEXT:    oris 3, 4, 65535
474; NO_ISEL-NEXT:    li 4, 18
475; NO_ISEL-NEXT:    ori 3, 3, 65527
476; NO_ISEL-NEXT:    bclr 12, 1, 0
477; NO_ISEL-NEXT:  # BB#1:
478; NO_ISEL-NEXT:    ori 3, 4, 0
479; NO_ISEL-NEXT:    blr
480  %sel = select i1 %cond, i8 -4, i8 23
481  %bo = sub i8 %sel, 5
482  ret i8 %bo
483}
484
485define i8 @sel_constants_mul_constant(i1 %cond) {
486; ISEL-LABEL: sel_constants_mul_constant:
487; ISEL:       # BB#0:
488; ISEL-NEXT:    lis 4, 16383
489; ISEL-NEXT:    andi. 3, 3, 1
490; ISEL-NEXT:    ori 3, 4, 65531
491; ISEL-NEXT:    li 4, 115
492; ISEL-NEXT:    sldi 3, 3, 2
493; ISEL-NEXT:    isel 3, 3, 4, 1
494; ISEL-NEXT:    blr
495;
496; NO_ISEL-LABEL: sel_constants_mul_constant:
497; NO_ISEL:       # BB#0:
498; NO_ISEL-NEXT:    lis 4, 16383
499; NO_ISEL-NEXT:    andi. 3, 3, 1
500; NO_ISEL-NEXT:    ori 3, 4, 65531
501; NO_ISEL-NEXT:    li 4, 115
502; NO_ISEL-NEXT:    sldi 3, 3, 2
503; NO_ISEL-NEXT:    bclr 12, 1, 0
504; NO_ISEL-NEXT:  # BB#1:
505; NO_ISEL-NEXT:    ori 3, 4, 0
506; NO_ISEL-NEXT:    blr
507  %sel = select i1 %cond, i8 -4, i8 23
508  %bo = mul i8 %sel, 5
509  ret i8 %bo
510}
511
512define i8 @sel_constants_sdiv_constant(i1 %cond) {
513; ISEL-LABEL: sel_constants_sdiv_constant:
514; ISEL:       # BB#0:
515; ISEL-NEXT:    andi. 3, 3, 1
516; ISEL-NEXT:    li 3, 4
517; ISEL-NEXT:    isel 3, 0, 3, 1
518; ISEL-NEXT:    blr
519;
520; NO_ISEL-LABEL: sel_constants_sdiv_constant:
521; NO_ISEL:       # BB#0:
522; NO_ISEL-NEXT:    andi. 3, 3, 1
523; NO_ISEL-NEXT:    li 3, 4
524; NO_ISEL-NEXT:    bc 12, 1, .LBB24_1
525; NO_ISEL-NEXT:    blr
526; NO_ISEL-NEXT:  .LBB24_1:
527; NO_ISEL-NEXT:    addi 3, 0, 0
528; NO_ISEL-NEXT:    blr
529  %sel = select i1 %cond, i8 -4, i8 23
530  %bo = sdiv i8 %sel, 5
531  ret i8 %bo
532}
533
534define i8 @sel_constants_udiv_constant(i1 %cond) {
535; ISEL-LABEL: sel_constants_udiv_constant:
536; ISEL:       # BB#0:
537; ISEL-NEXT:    andi. 3, 3, 1
538; ISEL-NEXT:    li 4, 50
539; ISEL-NEXT:    li 3, 4
540; ISEL-NEXT:    isel 3, 4, 3, 1
541; ISEL-NEXT:    blr
542;
543; NO_ISEL-LABEL: sel_constants_udiv_constant:
544; NO_ISEL:       # BB#0:
545; NO_ISEL-NEXT:    andi. 3, 3, 1
546; NO_ISEL-NEXT:    li 4, 50
547; NO_ISEL-NEXT:    li 3, 4
548; NO_ISEL-NEXT:    bc 12, 1, .LBB25_1
549; NO_ISEL-NEXT:    blr
550; NO_ISEL-NEXT:  .LBB25_1:
551; NO_ISEL-NEXT:    addi 3, 4, 0
552; NO_ISEL-NEXT:    blr
553  %sel = select i1 %cond, i8 -4, i8 23
554  %bo = udiv i8 %sel, 5
555  ret i8 %bo
556}
557
558define i8 @sel_constants_srem_constant(i1 %cond) {
559; ISEL-LABEL: sel_constants_srem_constant:
560; ISEL:       # BB#0:
561; ISEL-NEXT:    lis 4, 16383
562; ISEL-NEXT:    andi. 3, 3, 1
563; ISEL-NEXT:    ori 3, 4, 65535
564; ISEL-NEXT:    li 4, 3
565; ISEL-NEXT:    sldi 3, 3, 2
566; ISEL-NEXT:    isel 3, 3, 4, 1
567; ISEL-NEXT:    blr
568;
569; NO_ISEL-LABEL: sel_constants_srem_constant:
570; NO_ISEL:       # BB#0:
571; NO_ISEL-NEXT:    lis 4, 16383
572; NO_ISEL-NEXT:    andi. 3, 3, 1
573; NO_ISEL-NEXT:    ori 3, 4, 65535
574; NO_ISEL-NEXT:    li 4, 3
575; NO_ISEL-NEXT:    sldi 3, 3, 2
576; NO_ISEL-NEXT:    bclr 12, 1, 0
577; NO_ISEL-NEXT:  # BB#1:
578; NO_ISEL-NEXT:    ori 3, 4, 0
579; NO_ISEL-NEXT:    blr
580  %sel = select i1 %cond, i8 -4, i8 23
581  %bo = srem i8 %sel, 5
582  ret i8 %bo
583}
584
585define i8 @sel_constants_urem_constant(i1 %cond) {
586; ISEL-LABEL: sel_constants_urem_constant:
587; ISEL:       # BB#0:
588; ISEL-NEXT:    andi. 3, 3, 1
589; ISEL-NEXT:    li 4, 2
590; ISEL-NEXT:    li 3, 3
591; ISEL-NEXT:    isel 3, 4, 3, 1
592; ISEL-NEXT:    blr
593;
594; NO_ISEL-LABEL: sel_constants_urem_constant:
595; NO_ISEL:       # BB#0:
596; NO_ISEL-NEXT:    andi. 3, 3, 1
597; NO_ISEL-NEXT:    li 4, 2
598; NO_ISEL-NEXT:    li 3, 3
599; NO_ISEL-NEXT:    bc 12, 1, .LBB27_1
600; NO_ISEL-NEXT:    blr
601; NO_ISEL-NEXT:  .LBB27_1:
602; NO_ISEL-NEXT:    addi 3, 4, 0
603; NO_ISEL-NEXT:    blr
604  %sel = select i1 %cond, i8 -4, i8 23
605  %bo = urem i8 %sel, 5
606  ret i8 %bo
607}
608
609define i8 @sel_constants_and_constant(i1 %cond) {
610; ISEL-LABEL: sel_constants_and_constant:
611; ISEL:       # BB#0:
612; ISEL-NEXT:    andi. 3, 3, 1
613; ISEL-NEXT:    li 4, 4
614; ISEL-NEXT:    li 3, 5
615; ISEL-NEXT:    isel 3, 4, 3, 1
616; ISEL-NEXT:    blr
617;
618; NO_ISEL-LABEL: sel_constants_and_constant:
619; NO_ISEL:       # BB#0:
620; NO_ISEL-NEXT:    andi. 3, 3, 1
621; NO_ISEL-NEXT:    li 4, 4
622; NO_ISEL-NEXT:    li 3, 5
623; NO_ISEL-NEXT:    bc 12, 1, .LBB28_1
624; NO_ISEL-NEXT:    blr
625; NO_ISEL-NEXT:  .LBB28_1:
626; NO_ISEL-NEXT:    addi 3, 4, 0
627; NO_ISEL-NEXT:    blr
628  %sel = select i1 %cond, i8 -4, i8 23
629  %bo = and i8 %sel, 5
630  ret i8 %bo
631}
632
633define i8 @sel_constants_or_constant(i1 %cond) {
634; ISEL-LABEL: sel_constants_or_constant:
635; ISEL:       # BB#0:
636; ISEL-NEXT:    li 4, 0
637; ISEL-NEXT:    andi. 3, 3, 1
638; ISEL-NEXT:    oris 3, 4, 65535
639; ISEL-NEXT:    li 4, 23
640; ISEL-NEXT:    ori 3, 3, 65533
641; ISEL-NEXT:    isel 3, 3, 4, 1
642; ISEL-NEXT:    blr
643;
644; NO_ISEL-LABEL: sel_constants_or_constant:
645; NO_ISEL:       # BB#0:
646; NO_ISEL-NEXT:    li 4, 0
647; NO_ISEL-NEXT:    andi. 3, 3, 1
648; NO_ISEL-NEXT:    oris 3, 4, 65535
649; NO_ISEL-NEXT:    li 4, 23
650; NO_ISEL-NEXT:    ori 3, 3, 65533
651; NO_ISEL-NEXT:    bclr 12, 1, 0
652; NO_ISEL-NEXT:  # BB#1:
653; NO_ISEL-NEXT:    ori 3, 4, 0
654; NO_ISEL-NEXT:    blr
655  %sel = select i1 %cond, i8 -4, i8 23
656  %bo = or i8 %sel, 5
657  ret i8 %bo
658}
659
660define i8 @sel_constants_xor_constant(i1 %cond) {
661; ISEL-LABEL: sel_constants_xor_constant:
662; ISEL:       # BB#0:
663; ISEL-NEXT:    li 4, 0
664; ISEL-NEXT:    andi. 3, 3, 1
665; ISEL-NEXT:    oris 3, 4, 65535
666; ISEL-NEXT:    li 4, 18
667; ISEL-NEXT:    ori 3, 3, 65529
668; ISEL-NEXT:    isel 3, 3, 4, 1
669; ISEL-NEXT:    blr
670;
671; NO_ISEL-LABEL: sel_constants_xor_constant:
672; NO_ISEL:       # BB#0:
673; NO_ISEL-NEXT:    li 4, 0
674; NO_ISEL-NEXT:    andi. 3, 3, 1
675; NO_ISEL-NEXT:    oris 3, 4, 65535
676; NO_ISEL-NEXT:    li 4, 18
677; NO_ISEL-NEXT:    ori 3, 3, 65529
678; NO_ISEL-NEXT:    bclr 12, 1, 0
679; NO_ISEL-NEXT:  # BB#1:
680; NO_ISEL-NEXT:    ori 3, 4, 0
681; NO_ISEL-NEXT:    blr
682  %sel = select i1 %cond, i8 -4, i8 23
683  %bo = xor i8 %sel, 5
684  ret i8 %bo
685}
686
687define i8 @sel_constants_shl_constant(i1 %cond) {
688; ISEL-LABEL: sel_constants_shl_constant:
689; ISEL:       # BB#0:
690; ISEL-NEXT:    lis 5, 511
691; ISEL-NEXT:    lis 4, 2047
692; ISEL-NEXT:    andi. 3, 3, 1
693; ISEL-NEXT:    ori 3, 4, 65535
694; ISEL-NEXT:    ori 12, 5, 65535
695; ISEL-NEXT:    sldi 3, 3, 5
696; ISEL-NEXT:    sldi 4, 12, 7
697; ISEL-NEXT:    isel 3, 4, 3, 1
698; ISEL-NEXT:    blr
699;
700; NO_ISEL-LABEL: sel_constants_shl_constant:
701; NO_ISEL:       # BB#0:
702; NO_ISEL-NEXT:    lis 5, 511
703; NO_ISEL-NEXT:    lis 4, 2047
704; NO_ISEL-NEXT:    andi. 3, 3, 1
705; NO_ISEL-NEXT:    ori 3, 4, 65535
706; NO_ISEL-NEXT:    ori 12, 5, 65535
707; NO_ISEL-NEXT:    sldi 3, 3, 5
708; NO_ISEL-NEXT:    sldi 4, 12, 7
709; NO_ISEL-NEXT:    bc 12, 1, .LBB31_1
710; NO_ISEL-NEXT:    blr
711; NO_ISEL-NEXT:  .LBB31_1:
712; NO_ISEL-NEXT:    addi 3, 4, 0
713; NO_ISEL-NEXT:    blr
714  %sel = select i1 %cond, i8 -4, i8 23
715  %bo = shl i8 %sel, 5
716  ret i8 %bo
717}
718
719define i8 @sel_constants_lshr_constant(i1 %cond) {
720; ISEL-LABEL: sel_constants_lshr_constant:
721; ISEL:       # BB#0:
722; ISEL-NEXT:    andi. 3, 3, 1
723; ISEL-NEXT:    li 4, 7
724; ISEL-NEXT:    li 3, 0
725; ISEL-NEXT:    isel 3, 4, 3, 1
726; ISEL-NEXT:    blr
727;
728; NO_ISEL-LABEL: sel_constants_lshr_constant:
729; NO_ISEL:       # BB#0:
730; NO_ISEL-NEXT:    andi. 3, 3, 1
731; NO_ISEL-NEXT:    li 4, 7
732; NO_ISEL-NEXT:    li 3, 0
733; NO_ISEL-NEXT:    bc 12, 1, .LBB32_1
734; NO_ISEL-NEXT:    blr
735; NO_ISEL-NEXT:  .LBB32_1:
736; NO_ISEL-NEXT:    addi 3, 4, 0
737; NO_ISEL-NEXT:    blr
738  %sel = select i1 %cond, i8 -4, i8 23
739  %bo = lshr i8 %sel, 5
740  ret i8 %bo
741}
742
743define i8 @sel_constants_ashr_constant(i1 %cond) {
744; ALL-LABEL: sel_constants_ashr_constant:
745; ALL:       # BB#0:
746; ALL-NEXT:    clrldi 3, 3, 63
747; ALL-NEXT:    neg 3, 3
748; ALL-NEXT:    blr
749  %sel = select i1 %cond, i8 -4, i8 23
750  %bo = ashr i8 %sel, 5
751  ret i8 %bo
752}
753
754define double @sel_constants_fadd_constant(i1 %cond) {
755; ISEL-LABEL: sel_constants_fadd_constant:
756; ISEL:       # BB#0:
757; ISEL-NEXT:    andi. 3, 3, 1
758; ISEL-NEXT:    addis 4, 2, .LCPI34_0@toc@ha
759; ISEL-NEXT:    addis 3, 2, .LCPI34_1@toc@ha
760; ISEL-NEXT:    addi 4, 4, .LCPI34_0@toc@l
761; ISEL-NEXT:    addi 3, 3, .LCPI34_1@toc@l
762; ISEL-NEXT:    isel 3, 3, 4, 1
763; ISEL-NEXT:    lxsdx 1, 0, 3
764; ISEL-NEXT:    blr
765;
766; NO_ISEL-LABEL: sel_constants_fadd_constant:
767; NO_ISEL:       # BB#0:
768; NO_ISEL-NEXT:    andi. 3, 3, 1
769; NO_ISEL-NEXT:    addis 4, 2, .LCPI34_0@toc@ha
770; NO_ISEL-NEXT:    addis 3, 2, .LCPI34_1@toc@ha
771; NO_ISEL-NEXT:    addi 4, 4, .LCPI34_0@toc@l
772; NO_ISEL-NEXT:    addi 3, 3, .LCPI34_1@toc@l
773; NO_ISEL-NEXT:    bc 12, 1, .LBB34_2
774; NO_ISEL-NEXT:  # BB#1:
775; NO_ISEL-NEXT:    ori 3, 4, 0
776; NO_ISEL-NEXT:    b .LBB34_2
777; NO_ISEL-NEXT:  .LBB34_2:
778; NO_ISEL-NEXT:    lxsdx 1, 0, 3
779; NO_ISEL-NEXT:    blr
780  %sel = select i1 %cond, double -4.0, double 23.3
781  %bo = fadd double %sel, 5.1
782  ret double %bo
783}
784
785define double @sel_constants_fsub_constant(i1 %cond) {
786; ISEL-LABEL: sel_constants_fsub_constant:
787; ISEL:       # BB#0:
788; ISEL-NEXT:    andi. 3, 3, 1
789; ISEL-NEXT:    addis 4, 2, .LCPI35_0@toc@ha
790; ISEL-NEXT:    addis 3, 2, .LCPI35_1@toc@ha
791; ISEL-NEXT:    addi 4, 4, .LCPI35_0@toc@l
792; ISEL-NEXT:    addi 3, 3, .LCPI35_1@toc@l
793; ISEL-NEXT:    isel 3, 3, 4, 1
794; ISEL-NEXT:    lxsdx 1, 0, 3
795; ISEL-NEXT:    blr
796;
797; NO_ISEL-LABEL: sel_constants_fsub_constant:
798; NO_ISEL:       # BB#0:
799; NO_ISEL-NEXT:    andi. 3, 3, 1
800; NO_ISEL-NEXT:    addis 4, 2, .LCPI35_0@toc@ha
801; NO_ISEL-NEXT:    addis 3, 2, .LCPI35_1@toc@ha
802; NO_ISEL-NEXT:    addi 4, 4, .LCPI35_0@toc@l
803; NO_ISEL-NEXT:    addi 3, 3, .LCPI35_1@toc@l
804; NO_ISEL-NEXT:    bc 12, 1, .LBB35_2
805; NO_ISEL-NEXT:  # BB#1:
806; NO_ISEL-NEXT:    ori 3, 4, 0
807; NO_ISEL-NEXT:    b .LBB35_2
808; NO_ISEL-NEXT:  .LBB35_2:
809; NO_ISEL-NEXT:    lxsdx 1, 0, 3
810; NO_ISEL-NEXT:    blr
811  %sel = select i1 %cond, double -4.0, double 23.3
812  %bo = fsub double %sel, 5.1
813  ret double %bo
814}
815
816define double @sel_constants_fmul_constant(i1 %cond) {
817; ISEL-LABEL: sel_constants_fmul_constant:
818; ISEL:       # BB#0:
819; ISEL-NEXT:    andi. 3, 3, 1
820; ISEL-NEXT:    addis 4, 2, .LCPI36_0@toc@ha
821; ISEL-NEXT:    addis 3, 2, .LCPI36_1@toc@ha
822; ISEL-NEXT:    addi 4, 4, .LCPI36_0@toc@l
823; ISEL-NEXT:    addi 3, 3, .LCPI36_1@toc@l
824; ISEL-NEXT:    isel 3, 3, 4, 1
825; ISEL-NEXT:    lxsdx 1, 0, 3
826; ISEL-NEXT:    blr
827;
828; NO_ISEL-LABEL: sel_constants_fmul_constant:
829; NO_ISEL:       # BB#0:
830; NO_ISEL-NEXT:    andi. 3, 3, 1
831; NO_ISEL-NEXT:    addis 4, 2, .LCPI36_0@toc@ha
832; NO_ISEL-NEXT:    addis 3, 2, .LCPI36_1@toc@ha
833; NO_ISEL-NEXT:    addi 4, 4, .LCPI36_0@toc@l
834; NO_ISEL-NEXT:    addi 3, 3, .LCPI36_1@toc@l
835; NO_ISEL-NEXT:    bc 12, 1, .LBB36_2
836; NO_ISEL-NEXT:  # BB#1:
837; NO_ISEL-NEXT:    ori 3, 4, 0
838; NO_ISEL-NEXT:    b .LBB36_2
839; NO_ISEL-NEXT:  .LBB36_2:
840; NO_ISEL-NEXT:    lxsdx 1, 0, 3
841; NO_ISEL-NEXT:    blr
842  %sel = select i1 %cond, double -4.0, double 23.3
843  %bo = fmul double %sel, 5.1
844  ret double %bo
845}
846
847define double @sel_constants_fdiv_constant(i1 %cond) {
848; ISEL-LABEL: sel_constants_fdiv_constant:
849; ISEL:       # BB#0:
850; ISEL-NEXT:    andi. 3, 3, 1
851; ISEL-NEXT:    addis 4, 2, .LCPI37_0@toc@ha
852; ISEL-NEXT:    addis 3, 2, .LCPI37_1@toc@ha
853; ISEL-NEXT:    addi 4, 4, .LCPI37_0@toc@l
854; ISEL-NEXT:    addi 3, 3, .LCPI37_1@toc@l
855; ISEL-NEXT:    isel 3, 3, 4, 1
856; ISEL-NEXT:    lxsdx 1, 0, 3
857; ISEL-NEXT:    blr
858;
859; NO_ISEL-LABEL: sel_constants_fdiv_constant:
860; NO_ISEL:       # BB#0:
861; NO_ISEL-NEXT:    andi. 3, 3, 1
862; NO_ISEL-NEXT:    addis 4, 2, .LCPI37_0@toc@ha
863; NO_ISEL-NEXT:    addis 3, 2, .LCPI37_1@toc@ha
864; NO_ISEL-NEXT:    addi 4, 4, .LCPI37_0@toc@l
865; NO_ISEL-NEXT:    addi 3, 3, .LCPI37_1@toc@l
866; NO_ISEL-NEXT:    bc 12, 1, .LBB37_2
867; NO_ISEL-NEXT:  # BB#1:
868; NO_ISEL-NEXT:    ori 3, 4, 0
869; NO_ISEL-NEXT:    b .LBB37_2
870; NO_ISEL-NEXT:  .LBB37_2:
871; NO_ISEL-NEXT:    lxsdx 1, 0, 3
872; NO_ISEL-NEXT:    blr
873  %sel = select i1 %cond, double -4.0, double 23.3
874  %bo = fdiv double %sel, 5.1
875  ret double %bo
876}
877
878define double @sel_constants_frem_constant(i1 %cond) {
879; ALL-LABEL: sel_constants_frem_constant:
880; ALL:       # BB#0:
881; ALL-NEXT:    andi. 3, 3, 1
882; ALL-NEXT:    bc 12, 1, .LBB38_2
883; ALL-NEXT:  # BB#1:
884; ALL-NEXT:    addis 3, 2, .LCPI38_0@toc@ha
885; ALL-NEXT:    addi 3, 3, .LCPI38_0@toc@l
886; ALL-NEXT:    lxsdx 1, 0, 3
887; ALL-NEXT:    blr
888; ALL-NEXT:  .LBB38_2:
889; ALL-NEXT:    addis 3, 2, .LCPI38_1@toc@ha
890; ALL-NEXT:    addi 3, 3, .LCPI38_1@toc@l
891; ALL-NEXT:    lxsspx 1, 0, 3
892; ALL-NEXT:    blr
893  %sel = select i1 %cond, double -4.0, double 23.3
894  %bo = frem double %sel, 5.1
895  ret double %bo
896}
897
898