Skip to content

Commit fcedf98

Browse files
committed
[X86] Add test coverage for #123456
1 parent 699f196 commit fcedf98

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

llvm/test/CodeGen/X86/combine-ptest.ll

+88
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,94 @@ define i32 @ptestz_v2i64_concat(<4 x i64> %c, <4 x i64> %d, i32 %a, i32 %b) {
372372
ret i32 %t9
373373
}
374374

375+
; PR123456 - all_of(x == 0)
376+
define i1 @ptestc_v4i32_eq0(<4 x i32> %a0) {
377+
; SSE-LABEL: ptestc_v4i32_eq0:
378+
; SSE: # %bb.0:
379+
; SSE-NEXT: pxor %xmm1, %xmm1
380+
; SSE-NEXT: pcmpeqd %xmm0, %xmm1
381+
; SSE-NEXT: pcmpeqd %xmm0, %xmm0
382+
; SSE-NEXT: ptest %xmm0, %xmm1
383+
; SSE-NEXT: setb %al
384+
; SSE-NEXT: retq
385+
;
386+
; AVX-LABEL: ptestc_v4i32_eq0:
387+
; AVX: # %bb.0:
388+
; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
389+
; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
390+
; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
391+
; AVX-NEXT: vptest %xmm1, %xmm0
392+
; AVX-NEXT: setb %al
393+
; AVX-NEXT: retq
394+
%icmp = icmp eq <4 x i32> %a0, zeroinitializer
395+
%sext = sext <4 x i1> %icmp to <4 x i32>
396+
%bc = bitcast <4 x i32> %sext to <2 x i64>
397+
%test = tail call noundef i32 @llvm.x86.sse41.ptestc(<2 x i64> %bc, <2 x i64> splat (i64 -1))
398+
%res = icmp ne i32 %test, 0
399+
ret i1 %res
400+
}
401+
402+
; PR123456 - all_of((a & b) == 0)
403+
define i1 @ptestc_v4i32_and_eq0(<4 x i32> %a0, <4 x i32> %a1) {
404+
; SSE-LABEL: ptestc_v4i32_and_eq0:
405+
; SSE: # %bb.0:
406+
; SSE-NEXT: pand %xmm1, %xmm0
407+
; SSE-NEXT: pxor %xmm1, %xmm1
408+
; SSE-NEXT: pcmpeqd %xmm0, %xmm1
409+
; SSE-NEXT: pcmpeqd %xmm0, %xmm0
410+
; SSE-NEXT: ptest %xmm0, %xmm1
411+
; SSE-NEXT: setb %al
412+
; SSE-NEXT: retq
413+
;
414+
; AVX-LABEL: ptestc_v4i32_and_eq0:
415+
; AVX: # %bb.0:
416+
; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0
417+
; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
418+
; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
419+
; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
420+
; AVX-NEXT: vptest %xmm1, %xmm0
421+
; AVX-NEXT: setb %al
422+
; AVX-NEXT: retq
423+
%and = and <4 x i32> %a1, %a0
424+
%icmp = icmp eq <4 x i32> %and, zeroinitializer
425+
%sext = sext <4 x i1> %icmp to <4 x i32>
426+
%bc = bitcast <4 x i32> %sext to <2 x i64>
427+
%test = tail call noundef i32 @llvm.x86.sse41.ptestc(<2 x i64> %bc, <2 x i64> splat (i64 -1))
428+
%res = icmp ne i32 %test, 0
429+
ret i1 %res
430+
}
431+
432+
; PR123456 - !all_of((a & ~b) == 0)
433+
define i1 @ptestc_v4i32_andnot_eq0(<4 x i32> %a0, <4 x i32> %a1) {
434+
; SSE-LABEL: ptestc_v4i32_andnot_eq0:
435+
; SSE: # %bb.0:
436+
; SSE-NEXT: pandn %xmm0, %xmm1
437+
; SSE-NEXT: pxor %xmm0, %xmm0
438+
; SSE-NEXT: pcmpeqd %xmm1, %xmm0
439+
; SSE-NEXT: pcmpeqd %xmm1, %xmm1
440+
; SSE-NEXT: ptest %xmm1, %xmm0
441+
; SSE-NEXT: setae %al
442+
; SSE-NEXT: retq
443+
;
444+
; AVX-LABEL: ptestc_v4i32_andnot_eq0:
445+
; AVX: # %bb.0:
446+
; AVX-NEXT: vpandn %xmm0, %xmm1, %xmm0
447+
; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
448+
; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
449+
; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
450+
; AVX-NEXT: vptest %xmm1, %xmm0
451+
; AVX-NEXT: setae %al
452+
; AVX-NEXT: retq
453+
%not = xor <4 x i32> %a1, splat (i32 -1)
454+
%and = and <4 x i32> %a0, %not
455+
%icmp = icmp eq <4 x i32> %and, zeroinitializer
456+
%sext = sext <4 x i1> %icmp to <4 x i32>
457+
%bc = bitcast <4 x i32> %sext to <2 x i64>
458+
%test = tail call noundef i32 @llvm.x86.sse41.ptestc(<2 x i64> %bc, <2 x i64> splat (i64 -1))
459+
%res = icmp eq i32 %test, 0
460+
ret i1 %res
461+
}
462+
375463
; FIXME: Foldable to ptest(xor(%0,%1),xor(%0,%1))
376464
define i1 @PR38788(<4 x i32> %0, <4 x i32> %1) {
377465
; SSE-LABEL: PR38788:

0 commit comments

Comments
 (0)