From 56a9332328bee8208d03b6c8269fdd5dad44b523 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Fri, 19 Jun 2020 16:05:04 +0100 Subject: [PATCH] [X86][SSE] Fold MOVMSK(PCMPEQ(X,0)) != -1 -> !PTESTZ(X,X) allof patterns --- llvm/lib/Target/X86/X86ISelLowering.cpp | 3 +- llvm/test/CodeGen/X86/movmsk-cmp.ll | 47 ++++++++++--------------- 2 files changed, 21 insertions(+), 29 deletions(-) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index c5debd6ef7a8..9ce8245898de 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -40561,7 +40561,8 @@ static SDValue combineSetCCMOVMSK(SDValue EFLAGS, X86::CondCode &CC, } // MOVMSK(PCMPEQ(X,0)) == -1 -> PTESTZ(X,X). - if ((IsAllOf && CC == X86::COND_E) && Subtarget.hasSSE41()) { + // MOVMSK(PCMPEQ(X,0)) != -1 -> !PTESTZ(X,X). + if (IsAllOf && Subtarget.hasSSE41()) { SDValue BC = peekThroughBitcasts(Vec); if (BC.getOpcode() == X86ISD::PCMPEQ && ISD::isBuildVectorAllZeros(BC.getOperand(1).getNode())) { diff --git a/llvm/test/CodeGen/X86/movmsk-cmp.ll b/llvm/test/CodeGen/X86/movmsk-cmp.ll index bc2edf43be38..288069bedd94 100644 --- a/llvm/test/CodeGen/X86/movmsk-cmp.ll +++ b/llvm/test/CodeGen/X86/movmsk-cmp.ll @@ -998,30 +998,30 @@ define i1 @allones_v16i8_and1(<16 x i8> %arg) { } define i1 @allzeros_v16i8_not(<16 x i8> %a0) { -; SSE-LABEL: allzeros_v16i8_not: -; SSE: # %bb.0: -; SSE-NEXT: pxor %xmm1, %xmm1 -; SSE-NEXT: pcmpeqb %xmm0, %xmm1 -; SSE-NEXT: pmovmskb %xmm1, %eax -; SSE-NEXT: cmpw $-1, %ax -; SSE-NEXT: setne %al -; SSE-NEXT: retq +; SSE2-LABEL: allzeros_v16i8_not: +; SSE2: # %bb.0: +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: cmpw $-1, %ax +; SSE2-NEXT: setne %al +; SSE2-NEXT: retq +; +; SSE41-LABEL: allzeros_v16i8_not: +; SSE41: # %bb.0: +; SSE41-NEXT: ptest %xmm0, %xmm0 +; SSE41-NEXT: setne %al +; SSE41-NEXT: retq ; ; AVX1OR2-LABEL: allzeros_v16i8_not: ; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 -; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax -; AVX1OR2-NEXT: cmpw $-1, %ax +; AVX1OR2-NEXT: vptest %xmm0, %xmm0 ; AVX1OR2-NEXT: setne %al ; AVX1OR2-NEXT: retq ; ; KNL-LABEL: allzeros_v16i8_not: ; KNL: # %bb.0: -; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1 -; KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 -; KNL-NEXT: vpmovmskb %xmm0, %eax -; KNL-NEXT: cmpw $-1, %ax +; KNL-NEXT: vptest %xmm0, %xmm0 ; KNL-NEXT: setne %al ; KNL-NEXT: retq ; @@ -1051,19 +1051,13 @@ define i1 @allzeros_v2i64_not(<2 x i64> %a0) { ; ; SSE41-LABEL: allzeros_v2i64_not: ; SSE41: # %bb.0: -; SSE41-NEXT: pxor %xmm1, %xmm1 -; SSE41-NEXT: pcmpeqq %xmm0, %xmm1 -; SSE41-NEXT: movmskpd %xmm1, %eax -; SSE41-NEXT: cmpb $3, %al +; SSE41-NEXT: ptest %xmm0, %xmm0 ; SSE41-NEXT: setne %al ; SSE41-NEXT: retq ; ; AVX1OR2-LABEL: allzeros_v2i64_not: ; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 -; AVX1OR2-NEXT: vmovmskpd %xmm0, %eax -; AVX1OR2-NEXT: cmpb $3, %al +; AVX1OR2-NEXT: vptest %xmm0, %xmm0 ; AVX1OR2-NEXT: setne %al ; AVX1OR2-NEXT: retq ; @@ -1119,10 +1113,7 @@ define i1 @allzeros_v8i32_not(<8 x i32> %a0) { ; ; AVX2-LABEL: allzeros_v8i32_not: ; AVX2: # %bb.0: -; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0 -; AVX2-NEXT: vmovmskps %ymm0, %eax -; AVX2-NEXT: cmpb $-1, %al +; AVX2-NEXT: vptest %ymm0, %ymm0 ; AVX2-NEXT: setne %al ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq