blob: be5171d3b7e7dcafed857d7885e722bc1bc53b3c [file] [log] [blame]
Nemanja Ivanovice22ebea2017-09-26 20:42:47 +00001; XFAIL: *
Sanjay Patela97d36f2017-03-31 18:51:03 +00002; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
3; RUN: llc < %s -verify-machineinstrs -mtriple=powerpc64le-unknown-unknown | FileCheck %s
4
5define zeroext i1 @all_bits_clear(i32 %P, i32 %Q) {
6; CHECK-LABEL: all_bits_clear:
7; CHECK: # BB#0:
8; CHECK-NEXT: or 3, 3, 4
9; CHECK-NEXT: cntlzw 3, 3
Nemanja Ivanovic96c3d622017-05-11 16:54:23 +000010; CHECK-NEXT: srwi 3, 3, 5
Sanjay Patela97d36f2017-03-31 18:51:03 +000011; CHECK-NEXT: blr
12 %a = icmp eq i32 %P, 0
13 %b = icmp eq i32 %Q, 0
14 %c = and i1 %a, %b
15 ret i1 %c
16}
17
18define zeroext i1 @all_sign_bits_clear(i32 %P, i32 %Q) {
19; CHECK-LABEL: all_sign_bits_clear:
20; CHECK: # BB#0:
21; CHECK-NEXT: or 3, 3, 4
22; CHECK-NEXT: nor 3, 3, 3
23; CHECK-NEXT: srwi 3, 3, 31
24; CHECK-NEXT: blr
25 %a = icmp sgt i32 %P, -1
26 %b = icmp sgt i32 %Q, -1
27 %c = and i1 %a, %b
28 ret i1 %c
29}
30
31define zeroext i1 @all_bits_set(i32 %P, i32 %Q) {
32; CHECK-LABEL: all_bits_set:
33; CHECK: # BB#0:
Nemanja Ivanovic96c3d622017-05-11 16:54:23 +000034; CHECK-NEXT: li 5, -1
Sanjay Patela97d36f2017-03-31 18:51:03 +000035; CHECK-NEXT: and 3, 3, 4
Nemanja Ivanovic96c3d622017-05-11 16:54:23 +000036; CHECK-NEXT: xor 3, 3, 5
37; CHECK-NEXT: cntlzw 3, 3
38; CHECK-NEXT: srwi 3, 3, 5
Sanjay Patela97d36f2017-03-31 18:51:03 +000039; CHECK-NEXT: blr
40 %a = icmp eq i32 %P, -1
41 %b = icmp eq i32 %Q, -1
42 %c = and i1 %a, %b
43 ret i1 %c
44}
45
46define zeroext i1 @all_sign_bits_set(i32 %P, i32 %Q) {
47; CHECK-LABEL: all_sign_bits_set:
48; CHECK: # BB#0:
Sanjay Patel34da36e2017-03-31 20:28:06 +000049; CHECK-NEXT: and 3, 3, 4
50; CHECK-NEXT: srwi 3, 3, 31
Sanjay Patela97d36f2017-03-31 18:51:03 +000051; CHECK-NEXT: blr
52 %a = icmp slt i32 %P, 0
53 %b = icmp slt i32 %Q, 0
54 %c = and i1 %a, %b
55 ret i1 %c
56}
57
58define zeroext i1 @any_bits_set(i32 %P, i32 %Q) {
59; CHECK-LABEL: any_bits_set:
60; CHECK: # BB#0:
61; CHECK-NEXT: or 3, 3, 4
62; CHECK-NEXT: cntlzw 3, 3
Nemanja Ivanovicbb67f842017-06-07 12:23:41 +000063; CHECK-NEXT: srwi 3, 3, 5
64; CHECK-NEXT: xori 3, 3, 1
Sanjay Patela97d36f2017-03-31 18:51:03 +000065; CHECK-NEXT: blr
66 %a = icmp ne i32 %P, 0
67 %b = icmp ne i32 %Q, 0
68 %c = or i1 %a, %b
69 ret i1 %c
70}
71
72define zeroext i1 @any_sign_bits_set(i32 %P, i32 %Q) {
73; CHECK-LABEL: any_sign_bits_set:
74; CHECK: # BB#0:
75; CHECK-NEXT: or 3, 3, 4
76; CHECK-NEXT: srwi 3, 3, 31
77; CHECK-NEXT: blr
78 %a = icmp slt i32 %P, 0
79 %b = icmp slt i32 %Q, 0
80 %c = or i1 %a, %b
81 ret i1 %c
82}
83
84define zeroext i1 @any_bits_clear(i32 %P, i32 %Q) {
85; CHECK-LABEL: any_bits_clear:
86; CHECK: # BB#0:
Nemanja Ivanovicbb67f842017-06-07 12:23:41 +000087; CHECK-NEXT: li 5, -1
Sanjay Patela97d36f2017-03-31 18:51:03 +000088; CHECK-NEXT: and 3, 3, 4
Nemanja Ivanovicbb67f842017-06-07 12:23:41 +000089; CHECK-NEXT: xor 3, 3, 5
90; CHECK-NEXT: cntlzw 3, 3
91; CHECK-NEXT: srwi 3, 3, 5
92; CHECK-NEXT: xori 3, 3, 1
Sanjay Patela97d36f2017-03-31 18:51:03 +000093; CHECK-NEXT: blr
94 %a = icmp ne i32 %P, -1
95 %b = icmp ne i32 %Q, -1
96 %c = or i1 %a, %b
97 ret i1 %c
98}
99
100define zeroext i1 @any_sign_bits_clear(i32 %P, i32 %Q) {
101; CHECK-LABEL: any_sign_bits_clear:
102; CHECK: # BB#0:
103; CHECK-NEXT: and 3, 3, 4
104; CHECK-NEXT: nor 3, 3, 3
105; CHECK-NEXT: srwi 3, 3, 31
106; CHECK-NEXT: blr
107 %a = icmp sgt i32 %P, -1
108 %b = icmp sgt i32 %Q, -1
109 %c = or i1 %a, %b
110 ret i1 %c
111}
112
113; PR3351 - (P == 0) & (Q == 0) -> (P|Q) == 0
114define i32 @all_bits_clear_branch(i32* %P, i32* %Q) {
115; CHECK-LABEL: all_bits_clear_branch:
116; CHECK: # BB#0: # %entry
117; CHECK-NEXT: or. 3, 3, 4
118; CHECK-NEXT: bne 0, .LBB8_2
119; CHECK-NEXT: # BB#1: # %bb1
120; CHECK-NEXT: li 3, 4
121; CHECK-NEXT: blr
122; CHECK-NEXT: .LBB8_2: # %return
123; CHECK-NEXT: li 3, 192
124; CHECK-NEXT: blr
125entry:
126 %a = icmp eq i32* %P, null
127 %b = icmp eq i32* %Q, null
128 %c = and i1 %a, %b
129 br i1 %c, label %bb1, label %return
130
131bb1:
132 ret i32 4
133
134return:
135 ret i32 192
136}
137
138define i32 @all_sign_bits_clear_branch(i32 %P, i32 %Q) {
139; CHECK-LABEL: all_sign_bits_clear_branch:
140; CHECK: # BB#0: # %entry
141; CHECK-NEXT: or 3, 3, 4
142; CHECK-NEXT: cmpwi 0, 3, 0
143; CHECK-NEXT: blt 0, .LBB9_2
144; CHECK-NEXT: # BB#1: # %bb1
145; CHECK-NEXT: li 3, 4
146; CHECK-NEXT: blr
147; CHECK-NEXT: .LBB9_2: # %return
148; CHECK-NEXT: li 3, 192
149; CHECK-NEXT: blr
150entry:
151 %a = icmp sgt i32 %P, -1
152 %b = icmp sgt i32 %Q, -1
153 %c = and i1 %a, %b
154 br i1 %c, label %bb1, label %return
155
156bb1:
157 ret i32 4
158
159return:
160 ret i32 192
161}
162
163define i32 @all_bits_set_branch(i32 %P, i32 %Q) {
164; CHECK-LABEL: all_bits_set_branch:
165; CHECK: # BB#0: # %entry
166; CHECK-NEXT: and 3, 3, 4
167; CHECK-NEXT: cmpwi 0, 3, -1
168; CHECK-NEXT: bne 0, .LBB10_2
169; CHECK-NEXT: # BB#1: # %bb1
170; CHECK-NEXT: li 3, 4
171; CHECK-NEXT: blr
172; CHECK-NEXT: .LBB10_2: # %return
173; CHECK-NEXT: li 3, 192
174; CHECK-NEXT: blr
175entry:
176 %a = icmp eq i32 %P, -1
177 %b = icmp eq i32 %Q, -1
178 %c = and i1 %a, %b
179 br i1 %c, label %bb1, label %return
180
181bb1:
182 ret i32 4
183
184return:
185 ret i32 192
186}
187
188define i32 @all_sign_bits_set_branch(i32 %P, i32 %Q) {
189; CHECK-LABEL: all_sign_bits_set_branch:
190; CHECK: # BB#0: # %entry
Sanjay Patel34da36e2017-03-31 20:28:06 +0000191; CHECK-NEXT: and 3, 3, 4
192; CHECK-NEXT: cmpwi 0, 3, -1
193; CHECK-NEXT: bgt 0, .LBB11_2
Sanjay Patela97d36f2017-03-31 18:51:03 +0000194; CHECK-NEXT: # BB#1: # %bb1
195; CHECK-NEXT: li 3, 4
196; CHECK-NEXT: blr
197; CHECK-NEXT: .LBB11_2: # %return
198; CHECK-NEXT: li 3, 192
199; CHECK-NEXT: blr
200entry:
201 %a = icmp slt i32 %P, 0
202 %b = icmp slt i32 %Q, 0
203 %c = and i1 %a, %b
204 br i1 %c, label %bb1, label %return
205
206bb1:
207 ret i32 4
208
209return:
210 ret i32 192
211}
212
213; PR3351 - (P != 0) | (Q != 0) -> (P|Q) != 0
214define i32 @any_bits_set_branch(i32* %P, i32* %Q) {
215; CHECK-LABEL: any_bits_set_branch:
216; CHECK: # BB#0: # %entry
217; CHECK-NEXT: or. 3, 3, 4
218; CHECK-NEXT: beq 0, .LBB12_2
219; CHECK-NEXT: # BB#1: # %bb1
220; CHECK-NEXT: li 3, 4
221; CHECK-NEXT: blr
222; CHECK-NEXT: .LBB12_2: # %return
223; CHECK-NEXT: li 3, 192
224; CHECK-NEXT: blr
225entry:
226 %a = icmp ne i32* %P, null
227 %b = icmp ne i32* %Q, null
228 %c = or i1 %a, %b
229 br i1 %c, label %bb1, label %return
230
231bb1:
232 ret i32 4
233
234return:
235 ret i32 192
236}
237
238define i32 @any_sign_bits_set_branch(i32 %P, i32 %Q) {
239; CHECK-LABEL: any_sign_bits_set_branch:
240; CHECK: # BB#0: # %entry
241; CHECK-NEXT: or 3, 3, 4
242; CHECK-NEXT: cmpwi 0, 3, -1
243; CHECK-NEXT: bgt 0, .LBB13_2
244; CHECK-NEXT: # BB#1: # %bb1
245; CHECK-NEXT: li 3, 4
246; CHECK-NEXT: blr
247; CHECK-NEXT: .LBB13_2: # %return
248; CHECK-NEXT: li 3, 192
249; CHECK-NEXT: blr
250entry:
251 %a = icmp slt i32 %P, 0
252 %b = icmp slt i32 %Q, 0
253 %c = or i1 %a, %b
254 br i1 %c, label %bb1, label %return
255
256bb1:
257 ret i32 4
258
259return:
260 ret i32 192
261}
262
263define i32 @any_bits_clear_branch(i32 %P, i32 %Q) {
264; CHECK-LABEL: any_bits_clear_branch:
265; CHECK: # BB#0: # %entry
266; CHECK-NEXT: and 3, 3, 4
267; CHECK-NEXT: cmpwi 0, 3, -1
268; CHECK-NEXT: beq 0, .LBB14_2
269; CHECK-NEXT: # BB#1: # %bb1
270; CHECK-NEXT: li 3, 4
271; CHECK-NEXT: blr
272; CHECK-NEXT: .LBB14_2: # %return
273; CHECK-NEXT: li 3, 192
274; CHECK-NEXT: blr
275entry:
276 %a = icmp ne i32 %P, -1
277 %b = icmp ne i32 %Q, -1
278 %c = or i1 %a, %b
279 br i1 %c, label %bb1, label %return
280
281bb1:
282 ret i32 4
283
284return:
285 ret i32 192
286}
287
288define i32 @any_sign_bits_clear_branch(i32 %P, i32 %Q) {
289; CHECK-LABEL: any_sign_bits_clear_branch:
290; CHECK: # BB#0: # %entry
291; CHECK-NEXT: and 3, 3, 4
292; CHECK-NEXT: cmpwi 0, 3, 0
293; CHECK-NEXT: blt 0, .LBB15_2
294; CHECK-NEXT: # BB#1: # %bb1
295; CHECK-NEXT: li 3, 4
296; CHECK-NEXT: blr
297; CHECK-NEXT: .LBB15_2: # %return
298; CHECK-NEXT: li 3, 192
299; CHECK-NEXT: blr
300entry:
301 %a = icmp sgt i32 %P, -1
302 %b = icmp sgt i32 %Q, -1
303 %c = or i1 %a, %b
304 br i1 %c, label %bb1, label %return
305
306bb1:
307 ret i32 4
308
309return:
310 ret i32 192
311}
312
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000313define <4 x i1> @all_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) {
314; CHECK-LABEL: all_bits_clear_vec:
315; CHECK: # BB#0:
316; CHECK-NEXT: xxlxor 36, 36, 36
Sanjay Patel665021e2017-04-01 15:05:54 +0000317; CHECK-NEXT: xxlor 34, 34, 35
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000318; CHECK-NEXT: vcmpequw 2, 2, 4
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000319; CHECK-NEXT: blr
320 %a = icmp eq <4 x i32> %P, zeroinitializer
321 %b = icmp eq <4 x i32> %Q, zeroinitializer
322 %c = and <4 x i1> %a, %b
323 ret <4 x i1> %c
324}
325
326define <4 x i1> @all_sign_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) {
327; CHECK-LABEL: all_sign_bits_clear_vec:
328; CHECK: # BB#0:
329; CHECK-NEXT: vspltisb 4, -1
Sanjay Patel665021e2017-04-01 15:05:54 +0000330; CHECK-NEXT: xxlor 34, 34, 35
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000331; CHECK-NEXT: vcmpgtsw 2, 2, 4
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000332; CHECK-NEXT: blr
333 %a = icmp sgt <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>
334 %b = icmp sgt <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>
335 %c = and <4 x i1> %a, %b
336 ret <4 x i1> %c
337}
338
339define <4 x i1> @all_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) {
340; CHECK-LABEL: all_bits_set_vec:
341; CHECK: # BB#0:
342; CHECK-NEXT: vspltisb 4, -1
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000343; CHECK-NEXT: xxland 34, 34, 35
Sanjay Patel665021e2017-04-01 15:05:54 +0000344; CHECK-NEXT: vcmpequw 2, 2, 4
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000345; CHECK-NEXT: blr
346 %a = icmp eq <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>
347 %b = icmp eq <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>
348 %c = and <4 x i1> %a, %b
349 ret <4 x i1> %c
350}
351
352define <4 x i1> @all_sign_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) {
353; CHECK-LABEL: all_sign_bits_set_vec:
354; CHECK: # BB#0:
355; CHECK-NEXT: xxlxor 36, 36, 36
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000356; CHECK-NEXT: xxland 34, 34, 35
Sanjay Patel665021e2017-04-01 15:05:54 +0000357; CHECK-NEXT: vcmpgtsw 2, 4, 2
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000358; CHECK-NEXT: blr
359 %a = icmp slt <4 x i32> %P, zeroinitializer
360 %b = icmp slt <4 x i32> %Q, zeroinitializer
361 %c = and <4 x i1> %a, %b
362 ret <4 x i1> %c
363}
364
365define <4 x i1> @any_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) {
366; CHECK-LABEL: any_bits_set_vec:
367; CHECK: # BB#0:
368; CHECK-NEXT: xxlxor 36, 36, 36
Sanjay Patel665021e2017-04-01 15:05:54 +0000369; CHECK-NEXT: xxlor 34, 34, 35
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000370; CHECK-NEXT: vcmpequw 2, 2, 4
Sanjay Patel665021e2017-04-01 15:05:54 +0000371; CHECK-NEXT: xxlnor 34, 34, 34
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000372; CHECK-NEXT: blr
373 %a = icmp ne <4 x i32> %P, zeroinitializer
374 %b = icmp ne <4 x i32> %Q, zeroinitializer
375 %c = or <4 x i1> %a, %b
376 ret <4 x i1> %c
377}
378
379define <4 x i1> @any_sign_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) {
380; CHECK-LABEL: any_sign_bits_set_vec:
381; CHECK: # BB#0:
382; CHECK-NEXT: xxlxor 36, 36, 36
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000383; CHECK-NEXT: xxlor 34, 34, 35
Sanjay Patel665021e2017-04-01 15:05:54 +0000384; CHECK-NEXT: vcmpgtsw 2, 4, 2
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000385; CHECK-NEXT: blr
386 %a = icmp slt <4 x i32> %P, zeroinitializer
387 %b = icmp slt <4 x i32> %Q, zeroinitializer
388 %c = or <4 x i1> %a, %b
389 ret <4 x i1> %c
390}
391
392define <4 x i1> @any_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) {
393; CHECK-LABEL: any_bits_clear_vec:
394; CHECK: # BB#0:
395; CHECK-NEXT: vspltisb 4, -1
Sanjay Patel665021e2017-04-01 15:05:54 +0000396; CHECK-NEXT: xxland 34, 34, 35
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000397; CHECK-NEXT: vcmpequw 2, 2, 4
Sanjay Patel665021e2017-04-01 15:05:54 +0000398; CHECK-NEXT: xxlnor 34, 34, 34
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000399; CHECK-NEXT: blr
400 %a = icmp ne <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>
401 %b = icmp ne <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>
402 %c = or <4 x i1> %a, %b
403 ret <4 x i1> %c
404}
405
406define <4 x i1> @any_sign_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) {
407; CHECK-LABEL: any_sign_bits_clear_vec:
408; CHECK: # BB#0:
409; CHECK-NEXT: vspltisb 4, -1
Sanjay Patel665021e2017-04-01 15:05:54 +0000410; CHECK-NEXT: xxland 34, 34, 35
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000411; CHECK-NEXT: vcmpgtsw 2, 2, 4
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000412; CHECK-NEXT: blr
413 %a = icmp sgt <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>
414 %b = icmp sgt <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>
415 %c = or <4 x i1> %a, %b
416 ret <4 x i1> %c
417}
418
Sanjay Patela4546ef2017-04-03 22:45:46 +0000419define zeroext i1 @ne_neg1_and_ne_zero(i64 %x) {
420; CHECK-LABEL: ne_neg1_and_ne_zero:
421; CHECK: # BB#0:
422; CHECK-NEXT: addi 3, 3, 1
423; CHECK-NEXT: li 4, 0
424; CHECK-NEXT: li 12, 1
425; CHECK-NEXT: cmpldi 3, 1
426; CHECK-NEXT: isel 3, 12, 4, 1
427; CHECK-NEXT: blr
428 %cmp1 = icmp ne i64 %x, -1
429 %cmp2 = icmp ne i64 %x, 0
430 %and = and i1 %cmp1, %cmp2
431 ret i1 %and
432}
433
434; PR32401 - https://bugs.llvm.org/show_bug.cgi?id=32401
435
436define zeroext i1 @and_eq(i16 zeroext %a, i16 zeroext %b, i16 zeroext %c, i16 zeroext %d) {
437; CHECK-LABEL: and_eq:
438; CHECK: # BB#0:
Sanjay Patelb2f16212017-04-05 14:09:39 +0000439; CHECK-NEXT: xor 5, 5, 6
440; CHECK-NEXT: xor 3, 3, 4
441; CHECK-NEXT: or 3, 3, 5
442; CHECK-NEXT: cntlzw 3, 3
Nemanja Ivanovic96c3d622017-05-11 16:54:23 +0000443; CHECK-NEXT: srwi 3, 3, 5
Sanjay Patela4546ef2017-04-03 22:45:46 +0000444; CHECK-NEXT: blr
445 %cmp1 = icmp eq i16 %a, %b
446 %cmp2 = icmp eq i16 %c, %d
447 %and = and i1 %cmp1, %cmp2
448 ret i1 %and
449}
450
451define zeroext i1 @or_ne(i32 %a, i32 %b, i32 %c, i32 %d) {
452; CHECK-LABEL: or_ne:
453; CHECK: # BB#0:
Sanjay Patelb2f16212017-04-05 14:09:39 +0000454; CHECK-NEXT: xor 5, 5, 6
455; CHECK-NEXT: xor 3, 3, 4
456; CHECK-NEXT: or 3, 3, 5
457; CHECK-NEXT: cntlzw 3, 3
Nemanja Ivanovicbb67f842017-06-07 12:23:41 +0000458; CHECK-NEXT: srwi 3, 3, 5
459; CHECK-NEXT: xori 3, 3, 1
Sanjay Patela4546ef2017-04-03 22:45:46 +0000460; CHECK-NEXT: blr
461 %cmp1 = icmp ne i32 %a, %b
462 %cmp2 = icmp ne i32 %c, %d
463 %or = or i1 %cmp1, %cmp2
464 ret i1 %or
465}
466
467; This should not be transformed because vector compares + bitwise logic are faster.
468
469define <4 x i1> @and_eq_vec(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {
470; CHECK-LABEL: and_eq_vec:
471; CHECK: # BB#0:
472; CHECK-NEXT: vcmpequw 2, 2, 3
473; CHECK-NEXT: vcmpequw 19, 4, 5
474; CHECK-NEXT: xxland 34, 34, 51
475; CHECK-NEXT: blr
476 %cmp1 = icmp eq <4 x i32> %a, %b
477 %cmp2 = icmp eq <4 x i32> %c, %d
478 %and = and <4 x i1> %cmp1, %cmp2
479 ret <4 x i1> %and
480}
481