blob: 9933b9cffc51bd1c74baf1c3c1e42594b1e3d5c9 [file] [log] [blame]
Sanjay Patel303abb82017-03-31 17:55:07 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
3
4define zeroext i1 @all_bits_clear(i32 %P, i32 %Q) nounwind {
5; CHECK-LABEL: all_bits_clear:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +00006; CHECK: # %bb.0:
Sanjay Patel303abb82017-03-31 17:55:07 +00007; CHECK-NEXT: orl %esi, %edi
8; CHECK-NEXT: sete %al
9; CHECK-NEXT: retq
10 %a = icmp eq i32 %P, 0
11 %b = icmp eq i32 %Q, 0
12 %c = and i1 %a, %b
13 ret i1 %c
14}
15
16define zeroext i1 @all_sign_bits_clear(i32 %P, i32 %Q) nounwind {
17; CHECK-LABEL: all_sign_bits_clear:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000018; CHECK: # %bb.0:
Sanjay Patel303abb82017-03-31 17:55:07 +000019; CHECK-NEXT: orl %esi, %edi
20; CHECK-NEXT: setns %al
21; CHECK-NEXT: retq
22 %a = icmp sgt i32 %P, -1
23 %b = icmp sgt i32 %Q, -1
24 %c = and i1 %a, %b
25 ret i1 %c
26}
27
28define zeroext i1 @all_bits_set(i32 %P, i32 %Q) nounwind {
29; CHECK-LABEL: all_bits_set:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000030; CHECK: # %bb.0:
Sanjay Patel303abb82017-03-31 17:55:07 +000031; CHECK-NEXT: andl %esi, %edi
32; CHECK-NEXT: cmpl $-1, %edi
33; CHECK-NEXT: sete %al
34; CHECK-NEXT: retq
35 %a = icmp eq i32 %P, -1
36 %b = icmp eq i32 %Q, -1
37 %c = and i1 %a, %b
38 ret i1 %c
39}
40
41define zeroext i1 @all_sign_bits_set(i32 %P, i32 %Q) nounwind {
42; CHECK-LABEL: all_sign_bits_set:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000043; CHECK: # %bb.0:
Sanjay Patel34da36e2017-03-31 20:28:06 +000044; CHECK-NEXT: andl %esi, %edi
45; CHECK-NEXT: shrl $31, %edi
46; CHECK-NEXT: movl %edi, %eax
Sanjay Patel303abb82017-03-31 17:55:07 +000047; CHECK-NEXT: retq
48 %a = icmp slt i32 %P, 0
49 %b = icmp slt i32 %Q, 0
50 %c = and i1 %a, %b
51 ret i1 %c
52}
53
54define zeroext i1 @any_bits_set(i32 %P, i32 %Q) nounwind {
55; CHECK-LABEL: any_bits_set:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000056; CHECK: # %bb.0:
Sanjay Patel303abb82017-03-31 17:55:07 +000057; CHECK-NEXT: orl %esi, %edi
58; CHECK-NEXT: setne %al
59; CHECK-NEXT: retq
60 %a = icmp ne i32 %P, 0
61 %b = icmp ne i32 %Q, 0
62 %c = or i1 %a, %b
63 ret i1 %c
64}
65
66define zeroext i1 @any_sign_bits_set(i32 %P, i32 %Q) nounwind {
67; CHECK-LABEL: any_sign_bits_set:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000068; CHECK: # %bb.0:
Sanjay Patel303abb82017-03-31 17:55:07 +000069; CHECK-NEXT: orl %esi, %edi
70; CHECK-NEXT: shrl $31, %edi
71; CHECK-NEXT: movl %edi, %eax
72; CHECK-NEXT: retq
73 %a = icmp slt i32 %P, 0
74 %b = icmp slt i32 %Q, 0
75 %c = or i1 %a, %b
76 ret i1 %c
77}
78
79define zeroext i1 @any_bits_clear(i32 %P, i32 %Q) nounwind {
80; CHECK-LABEL: any_bits_clear:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000081; CHECK: # %bb.0:
Sanjay Patel303abb82017-03-31 17:55:07 +000082; CHECK-NEXT: andl %esi, %edi
83; CHECK-NEXT: cmpl $-1, %edi
84; CHECK-NEXT: setne %al
85; CHECK-NEXT: retq
86 %a = icmp ne i32 %P, -1
87 %b = icmp ne i32 %Q, -1
88 %c = or i1 %a, %b
89 ret i1 %c
90}
91
92define zeroext i1 @any_sign_bits_clear(i32 %P, i32 %Q) nounwind {
93; CHECK-LABEL: any_sign_bits_clear:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000094; CHECK: # %bb.0:
Sanjay Patel303abb82017-03-31 17:55:07 +000095; CHECK-NEXT: testl %esi, %edi
96; CHECK-NEXT: setns %al
97; CHECK-NEXT: retq
98 %a = icmp sgt i32 %P, -1
99 %b = icmp sgt i32 %Q, -1
100 %c = or i1 %a, %b
101 ret i1 %c
102}
103
104; PR3351 - (P == 0) & (Q == 0) -> (P|Q) == 0
105define i32 @all_bits_clear_branch(i32* %P, i32* %Q) nounwind {
106; CHECK-LABEL: all_bits_clear_branch:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000107; CHECK: # %bb.0: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000108; CHECK-NEXT: orq %rsi, %rdi
109; CHECK-NEXT: jne .LBB8_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000110; CHECK-NEXT: # %bb.1: # %bb1
Sanjay Patel303abb82017-03-31 17:55:07 +0000111; CHECK-NEXT: movl $4, %eax
112; CHECK-NEXT: retq
113; CHECK-NEXT: .LBB8_2: # %return
114; CHECK-NEXT: movl $192, %eax
115; CHECK-NEXT: retq
116entry:
117 %a = icmp eq i32* %P, null
118 %b = icmp eq i32* %Q, null
119 %c = and i1 %a, %b
120 br i1 %c, label %bb1, label %return
121
122bb1:
123 ret i32 4
124
125return:
126 ret i32 192
127}
128
129define i32 @all_sign_bits_clear_branch(i32 %P, i32 %Q) nounwind {
130; CHECK-LABEL: all_sign_bits_clear_branch:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000131; CHECK: # %bb.0: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000132; CHECK-NEXT: testl %edi, %edi
133; CHECK-NEXT: js .LBB9_3
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000134; CHECK-NEXT: # %bb.1: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000135; CHECK-NEXT: testl %esi, %esi
136; CHECK-NEXT: js .LBB9_3
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000137; CHECK-NEXT: # %bb.2: # %bb1
Sanjay Patel303abb82017-03-31 17:55:07 +0000138; CHECK-NEXT: movl $4, %eax
139; CHECK-NEXT: retq
140; CHECK-NEXT: .LBB9_3: # %return
141; CHECK-NEXT: movl $192, %eax
142; CHECK-NEXT: retq
143entry:
144 %a = icmp sgt i32 %P, -1
145 %b = icmp sgt i32 %Q, -1
146 %c = and i1 %a, %b
147 br i1 %c, label %bb1, label %return
148
149bb1:
150 ret i32 4
151
152return:
153 ret i32 192
154}
155
156define i32 @all_bits_set_branch(i32 %P, i32 %Q) nounwind {
157; CHECK-LABEL: all_bits_set_branch:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000158; CHECK: # %bb.0: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000159; CHECK-NEXT: cmpl $-1, %edi
160; CHECK-NEXT: jne .LBB10_3
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000161; CHECK-NEXT: # %bb.1: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000162; CHECK-NEXT: cmpl $-1, %esi
163; CHECK-NEXT: jne .LBB10_3
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000164; CHECK-NEXT: # %bb.2: # %bb1
Sanjay Patel303abb82017-03-31 17:55:07 +0000165; CHECK-NEXT: movl $4, %eax
166; CHECK-NEXT: retq
167; CHECK-NEXT: .LBB10_3: # %return
168; CHECK-NEXT: movl $192, %eax
169; CHECK-NEXT: retq
170entry:
171 %a = icmp eq i32 %P, -1
172 %b = icmp eq i32 %Q, -1
173 %c = and i1 %a, %b
174 br i1 %c, label %bb1, label %return
175
176bb1:
177 ret i32 4
178
179return:
180 ret i32 192
181}
182
183define i32 @all_sign_bits_set_branch(i32 %P, i32 %Q) nounwind {
184; CHECK-LABEL: all_sign_bits_set_branch:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000185; CHECK: # %bb.0: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000186; CHECK-NEXT: testl %edi, %edi
187; CHECK-NEXT: jns .LBB11_3
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000188; CHECK-NEXT: # %bb.1: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000189; CHECK-NEXT: testl %esi, %esi
190; CHECK-NEXT: jns .LBB11_3
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000191; CHECK-NEXT: # %bb.2: # %bb1
Sanjay Patel303abb82017-03-31 17:55:07 +0000192; CHECK-NEXT: movl $4, %eax
193; CHECK-NEXT: retq
194; CHECK-NEXT: .LBB11_3: # %return
195; CHECK-NEXT: movl $192, %eax
196; CHECK-NEXT: retq
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) nounwind {
212; CHECK-LABEL: any_bits_set_branch:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000213; CHECK: # %bb.0: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000214; CHECK-NEXT: orq %rsi, %rdi
215; CHECK-NEXT: je .LBB12_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000216; CHECK-NEXT: # %bb.1: # %bb1
Sanjay Patel303abb82017-03-31 17:55:07 +0000217; CHECK-NEXT: movl $4, %eax
218; CHECK-NEXT: retq
219; CHECK-NEXT: .LBB12_2: # %return
220; CHECK-NEXT: movl $192, %eax
221; CHECK-NEXT: retq
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) nounwind {
236; CHECK-LABEL: any_sign_bits_set_branch:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000237; CHECK: # %bb.0: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000238; CHECK-NEXT: testl %edi, %edi
239; CHECK-NEXT: js .LBB13_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000240; CHECK-NEXT: # %bb.1: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000241; CHECK-NEXT: testl %esi, %esi
242; CHECK-NEXT: js .LBB13_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000243; CHECK-NEXT: # %bb.3: # %return
Sanjay Patel303abb82017-03-31 17:55:07 +0000244; CHECK-NEXT: movl $192, %eax
245; CHECK-NEXT: retq
246; CHECK-NEXT: .LBB13_2: # %bb1
247; CHECK-NEXT: movl $4, %eax
248; CHECK-NEXT: retq
249entry:
250 %a = icmp slt i32 %P, 0
251 %b = icmp slt i32 %Q, 0
252 %c = or i1 %a, %b
253 br i1 %c, label %bb1, label %return
254
255bb1:
256 ret i32 4
257
258return:
259 ret i32 192
260}
261
262define i32 @any_bits_clear_branch(i32 %P, i32 %Q) nounwind {
263; CHECK-LABEL: any_bits_clear_branch:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000264; CHECK: # %bb.0: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000265; CHECK-NEXT: cmpl $-1, %edi
266; CHECK-NEXT: jne .LBB14_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000267; CHECK-NEXT: # %bb.1: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000268; CHECK-NEXT: cmpl $-1, %esi
269; CHECK-NEXT: jne .LBB14_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000270; CHECK-NEXT: # %bb.3: # %return
Sanjay Patel303abb82017-03-31 17:55:07 +0000271; CHECK-NEXT: movl $192, %eax
272; CHECK-NEXT: retq
273; CHECK-NEXT: .LBB14_2: # %bb1
274; CHECK-NEXT: movl $4, %eax
275; CHECK-NEXT: retq
276entry:
277 %a = icmp ne i32 %P, -1
278 %b = icmp ne i32 %Q, -1
279 %c = or i1 %a, %b
280 br i1 %c, label %bb1, label %return
281
282bb1:
283 ret i32 4
284
285return:
286 ret i32 192
287}
288
289define i32 @any_sign_bits_clear_branch(i32 %P, i32 %Q) nounwind {
290; CHECK-LABEL: any_sign_bits_clear_branch:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000291; CHECK: # %bb.0: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000292; CHECK-NEXT: testl %edi, %edi
293; CHECK-NEXT: jns .LBB15_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000294; CHECK-NEXT: # %bb.1: # %entry
Sanjay Patel303abb82017-03-31 17:55:07 +0000295; CHECK-NEXT: testl %esi, %esi
296; CHECK-NEXT: jns .LBB15_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000297; CHECK-NEXT: # %bb.3: # %return
Sanjay Patel303abb82017-03-31 17:55:07 +0000298; CHECK-NEXT: movl $192, %eax
299; CHECK-NEXT: retq
300; CHECK-NEXT: .LBB15_2: # %bb1
301; CHECK-NEXT: movl $4, %eax
302; CHECK-NEXT: retq
303entry:
304 %a = icmp sgt i32 %P, -1
305 %b = icmp sgt i32 %Q, -1
306 %c = or i1 %a, %b
307 br i1 %c, label %bb1, label %return
308
309bb1:
310 ret i32 4
311
312return:
313 ret i32 192
314}
315
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000316define <4 x i1> @all_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {
317; CHECK-LABEL: all_bits_clear_vec:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000318; CHECK: # %bb.0:
Sanjay Patel665021e2017-04-01 15:05:54 +0000319; CHECK-NEXT: por %xmm1, %xmm0
320; CHECK-NEXT: pxor %xmm1, %xmm1
321; CHECK-NEXT: pcmpeqd %xmm1, %xmm0
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000322; CHECK-NEXT: retq
323 %a = icmp eq <4 x i32> %P, zeroinitializer
324 %b = icmp eq <4 x i32> %Q, zeroinitializer
325 %c = and <4 x i1> %a, %b
326 ret <4 x i1> %c
327}
328
329define <4 x i1> @all_sign_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {
330; CHECK-LABEL: all_sign_bits_clear_vec:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000331; CHECK: # %bb.0:
Sanjay Patel665021e2017-04-01 15:05:54 +0000332; CHECK-NEXT: por %xmm1, %xmm0
333; CHECK-NEXT: pcmpeqd %xmm1, %xmm1
334; CHECK-NEXT: pcmpgtd %xmm1, %xmm0
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000335; CHECK-NEXT: retq
336 %a = icmp sgt <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>
337 %b = icmp sgt <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>
338 %c = and <4 x i1> %a, %b
339 ret <4 x i1> %c
340}
341
342define <4 x i1> @all_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {
343; CHECK-LABEL: all_bits_set_vec:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000344; CHECK: # %bb.0:
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000345; CHECK-NEXT: pand %xmm1, %xmm0
Sanjay Patel665021e2017-04-01 15:05:54 +0000346; CHECK-NEXT: pcmpeqd %xmm1, %xmm1
347; CHECK-NEXT: pcmpeqd %xmm1, %xmm0
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000348; CHECK-NEXT: retq
349 %a = icmp eq <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>
350 %b = icmp eq <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>
351 %c = and <4 x i1> %a, %b
352 ret <4 x i1> %c
353}
354
355define <4 x i1> @all_sign_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {
356; CHECK-LABEL: all_sign_bits_set_vec:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000357; CHECK: # %bb.0:
Sanjay Patel665021e2017-04-01 15:05:54 +0000358; CHECK-NEXT: pand %xmm1, %xmm0
359; CHECK-NEXT: pxor %xmm1, %xmm1
360; CHECK-NEXT: pcmpgtd %xmm0, %xmm1
361; CHECK-NEXT: movdqa %xmm1, %xmm0
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000362; CHECK-NEXT: retq
363 %a = icmp slt <4 x i32> %P, zeroinitializer
364 %b = icmp slt <4 x i32> %Q, zeroinitializer
365 %c = and <4 x i1> %a, %b
366 ret <4 x i1> %c
367}
368
369define <4 x i1> @any_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {
370; CHECK-LABEL: any_bits_set_vec:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000371; CHECK: # %bb.0:
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000372; CHECK-NEXT: por %xmm1, %xmm0
Sanjay Patel665021e2017-04-01 15:05:54 +0000373; CHECK-NEXT: pxor %xmm1, %xmm1
374; CHECK-NEXT: pcmpeqd %xmm1, %xmm0
375; CHECK-NEXT: pcmpeqd %xmm1, %xmm1
376; CHECK-NEXT: pxor %xmm1, %xmm0
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000377; CHECK-NEXT: retq
378 %a = icmp ne <4 x i32> %P, zeroinitializer
379 %b = icmp ne <4 x i32> %Q, zeroinitializer
380 %c = or <4 x i1> %a, %b
381 ret <4 x i1> %c
382}
383
384define <4 x i1> @any_sign_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {
385; CHECK-LABEL: any_sign_bits_set_vec:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000386; CHECK: # %bb.0:
Sanjay Patel665021e2017-04-01 15:05:54 +0000387; CHECK-NEXT: por %xmm1, %xmm0
388; CHECK-NEXT: pxor %xmm1, %xmm1
389; CHECK-NEXT: pcmpgtd %xmm0, %xmm1
390; CHECK-NEXT: movdqa %xmm1, %xmm0
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000391; CHECK-NEXT: retq
392 %a = icmp slt <4 x i32> %P, zeroinitializer
393 %b = icmp slt <4 x i32> %Q, zeroinitializer
394 %c = or <4 x i1> %a, %b
395 ret <4 x i1> %c
396}
397
398define <4 x i1> @any_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {
399; CHECK-LABEL: any_bits_clear_vec:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000400; CHECK: # %bb.0:
Sanjay Patel665021e2017-04-01 15:05:54 +0000401; CHECK-NEXT: pand %xmm1, %xmm0
402; CHECK-NEXT: pcmpeqd %xmm1, %xmm1
403; CHECK-NEXT: pcmpeqd %xmm1, %xmm0
404; CHECK-NEXT: pxor %xmm1, %xmm0
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000405; CHECK-NEXT: retq
406 %a = icmp ne <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>
407 %b = icmp ne <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>
408 %c = or <4 x i1> %a, %b
409 ret <4 x i1> %c
410}
411
412define <4 x i1> @any_sign_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {
413; CHECK-LABEL: any_sign_bits_clear_vec:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000414; CHECK: # %bb.0:
Sanjay Patel665021e2017-04-01 15:05:54 +0000415; CHECK-NEXT: pand %xmm1, %xmm0
416; CHECK-NEXT: pcmpeqd %xmm1, %xmm1
417; CHECK-NEXT: pcmpgtd %xmm1, %xmm0
Sanjay Patelfe9340c2017-04-01 14:32:18 +0000418; CHECK-NEXT: retq
419 %a = icmp sgt <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>
420 %b = icmp sgt <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>
421 %c = or <4 x i1> %a, %b
422 ret <4 x i1> %c
423}
424
Sanjay Patel303abb82017-03-31 17:55:07 +0000425define zeroext i1 @ne_neg1_and_ne_zero(i64 %x) nounwind {
426; CHECK-LABEL: ne_neg1_and_ne_zero:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000427; CHECK: # %bb.0:
Sanjay Patel303abb82017-03-31 17:55:07 +0000428; CHECK-NEXT: incq %rdi
429; CHECK-NEXT: cmpq $1, %rdi
430; CHECK-NEXT: seta %al
431; CHECK-NEXT: retq
432 %cmp1 = icmp ne i64 %x, -1
433 %cmp2 = icmp ne i64 %x, 0
434 %and = and i1 %cmp1, %cmp2
435 ret i1 %and
436}
437
438; PR32401 - https://bugs.llvm.org/show_bug.cgi?id=32401
439
Sanjay Patela4546ef2017-04-03 22:45:46 +0000440define zeroext i1 @and_eq(i8 %a, i8 %b, i8 %c, i8 %d) nounwind {
441; CHECK-LABEL: and_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000442; CHECK: # %bb.0:
Sanjay Patelb2f16212017-04-05 14:09:39 +0000443; CHECK-NEXT: xorl %esi, %edi
444; CHECK-NEXT: xorl %ecx, %edx
445; CHECK-NEXT: orb %dl, %dil
Sanjay Patel303abb82017-03-31 17:55:07 +0000446; CHECK-NEXT: sete %al
Sanjay Patel303abb82017-03-31 17:55:07 +0000447; CHECK-NEXT: retq
448 %cmp1 = icmp eq i8 %a, %b
449 %cmp2 = icmp eq i8 %c, %d
450 %and = and i1 %cmp1, %cmp2
451 ret i1 %and
452}
453
Sanjay Patela4546ef2017-04-03 22:45:46 +0000454define zeroext i1 @or_ne(i8 %a, i8 %b, i8 %c, i8 %d) nounwind {
455; CHECK-LABEL: or_ne:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000456; CHECK: # %bb.0:
Sanjay Patelb2f16212017-04-05 14:09:39 +0000457; CHECK-NEXT: xorl %esi, %edi
458; CHECK-NEXT: xorl %ecx, %edx
459; CHECK-NEXT: orb %dl, %dil
Sanjay Patela4546ef2017-04-03 22:45:46 +0000460; CHECK-NEXT: setne %al
Sanjay Patela4546ef2017-04-03 22:45:46 +0000461; CHECK-NEXT: retq
462 %cmp1 = icmp ne i8 %a, %b
463 %cmp2 = icmp ne i8 %c, %d
464 %or = or i1 %cmp1, %cmp2
465 ret i1 %or
466}
467
468; This should not be transformed because vector compares + bitwise logic are faster.
469
470define <4 x i1> @and_eq_vec(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) nounwind {
471; CHECK-LABEL: and_eq_vec:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000472; CHECK: # %bb.0:
Sanjay Patela4546ef2017-04-03 22:45:46 +0000473; CHECK-NEXT: pcmpeqd %xmm1, %xmm0
474; CHECK-NEXT: pcmpeqd %xmm3, %xmm2
475; CHECK-NEXT: pand %xmm2, %xmm0
476; CHECK-NEXT: retq
477 %cmp1 = icmp eq <4 x i32> %a, %b
478 %cmp2 = icmp eq <4 x i32> %c, %d
479 %and = and <4 x i1> %cmp1, %cmp2
480 ret <4 x i1> %and
481}
482