blob: 09cc1063ffd8f05fac02fb850dca57e27b1ce123 [file] [log] [blame]
Sanjay Patela97d36f2017-03-31 18:51:03 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -verify-machineinstrs -mtriple=powerpc64le-unknown-unknown | FileCheck %s
3
4define zeroext i1 @all_bits_clear(i32 %P, i32 %Q) {
5; CHECK-LABEL: all_bits_clear:
6; CHECK: # BB#0:
7; CHECK-NEXT: or 3, 3, 4
8; CHECK-NEXT: cntlzw 3, 3
9; CHECK-NEXT: rlwinm 3, 3, 27, 31, 31
10; CHECK-NEXT: blr
11 %a = icmp eq i32 %P, 0
12 %b = icmp eq i32 %Q, 0
13 %c = and i1 %a, %b
14 ret i1 %c
15}
16
17define zeroext i1 @all_sign_bits_clear(i32 %P, i32 %Q) {
18; CHECK-LABEL: all_sign_bits_clear:
19; CHECK: # BB#0:
20; CHECK-NEXT: or 3, 3, 4
21; CHECK-NEXT: nor 3, 3, 3
22; CHECK-NEXT: srwi 3, 3, 31
23; CHECK-NEXT: blr
24 %a = icmp sgt i32 %P, -1
25 %b = icmp sgt i32 %Q, -1
26 %c = and i1 %a, %b
27 ret i1 %c
28}
29
30define zeroext i1 @all_bits_set(i32 %P, i32 %Q) {
31; CHECK-LABEL: all_bits_set:
32; CHECK: # BB#0:
33; CHECK-NEXT: and 3, 3, 4
34; CHECK-NEXT: li 5, 0
35; CHECK-NEXT: li 12, 1
36; CHECK-NEXT: cmpwi 0, 3, -1
37; CHECK-NEXT: isel 3, 12, 5, 2
38; CHECK-NEXT: blr
39 %a = icmp eq i32 %P, -1
40 %b = icmp eq i32 %Q, -1
41 %c = and i1 %a, %b
42 ret i1 %c
43}
44
45define zeroext i1 @all_sign_bits_set(i32 %P, i32 %Q) {
46; CHECK-LABEL: all_sign_bits_set:
47; CHECK: # BB#0:
Sanjay Patel34da36e2017-03-31 20:28:06 +000048; CHECK-NEXT: and 3, 3, 4
49; CHECK-NEXT: srwi 3, 3, 31
Sanjay Patela97d36f2017-03-31 18:51:03 +000050; CHECK-NEXT: blr
51 %a = icmp slt i32 %P, 0
52 %b = icmp slt i32 %Q, 0
53 %c = and i1 %a, %b
54 ret i1 %c
55}
56
57define zeroext i1 @any_bits_set(i32 %P, i32 %Q) {
58; CHECK-LABEL: any_bits_set:
59; CHECK: # BB#0:
60; CHECK-NEXT: or 3, 3, 4
61; CHECK-NEXT: cntlzw 3, 3
62; CHECK-NEXT: nor 3, 3, 3
63; CHECK-NEXT: rlwinm 3, 3, 27, 31, 31
64; CHECK-NEXT: blr
65 %a = icmp ne i32 %P, 0
66 %b = icmp ne i32 %Q, 0
67 %c = or i1 %a, %b
68 ret i1 %c
69}
70
71define zeroext i1 @any_sign_bits_set(i32 %P, i32 %Q) {
72; CHECK-LABEL: any_sign_bits_set:
73; CHECK: # BB#0:
74; CHECK-NEXT: or 3, 3, 4
75; CHECK-NEXT: srwi 3, 3, 31
76; CHECK-NEXT: blr
77 %a = icmp slt i32 %P, 0
78 %b = icmp slt i32 %Q, 0
79 %c = or i1 %a, %b
80 ret i1 %c
81}
82
83define zeroext i1 @any_bits_clear(i32 %P, i32 %Q) {
84; CHECK-LABEL: any_bits_clear:
85; CHECK: # BB#0:
86; CHECK-NEXT: and 3, 3, 4
87; CHECK-NEXT: li 5, 1
88; CHECK-NEXT: cmpwi 0, 3, -1
89; CHECK-NEXT: isel 3, 0, 5, 2
90; CHECK-NEXT: blr
91 %a = icmp ne i32 %P, -1
92 %b = icmp ne i32 %Q, -1
93 %c = or i1 %a, %b
94 ret i1 %c
95}
96
97define zeroext i1 @any_sign_bits_clear(i32 %P, i32 %Q) {
98; CHECK-LABEL: any_sign_bits_clear:
99; CHECK: # BB#0:
100; CHECK-NEXT: and 3, 3, 4
101; CHECK-NEXT: nor 3, 3, 3
102; CHECK-NEXT: srwi 3, 3, 31
103; CHECK-NEXT: blr
104 %a = icmp sgt i32 %P, -1
105 %b = icmp sgt i32 %Q, -1
106 %c = or i1 %a, %b
107 ret i1 %c
108}
109
110; PR3351 - (P == 0) & (Q == 0) -> (P|Q) == 0
111define i32 @all_bits_clear_branch(i32* %P, i32* %Q) {
112; CHECK-LABEL: all_bits_clear_branch:
113; CHECK: # BB#0: # %entry
114; CHECK-NEXT: or. 3, 3, 4
115; CHECK-NEXT: bne 0, .LBB8_2
116; CHECK-NEXT: # BB#1: # %bb1
117; CHECK-NEXT: li 3, 4
118; CHECK-NEXT: blr
119; CHECK-NEXT: .LBB8_2: # %return
120; CHECK-NEXT: li 3, 192
121; CHECK-NEXT: blr
122entry:
123 %a = icmp eq i32* %P, null
124 %b = icmp eq i32* %Q, null
125 %c = and i1 %a, %b
126 br i1 %c, label %bb1, label %return
127
128bb1:
129 ret i32 4
130
131return:
132 ret i32 192
133}
134
135define i32 @all_sign_bits_clear_branch(i32 %P, i32 %Q) {
136; CHECK-LABEL: all_sign_bits_clear_branch:
137; CHECK: # BB#0: # %entry
138; CHECK-NEXT: or 3, 3, 4
139; CHECK-NEXT: cmpwi 0, 3, 0
140; CHECK-NEXT: blt 0, .LBB9_2
141; CHECK-NEXT: # BB#1: # %bb1
142; CHECK-NEXT: li 3, 4
143; CHECK-NEXT: blr
144; CHECK-NEXT: .LBB9_2: # %return
145; CHECK-NEXT: li 3, 192
146; CHECK-NEXT: blr
147entry:
148 %a = icmp sgt i32 %P, -1
149 %b = icmp sgt i32 %Q, -1
150 %c = and i1 %a, %b
151 br i1 %c, label %bb1, label %return
152
153bb1:
154 ret i32 4
155
156return:
157 ret i32 192
158}
159
160define i32 @all_bits_set_branch(i32 %P, i32 %Q) {
161; CHECK-LABEL: all_bits_set_branch:
162; CHECK: # BB#0: # %entry
163; CHECK-NEXT: and 3, 3, 4
164; CHECK-NEXT: cmpwi 0, 3, -1
165; CHECK-NEXT: bne 0, .LBB10_2
166; CHECK-NEXT: # BB#1: # %bb1
167; CHECK-NEXT: li 3, 4
168; CHECK-NEXT: blr
169; CHECK-NEXT: .LBB10_2: # %return
170; CHECK-NEXT: li 3, 192
171; CHECK-NEXT: blr
172entry:
173 %a = icmp eq i32 %P, -1
174 %b = icmp eq i32 %Q, -1
175 %c = and i1 %a, %b
176 br i1 %c, label %bb1, label %return
177
178bb1:
179 ret i32 4
180
181return:
182 ret i32 192
183}
184
185define i32 @all_sign_bits_set_branch(i32 %P, i32 %Q) {
186; CHECK-LABEL: all_sign_bits_set_branch:
187; CHECK: # BB#0: # %entry
Sanjay Patel34da36e2017-03-31 20:28:06 +0000188; CHECK-NEXT: and 3, 3, 4
189; CHECK-NEXT: cmpwi 0, 3, -1
190; CHECK-NEXT: bgt 0, .LBB11_2
Sanjay Patela97d36f2017-03-31 18:51:03 +0000191; CHECK-NEXT: # BB#1: # %bb1
192; CHECK-NEXT: li 3, 4
193; CHECK-NEXT: blr
194; CHECK-NEXT: .LBB11_2: # %return
195; CHECK-NEXT: li 3, 192
196; CHECK-NEXT: blr
197entry:
198 %a = icmp slt i32 %P, 0
199 %b = icmp slt i32 %Q, 0
200 %c = and i1 %a, %b
201 br i1 %c, label %bb1, label %return
202
203bb1:
204 ret i32 4
205
206return:
207 ret i32 192
208}
209
210; PR3351 - (P != 0) | (Q != 0) -> (P|Q) != 0
211define i32 @any_bits_set_branch(i32* %P, i32* %Q) {
212; CHECK-LABEL: any_bits_set_branch:
213; CHECK: # BB#0: # %entry
214; CHECK-NEXT: or. 3, 3, 4
215; CHECK-NEXT: beq 0, .LBB12_2
216; CHECK-NEXT: # BB#1: # %bb1
217; CHECK-NEXT: li 3, 4
218; CHECK-NEXT: blr
219; CHECK-NEXT: .LBB12_2: # %return
220; CHECK-NEXT: li 3, 192
221; CHECK-NEXT: blr
222entry:
223 %a = icmp ne i32* %P, null
224 %b = icmp ne i32* %Q, null
225 %c = or i1 %a, %b
226 br i1 %c, label %bb1, label %return
227
228bb1:
229 ret i32 4
230
231return:
232 ret i32 192
233}
234
235define i32 @any_sign_bits_set_branch(i32 %P, i32 %Q) {
236; CHECK-LABEL: any_sign_bits_set_branch:
237; CHECK: # BB#0: # %entry
238; CHECK-NEXT: or 3, 3, 4
239; CHECK-NEXT: cmpwi 0, 3, -1
240; CHECK-NEXT: bgt 0, .LBB13_2
241; CHECK-NEXT: # BB#1: # %bb1
242; CHECK-NEXT: li 3, 4
243; CHECK-NEXT: blr
244; CHECK-NEXT: .LBB13_2: # %return
245; CHECK-NEXT: li 3, 192
246; CHECK-NEXT: blr
247entry:
248 %a = icmp slt i32 %P, 0
249 %b = icmp slt i32 %Q, 0
250 %c = or i1 %a, %b
251 br i1 %c, label %bb1, label %return
252
253bb1:
254 ret i32 4
255
256return:
257 ret i32 192
258}
259
260define i32 @any_bits_clear_branch(i32 %P, i32 %Q) {
261; CHECK-LABEL: any_bits_clear_branch:
262; CHECK: # BB#0: # %entry
263; CHECK-NEXT: and 3, 3, 4
264; CHECK-NEXT: cmpwi 0, 3, -1
265; CHECK-NEXT: beq 0, .LBB14_2
266; CHECK-NEXT: # BB#1: # %bb1
267; CHECK-NEXT: li 3, 4
268; CHECK-NEXT: blr
269; CHECK-NEXT: .LBB14_2: # %return
270; CHECK-NEXT: li 3, 192
271; CHECK-NEXT: blr
272entry:
273 %a = icmp ne i32 %P, -1
274 %b = icmp ne i32 %Q, -1
275 %c = or i1 %a, %b
276 br i1 %c, label %bb1, label %return
277
278bb1:
279 ret i32 4
280
281return:
282 ret i32 192
283}
284
285define i32 @any_sign_bits_clear_branch(i32 %P, i32 %Q) {
286; CHECK-LABEL: any_sign_bits_clear_branch:
287; CHECK: # BB#0: # %entry
288; CHECK-NEXT: and 3, 3, 4
289; CHECK-NEXT: cmpwi 0, 3, 0
290; CHECK-NEXT: blt 0, .LBB15_2
291; CHECK-NEXT: # BB#1: # %bb1
292; CHECK-NEXT: li 3, 4
293; CHECK-NEXT: blr
294; CHECK-NEXT: .LBB15_2: # %return
295; CHECK-NEXT: li 3, 192
296; CHECK-NEXT: blr
297entry:
298 %a = icmp sgt i32 %P, -1
299 %b = icmp sgt i32 %Q, -1
300 %c = or i1 %a, %b
301 br i1 %c, label %bb1, label %return
302
303bb1:
304 ret i32 4
305
306return:
307 ret i32 192
308}
309
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000310define <4 x i1> @all_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) {
311; CHECK-LABEL: all_bits_clear_vec:
312; CHECK: # BB#0:
313; CHECK-NEXT: xxlxor 36, 36, 36
Sanjay Patel665021e2017-04-01 15:05:54 +0000314; CHECK-NEXT: xxlor 34, 34, 35
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000315; CHECK-NEXT: vcmpequw 2, 2, 4
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000316; CHECK-NEXT: blr
317 %a = icmp eq <4 x i32> %P, zeroinitializer
318 %b = icmp eq <4 x i32> %Q, zeroinitializer
319 %c = and <4 x i1> %a, %b
320 ret <4 x i1> %c
321}
322
323define <4 x i1> @all_sign_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) {
324; CHECK-LABEL: all_sign_bits_clear_vec:
325; CHECK: # BB#0:
326; CHECK-NEXT: vspltisb 4, -1
Sanjay Patel665021e2017-04-01 15:05:54 +0000327; CHECK-NEXT: xxlor 34, 34, 35
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000328; CHECK-NEXT: vcmpgtsw 2, 2, 4
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000329; CHECK-NEXT: blr
330 %a = icmp sgt <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>
331 %b = icmp sgt <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>
332 %c = and <4 x i1> %a, %b
333 ret <4 x i1> %c
334}
335
336define <4 x i1> @all_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) {
337; CHECK-LABEL: all_bits_set_vec:
338; CHECK: # BB#0:
339; CHECK-NEXT: vspltisb 4, -1
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000340; CHECK-NEXT: xxland 34, 34, 35
Sanjay Patel665021e2017-04-01 15:05:54 +0000341; CHECK-NEXT: vcmpequw 2, 2, 4
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000342; CHECK-NEXT: blr
343 %a = icmp eq <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>
344 %b = icmp eq <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>
345 %c = and <4 x i1> %a, %b
346 ret <4 x i1> %c
347}
348
349define <4 x i1> @all_sign_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) {
350; CHECK-LABEL: all_sign_bits_set_vec:
351; CHECK: # BB#0:
352; CHECK-NEXT: xxlxor 36, 36, 36
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000353; CHECK-NEXT: xxland 34, 34, 35
Sanjay Patel665021e2017-04-01 15:05:54 +0000354; CHECK-NEXT: vcmpgtsw 2, 4, 2
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000355; CHECK-NEXT: blr
356 %a = icmp slt <4 x i32> %P, zeroinitializer
357 %b = icmp slt <4 x i32> %Q, zeroinitializer
358 %c = and <4 x i1> %a, %b
359 ret <4 x i1> %c
360}
361
362define <4 x i1> @any_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) {
363; CHECK-LABEL: any_bits_set_vec:
364; CHECK: # BB#0:
365; CHECK-NEXT: xxlxor 36, 36, 36
Sanjay Patel665021e2017-04-01 15:05:54 +0000366; CHECK-NEXT: xxlor 34, 34, 35
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000367; CHECK-NEXT: vcmpequw 2, 2, 4
Sanjay Patel665021e2017-04-01 15:05:54 +0000368; CHECK-NEXT: xxlnor 34, 34, 34
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000369; CHECK-NEXT: blr
370 %a = icmp ne <4 x i32> %P, zeroinitializer
371 %b = icmp ne <4 x i32> %Q, zeroinitializer
372 %c = or <4 x i1> %a, %b
373 ret <4 x i1> %c
374}
375
376define <4 x i1> @any_sign_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) {
377; CHECK-LABEL: any_sign_bits_set_vec:
378; CHECK: # BB#0:
379; CHECK-NEXT: xxlxor 36, 36, 36
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000380; CHECK-NEXT: xxlor 34, 34, 35
Sanjay Patel665021e2017-04-01 15:05:54 +0000381; CHECK-NEXT: vcmpgtsw 2, 4, 2
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000382; CHECK-NEXT: blr
383 %a = icmp slt <4 x i32> %P, zeroinitializer
384 %b = icmp slt <4 x i32> %Q, zeroinitializer
385 %c = or <4 x i1> %a, %b
386 ret <4 x i1> %c
387}
388
389define <4 x i1> @any_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) {
390; CHECK-LABEL: any_bits_clear_vec:
391; CHECK: # BB#0:
392; CHECK-NEXT: vspltisb 4, -1
Sanjay Patel665021e2017-04-01 15:05:54 +0000393; CHECK-NEXT: xxland 34, 34, 35
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000394; CHECK-NEXT: vcmpequw 2, 2, 4
Sanjay Patel665021e2017-04-01 15:05:54 +0000395; CHECK-NEXT: xxlnor 34, 34, 34
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000396; CHECK-NEXT: blr
397 %a = icmp ne <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>
398 %b = icmp ne <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>
399 %c = or <4 x i1> %a, %b
400 ret <4 x i1> %c
401}
402
403define <4 x i1> @any_sign_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) {
404; CHECK-LABEL: any_sign_bits_clear_vec:
405; CHECK: # BB#0:
406; CHECK-NEXT: vspltisb 4, -1
Sanjay Patel665021e2017-04-01 15:05:54 +0000407; CHECK-NEXT: xxland 34, 34, 35
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000408; CHECK-NEXT: vcmpgtsw 2, 2, 4
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000409; CHECK-NEXT: blr
410 %a = icmp sgt <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>
411 %b = icmp sgt <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>
412 %c = or <4 x i1> %a, %b
413 ret <4 x i1> %c
414}
415
Sanjay Patela4546ef2017-04-03 22:45:46 +0000416define zeroext i1 @ne_neg1_and_ne_zero(i64 %x) {
417; CHECK-LABEL: ne_neg1_and_ne_zero:
418; CHECK: # BB#0:
419; CHECK-NEXT: addi 3, 3, 1
420; CHECK-NEXT: li 4, 0
421; CHECK-NEXT: li 12, 1
422; CHECK-NEXT: cmpldi 3, 1
423; CHECK-NEXT: isel 3, 12, 4, 1
424; CHECK-NEXT: blr
425 %cmp1 = icmp ne i64 %x, -1
426 %cmp2 = icmp ne i64 %x, 0
427 %and = and i1 %cmp1, %cmp2
428 ret i1 %and
429}
430
431; PR32401 - https://bugs.llvm.org/show_bug.cgi?id=32401
432
433define zeroext i1 @and_eq(i16 zeroext %a, i16 zeroext %b, i16 zeroext %c, i16 zeroext %d) {
434; CHECK-LABEL: and_eq:
435; CHECK: # BB#0:
436; CHECK-NEXT: cmpw 0, 3, 4
437; CHECK-NEXT: cmpw 1, 5, 6
438; CHECK-NEXT: li 3, 1
439; CHECK-NEXT: crnand 20, 2, 6
440; CHECK-NEXT: isel 3, 0, 3, 20
441; CHECK-NEXT: blr
442 %cmp1 = icmp eq i16 %a, %b
443 %cmp2 = icmp eq i16 %c, %d
444 %and = and i1 %cmp1, %cmp2
445 ret i1 %and
446}
447
448define zeroext i1 @or_ne(i32 %a, i32 %b, i32 %c, i32 %d) {
449; CHECK-LABEL: or_ne:
450; CHECK: # BB#0:
451; CHECK-NEXT: cmpw 0, 3, 4
452; CHECK-NEXT: cmpw 1, 5, 6
453; CHECK-NEXT: li 3, 1
454; CHECK-NEXT: crand 20, 6, 2
455; CHECK-NEXT: isel 3, 0, 3, 20
456; CHECK-NEXT: blr
457 %cmp1 = icmp ne i32 %a, %b
458 %cmp2 = icmp ne i32 %c, %d
459 %or = or i1 %cmp1, %cmp2
460 ret i1 %or
461}
462
463; This should not be transformed because vector compares + bitwise logic are faster.
464
465define <4 x i1> @and_eq_vec(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {
466; CHECK-LABEL: and_eq_vec:
467; CHECK: # BB#0:
468; CHECK-NEXT: vcmpequw 2, 2, 3
469; CHECK-NEXT: vcmpequw 19, 4, 5
470; CHECK-NEXT: xxland 34, 34, 51
471; CHECK-NEXT: blr
472 %cmp1 = icmp eq <4 x i32> %a, %b
473 %cmp2 = icmp eq <4 x i32> %c, %d
474 %and = and <4 x i1> %cmp1, %cmp2
475 ret <4 x i1> %and
476}
477