@@ -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))
376464define i1 @PR38788 (<4 x i32 > %0 , <4 x i32 > %1 ) {
377465; SSE-LABEL: PR38788:
0 commit comments