[llvm] [WIP][X86] Remove matchScalarReduction from combineAnd/Or (PR #214774)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 7 08:28:46 PDT 2026
https://github.com/RKSimon created https://github.com/llvm/llvm-project/pull/214774
We should be handling this with general logic(setcc,setcc) folds
>From 58d9ce49333cb276ad285f0b5d5c69d8ea3285fb Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Fri, 7 Aug 2026 16:27:48 +0100
Subject: [PATCH] [WIP][X86] Remove matchScalarReduction from combineAnd/Or
We should be handling this with general logic(setcc,setcc) folds
---
llvm/lib/Target/X86/X86ISelLowering.cpp | 45 ---
llvm/test/CodeGen/X86/movmsk-cmp.ll | 274 ++++++++++++------
llvm/test/CodeGen/X86/pr120093.ll | 5 +-
llvm/test/CodeGen/X86/setcc-logic.ll | 5 +-
.../test/CodeGen/X86/vector-compare-all_of.ll | 28 +-
.../test/CodeGen/X86/vector-compare-any_of.ll | 26 +-
6 files changed, 225 insertions(+), 158 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index f62bf664d970a..2ac5e7aa36b72 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -52748,28 +52748,6 @@ static SDValue combineAnd(SDNode *N, SelectionDAG &DAG,
}
}
- // Match all-of bool scalar reductions into a bitcast/movmsk + cmp.
- // TODO: Support multiple SrcOps.
- if (VT == MVT::i1) {
- SmallVector<SDValue, 2> SrcOps;
- SmallVector<APInt, 2> SrcPartials;
- if (matchScalarReduction(SDValue(N, 0), ISD::AND, SrcOps, &SrcPartials) &&
- SrcOps.size() == 1) {
- unsigned NumElts = SrcOps[0].getValueType().getVectorNumElements();
- EVT MaskVT = EVT::getIntegerVT(*DAG.getContext(), NumElts);
- SDValue Mask = combineBitcastvxi1(DAG, MaskVT, SrcOps[0], dl, Subtarget);
- if (!Mask && TLI.isTypeLegal(SrcOps[0].getValueType()))
- Mask = DAG.getBitcast(MaskVT, SrcOps[0]);
- if (Mask) {
- assert(SrcPartials[0].getBitWidth() == NumElts &&
- "Unexpected partial reduction mask");
- SDValue PartialBits = DAG.getConstant(SrcPartials[0], dl, MaskVT);
- Mask = DAG.getNode(ISD::AND, dl, MaskVT, Mask, PartialBits);
- return DAG.getSetCC(dl, MVT::i1, Mask, PartialBits, ISD::SETEQ);
- }
- }
- }
-
// InstCombine converts:
// `(-x << C0) & C1`
// to
@@ -53595,29 +53573,6 @@ static SDValue combineOr(SDNode *N, SelectionDAG &DAG,
DAG.getBitcast(MVT::v4f32, N1)));
}
- // Match any-of bool scalar reductions into a bitcast/movmsk + cmp.
- // TODO: Support multiple SrcOps.
- if (VT == MVT::i1) {
- SmallVector<SDValue, 2> SrcOps;
- SmallVector<APInt, 2> SrcPartials;
- if (matchScalarReduction(SDValue(N, 0), ISD::OR, SrcOps, &SrcPartials) &&
- SrcOps.size() == 1) {
- unsigned NumElts = SrcOps[0].getValueType().getVectorNumElements();
- EVT MaskVT = EVT::getIntegerVT(*DAG.getContext(), NumElts);
- SDValue Mask = combineBitcastvxi1(DAG, MaskVT, SrcOps[0], dl, Subtarget);
- if (!Mask && TLI.isTypeLegal(SrcOps[0].getValueType()))
- Mask = DAG.getBitcast(MaskVT, SrcOps[0]);
- if (Mask) {
- assert(SrcPartials[0].getBitWidth() == NumElts &&
- "Unexpected partial reduction mask");
- SDValue ZeroBits = DAG.getConstant(0, dl, MaskVT);
- SDValue PartialBits = DAG.getConstant(SrcPartials[0], dl, MaskVT);
- Mask = DAG.getNode(ISD::AND, dl, MaskVT, Mask, PartialBits);
- return DAG.getSetCC(dl, MVT::i1, Mask, ZeroBits, ISD::SETNE);
- }
- }
- }
-
if (SDValue SetCC = combineAndOrForCcmpCtest(N, DAG, DCI, Subtarget))
return SetCC;
diff --git a/llvm/test/CodeGen/X86/movmsk-cmp.ll b/llvm/test/CodeGen/X86/movmsk-cmp.ll
index 09854d197dcd8..e2391f86e75bf 100644
--- a/llvm/test/CodeGen/X86/movmsk-cmp.ll
+++ b/llvm/test/CodeGen/X86/movmsk-cmp.ll
@@ -3775,40 +3775,63 @@ define i1 @movmsk_v8i16(<8 x i16> %x, <8 x i16> %y) {
; SSE: # %bb.0:
; SSE-NEXT: pcmpgtw %xmm1, %xmm0
; SSE-NEXT: packsswb %xmm0, %xmm0
-; SSE-NEXT: pmovmskb %xmm0, %eax
-; SSE-NEXT: notb %al
-; SSE-NEXT: testb $-109, %al
-; SSE-NEXT: sete %al
+; SSE-NEXT: pmovmskb %xmm0, %ecx
+; SSE-NEXT: movl %ecx, %edx
+; SSE-NEXT: movl %ecx, %eax
+; SSE-NEXT: shrb %al
+; SSE-NEXT: andb %cl, %al
+; SSE-NEXT: # kill: def $cl killed $cl killed $ecx
+; SSE-NEXT: shrb $7, %cl
+; SSE-NEXT: andb $16, %dl
+; SSE-NEXT: shrb $4, %dl
+; SSE-NEXT: andb %cl, %dl
+; SSE-NEXT: andb %dl, %al
; SSE-NEXT: retq
;
; AVX1OR2-LABEL: movmsk_v8i16:
; AVX1OR2: # %bb.0:
; AVX1OR2-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
-; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
-; AVX1OR2-NEXT: notb %al
-; AVX1OR2-NEXT: testb $-109, %al
-; AVX1OR2-NEXT: sete %al
+; AVX1OR2-NEXT: vpmovmskb %xmm0, %ecx
+; AVX1OR2-NEXT: movl %ecx, %edx
+; AVX1OR2-NEXT: movl %ecx, %eax
+; AVX1OR2-NEXT: shrb %al
+; AVX1OR2-NEXT: andb %cl, %al
+; AVX1OR2-NEXT: # kill: def $cl killed $cl killed $ecx
+; AVX1OR2-NEXT: shrb $7, %cl
+; AVX1OR2-NEXT: andb $16, %dl
+; AVX1OR2-NEXT: shrb $4, %dl
+; AVX1OR2-NEXT: andb %cl, %dl
+; AVX1OR2-NEXT: andb %dl, %al
; AVX1OR2-NEXT: retq
;
; KNL-LABEL: movmsk_v8i16:
; KNL: # %bb.0:
; KNL-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
-; KNL-NEXT: vpmovsxwq %xmm0, %zmm0
-; KNL-NEXT: vptestnmq %zmm0, %zmm0, %k0
-; KNL-NEXT: kmovw %k0, %eax
-; KNL-NEXT: testb $-109, %al
-; KNL-NEXT: sete %al
-; KNL-NEXT: vzeroupper
+; KNL-NEXT: vpextrw $4, %xmm0, %eax
+; KNL-NEXT: vpextrw $7, %xmm0, %ecx
+; KNL-NEXT: andl %eax, %ecx
+; KNL-NEXT: vpextrw $1, %xmm0, %edx
+; KNL-NEXT: vmovd %xmm0, %eax
+; KNL-NEXT: andl %edx, %eax
+; KNL-NEXT: andl %ecx, %eax
+; KNL-NEXT: # kill: def $al killed $al killed $eax
; KNL-NEXT: retq
;
; SKX-LABEL: movmsk_v8i16:
; SKX: # %bb.0:
; SKX-NEXT: vpcmpgtw %xmm1, %xmm0, %k0
-; SKX-NEXT: knotb %k0, %k0
-; SKX-NEXT: kmovd %k0, %eax
-; SKX-NEXT: testb $-109, %al
-; SKX-NEXT: sete %al
+; SKX-NEXT: kshiftrb $4, %k0, %k1
+; SKX-NEXT: kmovd %k1, %ecx
+; SKX-NEXT: kshiftrb $7, %k0, %k1
+; SKX-NEXT: kmovd %k1, %eax
+; SKX-NEXT: kshiftrb $1, %k0, %k1
+; SKX-NEXT: kmovd %k1, %edx
+; SKX-NEXT: kmovd %k0, %esi
+; SKX-NEXT: andb %dl, %sil
+; SKX-NEXT: andb %cl, %al
+; SKX-NEXT: andb %sil, %al
+; SKX-NEXT: # kill: def $al killed $al killed $eax
; SKX-NEXT: retq
%cmp = icmp sgt <8 x i16> %x, %y
%e1 = extractelement <8 x i1> %cmp, i32 0
@@ -3884,43 +3907,54 @@ define i1 @movmsk_and_v2i64(<2 x i64> %x, <2 x i64> %y) {
; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
; SSE2-NEXT: pand %xmm0, %xmm1
-; SSE2-NEXT: movmskpd %xmm1, %eax
-; SSE2-NEXT: testl %eax, %eax
-; SSE2-NEXT: sete %al
+; SSE2-NEXT: movmskpd %xmm1, %ecx
+; SSE2-NEXT: xorl $3, %ecx
+; SSE2-NEXT: movl %ecx, %eax
+; SSE2-NEXT: shrb %al
+; SSE2-NEXT: andb %cl, %al
; SSE2-NEXT: retq
;
; SSE41-LABEL: movmsk_and_v2i64:
; SSE41: # %bb.0:
; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
-; SSE41-NEXT: movmskpd %xmm0, %eax
-; SSE41-NEXT: testl %eax, %eax
-; SSE41-NEXT: sete %al
+; SSE41-NEXT: movmskpd %xmm0, %ecx
+; SSE41-NEXT: xorl $3, %ecx
+; SSE41-NEXT: movl %ecx, %eax
+; SSE41-NEXT: shrb %al
+; SSE41-NEXT: andb %cl, %al
; SSE41-NEXT: retq
;
; AVX1OR2-LABEL: movmsk_and_v2i64:
; AVX1OR2: # %bb.0:
; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
-; AVX1OR2-NEXT: vtestpd %xmm0, %xmm0
-; AVX1OR2-NEXT: sete %al
+; AVX1OR2-NEXT: vmovmskpd %xmm0, %ecx
+; AVX1OR2-NEXT: xorl $3, %ecx
+; AVX1OR2-NEXT: movl %ecx, %eax
+; AVX1OR2-NEXT: shrb %al
+; AVX1OR2-NEXT: andb %cl, %al
; AVX1OR2-NEXT: retq
;
; KNL-LABEL: movmsk_and_v2i64:
; KNL: # %bb.0:
; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
-; KNL-NEXT: vpcmpeqq %zmm1, %zmm0, %k0
+; KNL-NEXT: vpcmpneqq %zmm1, %zmm0, %k0
+; KNL-NEXT: kshiftrw $1, %k0, %k1
+; KNL-NEXT: kmovw %k1, %ecx
; KNL-NEXT: kmovw %k0, %eax
-; KNL-NEXT: testb $3, %al
-; KNL-NEXT: sete %al
+; KNL-NEXT: andb %cl, %al
+; KNL-NEXT: # kill: def $al killed $al killed $eax
; KNL-NEXT: vzeroupper
; KNL-NEXT: retq
;
; SKX-LABEL: movmsk_and_v2i64:
; SKX: # %bb.0:
; SKX-NEXT: vpcmpneqq %xmm1, %xmm0, %k0
+; SKX-NEXT: kshiftrb $1, %k0, %k1
+; SKX-NEXT: kmovd %k1, %ecx
; SKX-NEXT: kmovd %k0, %eax
-; SKX-NEXT: cmpb $3, %al
-; SKX-NEXT: sete %al
+; SKX-NEXT: andb %cl, %al
+; SKX-NEXT: # kill: def $al killed $al killed $eax
; SKX-NEXT: retq
%cmp = icmp ne <2 x i64> %x, %y
%e1 = extractelement <2 x i1> %cmp, i32 0
@@ -3935,24 +3969,55 @@ define i1 @movmsk_or_v2i64(<2 x i64> %x, <2 x i64> %y) {
; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
; SSE2-NEXT: pand %xmm0, %xmm1
-; SSE2-NEXT: movmskpd %xmm1, %eax
-; SSE2-NEXT: cmpl $3, %eax
-; SSE2-NEXT: setne %al
+; SSE2-NEXT: movmskpd %xmm1, %ecx
+; SSE2-NEXT: xorl $3, %ecx
+; SSE2-NEXT: movl %ecx, %eax
+; SSE2-NEXT: shrb %al
+; SSE2-NEXT: orb %cl, %al
; SSE2-NEXT: retq
;
; SSE41-LABEL: movmsk_or_v2i64:
; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: setne %al
+; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
+; SSE41-NEXT: movmskpd %xmm0, %ecx
+; SSE41-NEXT: xorl $3, %ecx
+; SSE41-NEXT: movl %ecx, %eax
+; SSE41-NEXT: shrb %al
+; SSE41-NEXT: orb %cl, %al
; SSE41-NEXT: retq
;
-; AVX-LABEL: movmsk_or_v2i64:
-; AVX: # %bb.0:
-; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX-NEXT: vptest %xmm0, %xmm0
-; AVX-NEXT: setne %al
-; AVX-NEXT: retq
+; AVX1OR2-LABEL: movmsk_or_v2i64:
+; AVX1OR2: # %bb.0:
+; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
+; AVX1OR2-NEXT: vmovmskpd %xmm0, %ecx
+; AVX1OR2-NEXT: xorl $3, %ecx
+; AVX1OR2-NEXT: movl %ecx, %eax
+; AVX1OR2-NEXT: shrb %al
+; AVX1OR2-NEXT: orb %cl, %al
+; AVX1OR2-NEXT: retq
+;
+; KNL-LABEL: movmsk_or_v2i64:
+; KNL: # %bb.0:
+; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
+; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
+; KNL-NEXT: vpcmpneqq %zmm1, %zmm0, %k0
+; KNL-NEXT: kshiftrw $1, %k0, %k1
+; KNL-NEXT: kmovw %k1, %ecx
+; KNL-NEXT: kmovw %k0, %eax
+; KNL-NEXT: orb %cl, %al
+; KNL-NEXT: # kill: def $al killed $al killed $eax
+; KNL-NEXT: vzeroupper
+; KNL-NEXT: retq
+;
+; SKX-LABEL: movmsk_or_v2i64:
+; SKX: # %bb.0:
+; SKX-NEXT: vpcmpneqq %xmm1, %xmm0, %k0
+; SKX-NEXT: kshiftrb $1, %k0, %k1
+; SKX-NEXT: kmovd %k1, %ecx
+; SKX-NEXT: kmovd %k0, %eax
+; SKX-NEXT: orb %cl, %al
+; SKX-NEXT: # kill: def $al killed $al killed $eax
+; SKX-NEXT: retq
%cmp = icmp ne <2 x i64> %x, %y
%e1 = extractelement <2 x i1> %cmp, i32 0
%e2 = extractelement <2 x i1> %cmp, i32 1
@@ -3985,18 +4050,30 @@ define i1 @movmsk_v4f32(<4 x float> %x, <4 x float> %y) {
; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
; KNL-NEXT: vcmpeq_uqps %zmm1, %zmm0, %k0
+; KNL-NEXT: kshiftrw $3, %k0, %k1
+; KNL-NEXT: kmovw %k1, %ecx
+; KNL-NEXT: kshiftrw $2, %k0, %k1
+; KNL-NEXT: kmovw %k1, %edx
+; KNL-NEXT: kshiftrw $1, %k0, %k0
; KNL-NEXT: kmovw %k0, %eax
-; KNL-NEXT: testb $14, %al
-; KNL-NEXT: setne %al
+; KNL-NEXT: orb %dl, %al
+; KNL-NEXT: orb %cl, %al
+; KNL-NEXT: # kill: def $al killed $al killed $eax
; KNL-NEXT: vzeroupper
; KNL-NEXT: retq
;
; SKX-LABEL: movmsk_v4f32:
; SKX: # %bb.0:
; SKX-NEXT: vcmpeq_uqps %xmm1, %xmm0, %k0
+; SKX-NEXT: kshiftrb $3, %k0, %k1
+; SKX-NEXT: kmovd %k1, %ecx
+; SKX-NEXT: kshiftrb $2, %k0, %k1
+; SKX-NEXT: kmovd %k1, %edx
+; SKX-NEXT: kshiftrb $1, %k0, %k0
; SKX-NEXT: kmovd %k0, %eax
-; SKX-NEXT: testb $14, %al
-; SKX-NEXT: setne %al
+; SKX-NEXT: orb %dl, %al
+; SKX-NEXT: orb %cl, %al
+; SKX-NEXT: # kill: def $al killed $al killed $eax
; SKX-NEXT: retq
%cmp = fcmp ueq <4 x float> %x, %y
%e1 = extractelement <4 x i1> %cmp, i32 1
@@ -4011,17 +4088,19 @@ define i1 @movmsk_and_v2f64(<2 x double> %x, <2 x double> %y) {
; SSE-LABEL: movmsk_and_v2f64:
; SSE: # %bb.0:
; SSE-NEXT: cmplepd %xmm0, %xmm1
-; SSE-NEXT: movmskpd %xmm1, %eax
-; SSE-NEXT: cmpl $3, %eax
-; SSE-NEXT: sete %al
+; SSE-NEXT: movmskpd %xmm1, %ecx
+; SSE-NEXT: movl %ecx, %eax
+; SSE-NEXT: shrb %al
+; SSE-NEXT: andb %cl, %al
; SSE-NEXT: retq
;
; AVX1OR2-LABEL: movmsk_and_v2f64:
; AVX1OR2: # %bb.0:
; AVX1OR2-NEXT: vcmplepd %xmm0, %xmm1, %xmm0
-; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
-; AVX1OR2-NEXT: vtestpd %xmm1, %xmm0
-; AVX1OR2-NEXT: setb %al
+; AVX1OR2-NEXT: vmovmskpd %xmm0, %ecx
+; AVX1OR2-NEXT: movl %ecx, %eax
+; AVX1OR2-NEXT: shrb %al
+; AVX1OR2-NEXT: andb %cl, %al
; AVX1OR2-NEXT: retq
;
; KNL-LABEL: movmsk_and_v2f64:
@@ -4029,19 +4108,22 @@ define i1 @movmsk_and_v2f64(<2 x double> %x, <2 x double> %y) {
; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
; KNL-NEXT: vcmplepd %zmm0, %zmm1, %k0
-; KNL-NEXT: knotw %k0, %k0
+; KNL-NEXT: kshiftrw $1, %k0, %k1
+; KNL-NEXT: kmovw %k1, %ecx
; KNL-NEXT: kmovw %k0, %eax
-; KNL-NEXT: testb $3, %al
-; KNL-NEXT: sete %al
+; KNL-NEXT: andb %cl, %al
+; KNL-NEXT: # kill: def $al killed $al killed $eax
; KNL-NEXT: vzeroupper
; KNL-NEXT: retq
;
; SKX-LABEL: movmsk_and_v2f64:
; SKX: # %bb.0:
; SKX-NEXT: vcmplepd %xmm0, %xmm1, %k0
+; SKX-NEXT: kshiftrb $1, %k0, %k1
+; SKX-NEXT: kmovd %k1, %ecx
; SKX-NEXT: kmovd %k0, %eax
-; SKX-NEXT: cmpb $3, %al
-; SKX-NEXT: sete %al
+; SKX-NEXT: andb %cl, %al
+; SKX-NEXT: # kill: def $al killed $al killed $eax
; SKX-NEXT: retq
%cmp = fcmp oge <2 x double> %x, %y
%e1 = extractelement <2 x i1> %cmp, i32 0
@@ -4054,16 +4136,19 @@ define i1 @movmsk_or_v2f64(<2 x double> %x, <2 x double> %y) {
; SSE-LABEL: movmsk_or_v2f64:
; SSE: # %bb.0:
; SSE-NEXT: cmplepd %xmm0, %xmm1
-; SSE-NEXT: movmskpd %xmm1, %eax
-; SSE-NEXT: testl %eax, %eax
-; SSE-NEXT: setne %al
+; SSE-NEXT: movmskpd %xmm1, %ecx
+; SSE-NEXT: movl %ecx, %eax
+; SSE-NEXT: shrb %al
+; SSE-NEXT: orb %cl, %al
; SSE-NEXT: retq
;
; AVX1OR2-LABEL: movmsk_or_v2f64:
; AVX1OR2: # %bb.0:
; AVX1OR2-NEXT: vcmplepd %xmm0, %xmm1, %xmm0
-; AVX1OR2-NEXT: vtestpd %xmm0, %xmm0
-; AVX1OR2-NEXT: setne %al
+; AVX1OR2-NEXT: vmovmskpd %xmm0, %ecx
+; AVX1OR2-NEXT: movl %ecx, %eax
+; AVX1OR2-NEXT: shrb %al
+; AVX1OR2-NEXT: orb %cl, %al
; AVX1OR2-NEXT: retq
;
; KNL-LABEL: movmsk_or_v2f64:
@@ -4071,17 +4156,22 @@ define i1 @movmsk_or_v2f64(<2 x double> %x, <2 x double> %y) {
; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
; KNL-NEXT: vcmplepd %zmm0, %zmm1, %k0
+; KNL-NEXT: kshiftrw $1, %k0, %k1
+; KNL-NEXT: kmovw %k1, %ecx
; KNL-NEXT: kmovw %k0, %eax
-; KNL-NEXT: testb $3, %al
-; KNL-NEXT: setne %al
+; KNL-NEXT: orb %cl, %al
+; KNL-NEXT: # kill: def $al killed $al killed $eax
; KNL-NEXT: vzeroupper
; KNL-NEXT: retq
;
; SKX-LABEL: movmsk_or_v2f64:
; SKX: # %bb.0:
; SKX-NEXT: vcmplepd %xmm0, %xmm1, %k0
-; SKX-NEXT: kortestb %k0, %k0
-; SKX-NEXT: setne %al
+; SKX-NEXT: kshiftrb $1, %k0, %k1
+; SKX-NEXT: kmovd %k1, %ecx
+; SKX-NEXT: kmovd %k0, %eax
+; SKX-NEXT: orb %cl, %al
+; SKX-NEXT: # kill: def $al killed $al killed $eax
; SKX-NEXT: retq
%cmp = fcmp oge <2 x double> %x, %y
%e1 = extractelement <2 x i1> %cmp, i32 0
@@ -4422,21 +4512,25 @@ define i32 @PR39665_c_ray_select(<2 x double> %x, <2 x double> %y) {
; SSE-LABEL: PR39665_c_ray_select:
; SSE: # %bb.0:
; SSE-NEXT: cmpltpd %xmm0, %xmm1
-; SSE-NEXT: movmskpd %xmm1, %eax
-; SSE-NEXT: cmpl $3, %eax
-; SSE-NEXT: movl $42, %ecx
-; SSE-NEXT: movl $99, %eax
-; SSE-NEXT: cmovel %ecx, %eax
+; SSE-NEXT: movmskpd %xmm1, %ecx
+; SSE-NEXT: testb $2, %cl
+; SSE-NEXT: movl $42, %eax
+; SSE-NEXT: movl $99, %edx
+; SSE-NEXT: cmovel %edx, %eax
+; SSE-NEXT: testb $1, %cl
+; SSE-NEXT: cmovel %edx, %eax
; SSE-NEXT: retq
;
; AVX1OR2-LABEL: PR39665_c_ray_select:
; AVX1OR2: # %bb.0:
; AVX1OR2-NEXT: vcmpltpd %xmm0, %xmm1, %xmm0
-; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
-; AVX1OR2-NEXT: vtestpd %xmm1, %xmm0
-; AVX1OR2-NEXT: movl $42, %ecx
-; AVX1OR2-NEXT: movl $99, %eax
-; AVX1OR2-NEXT: cmovbl %ecx, %eax
+; AVX1OR2-NEXT: vmovmskpd %xmm0, %ecx
+; AVX1OR2-NEXT: testb $2, %cl
+; AVX1OR2-NEXT: movl $42, %eax
+; AVX1OR2-NEXT: movl $99, %edx
+; AVX1OR2-NEXT: cmovel %edx, %eax
+; AVX1OR2-NEXT: testb $1, %cl
+; AVX1OR2-NEXT: cmovel %edx, %eax
; AVX1OR2-NEXT: retq
;
; KNL-LABEL: PR39665_c_ray_select:
@@ -4444,24 +4538,26 @@ define i32 @PR39665_c_ray_select(<2 x double> %x, <2 x double> %y) {
; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
; KNL-NEXT: vcmpltpd %zmm0, %zmm1, %k0
-; KNL-NEXT: knotw %k0, %k0
-; KNL-NEXT: kmovw %k0, %eax
-; KNL-NEXT: testb $3, %al
-; KNL-NEXT: movl $42, %ecx
-; KNL-NEXT: movl $99, %eax
-; KNL-NEXT: cmovel %ecx, %eax
+; KNL-NEXT: kmovw %k0, %ecx
+; KNL-NEXT: testb $2, %cl
+; KNL-NEXT: movl $42, %eax
+; KNL-NEXT: movl $99, %edx
+; KNL-NEXT: cmovel %edx, %eax
+; KNL-NEXT: testb $1, %cl
+; KNL-NEXT: cmovel %edx, %eax
; KNL-NEXT: vzeroupper
; KNL-NEXT: retq
;
; SKX-LABEL: PR39665_c_ray_select:
; SKX: # %bb.0:
; SKX-NEXT: vcmpltpd %xmm0, %xmm1, %k0
-; SKX-NEXT: knotw %k0, %k0
-; SKX-NEXT: kmovd %k0, %eax
-; SKX-NEXT: testb $3, %al
-; SKX-NEXT: movl $42, %ecx
-; SKX-NEXT: movl $99, %eax
-; SKX-NEXT: cmovel %ecx, %eax
+; SKX-NEXT: kmovd %k0, %ecx
+; SKX-NEXT: testb $2, %cl
+; SKX-NEXT: movl $42, %eax
+; SKX-NEXT: movl $99, %edx
+; SKX-NEXT: cmovel %edx, %eax
+; SKX-NEXT: testb $1, %cl
+; SKX-NEXT: cmovel %edx, %eax
; SKX-NEXT: retq
%cmp = fcmp fast ogt <2 x double> %x, %y
%b0 = extractelement <2 x i1> %cmp, i64 0
diff --git a/llvm/test/CodeGen/X86/pr120093.ll b/llvm/test/CodeGen/X86/pr120093.ll
index 99bf2218c5538..08c6d7558f985 100644
--- a/llvm/test/CodeGen/X86/pr120093.ll
+++ b/llvm/test/CodeGen/X86/pr120093.ll
@@ -9,7 +9,10 @@ define double @PR120093() {
; CHECK-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
; CHECK-NEXT: cmpnltpd %xmm1, %xmm0
; CHECK-NEXT: movmskpd %xmm0, %eax
-; CHECK-NEXT: cmpl $3, %eax
+; CHECK-NEXT: movl %eax, %ecx
+; CHECK-NEXT: shrb %cl
+; CHECK-NEXT: andb %al, %cl
+; CHECK-NEXT: cmpb $1, %cl
; CHECK-NEXT: jne .LBB0_2
; CHECK-NEXT: # %bb.1: # %bb2
; CHECK-NEXT: xorpd %xmm0, %xmm0
diff --git a/llvm/test/CodeGen/X86/setcc-logic.ll b/llvm/test/CodeGen/X86/setcc-logic.ll
index c577849b45ee8..085bda7f58bea 100644
--- a/llvm/test/CodeGen/X86/setcc-logic.ll
+++ b/llvm/test/CodeGen/X86/setcc-logic.ll
@@ -308,7 +308,10 @@ define i32 @vec_extract_branch(<2 x double> %x) {
; CHECK-NEXT: xorpd %xmm1, %xmm1
; CHECK-NEXT: cmpltpd %xmm0, %xmm1
; CHECK-NEXT: movmskpd %xmm1, %eax
-; CHECK-NEXT: cmpl $3, %eax
+; CHECK-NEXT: movl %eax, %ecx
+; CHECK-NEXT: shrb %cl
+; CHECK-NEXT: andb %al, %cl
+; CHECK-NEXT: cmpb $1, %cl
; CHECK-NEXT: jne .LBB16_2
; CHECK-NEXT: # %bb.1: # %true
; CHECK-NEXT: movl $42, %eax
diff --git a/llvm/test/CodeGen/X86/vector-compare-all_of.ll b/llvm/test/CodeGen/X86/vector-compare-all_of.ll
index ff079ffaeeb1f..9600454b382c6 100644
--- a/llvm/test/CodeGen/X86/vector-compare-all_of.ll
+++ b/llvm/test/CodeGen/X86/vector-compare-all_of.ll
@@ -1405,9 +1405,10 @@ define i1 @select_v2i8(ptr %s0, ptr %s1) {
; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
-; SSE2-NEXT: movmskpd %xmm0, %eax
-; SSE2-NEXT: cmpl $3, %eax
-; SSE2-NEXT: sete %al
+; SSE2-NEXT: movmskpd %xmm0, %ecx
+; SSE2-NEXT: movl %ecx, %eax
+; SSE2-NEXT: shrb %al
+; SSE2-NEXT: andb %cl, %al
; SSE2-NEXT: retq
;
; SSE42-LABEL: select_v2i8:
@@ -1418,9 +1419,10 @@ define i1 @select_v2i8(ptr %s0, ptr %s1) {
; SSE42-NEXT: movd %eax, %xmm1
; SSE42-NEXT: pcmpeqb %xmm0, %xmm1
; SSE42-NEXT: pmovsxbq %xmm1, %xmm0
-; SSE42-NEXT: movmskpd %xmm0, %eax
-; SSE42-NEXT: cmpl $3, %eax
-; SSE42-NEXT: sete %al
+; SSE42-NEXT: movmskpd %xmm0, %ecx
+; SSE42-NEXT: movl %ecx, %eax
+; SSE42-NEXT: shrb %al
+; SSE42-NEXT: andb %cl, %al
; SSE42-NEXT: retq
;
; AVX1OR2-LABEL: select_v2i8:
@@ -1431,9 +1433,10 @@ define i1 @select_v2i8(ptr %s0, ptr %s1) {
; AVX1OR2-NEXT: vmovd %eax, %xmm1
; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
; AVX1OR2-NEXT: vpmovsxbq %xmm0, %xmm0
-; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
-; AVX1OR2-NEXT: vtestpd %xmm1, %xmm0
-; AVX1OR2-NEXT: setb %al
+; AVX1OR2-NEXT: vmovmskpd %xmm0, %ecx
+; AVX1OR2-NEXT: movl %ecx, %eax
+; AVX1OR2-NEXT: shrb %al
+; AVX1OR2-NEXT: andb %cl, %al
; AVX1OR2-NEXT: retq
;
; AVX512-LABEL: select_v2i8:
@@ -1443,10 +1446,11 @@ define i1 @select_v2i8(ptr %s0, ptr %s1) {
; AVX512-NEXT: movzwl (%rsi), %eax
; AVX512-NEXT: vmovd %eax, %xmm1
; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %k0
-; AVX512-NEXT: knotw %k0, %k0
+; AVX512-NEXT: kshiftrw $1, %k0, %k1
+; AVX512-NEXT: kmovd %k1, %ecx
; AVX512-NEXT: kmovd %k0, %eax
-; AVX512-NEXT: testb $3, %al
-; AVX512-NEXT: sete %al
+; AVX512-NEXT: andb %cl, %al
+; AVX512-NEXT: # kill: def $al killed $al killed $eax
; AVX512-NEXT: retq
%v0 = load <2 x i8>, ptr %s0, align 1
%v1 = load <2 x i8>, ptr %s1, align 1
diff --git a/llvm/test/CodeGen/X86/vector-compare-any_of.ll b/llvm/test/CodeGen/X86/vector-compare-any_of.ll
index d5ac9910906a8..de01e7bd7c7c5 100644
--- a/llvm/test/CodeGen/X86/vector-compare-any_of.ll
+++ b/llvm/test/CodeGen/X86/vector-compare-any_of.ll
@@ -1288,9 +1288,10 @@ define i1 @select_v2i8(ptr %s0, ptr %s1) {
; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
-; SSE2-NEXT: movmskpd %xmm0, %eax
-; SSE2-NEXT: testl %eax, %eax
-; SSE2-NEXT: setne %al
+; SSE2-NEXT: movmskpd %xmm0, %ecx
+; SSE2-NEXT: movl %ecx, %eax
+; SSE2-NEXT: shrb %al
+; SSE2-NEXT: orb %cl, %al
; SSE2-NEXT: retq
;
; SSE42-LABEL: select_v2i8:
@@ -1301,9 +1302,10 @@ define i1 @select_v2i8(ptr %s0, ptr %s1) {
; SSE42-NEXT: movd %eax, %xmm1
; SSE42-NEXT: pcmpeqb %xmm0, %xmm1
; SSE42-NEXT: pmovsxbq %xmm1, %xmm0
-; SSE42-NEXT: movmskpd %xmm0, %eax
-; SSE42-NEXT: testl %eax, %eax
-; SSE42-NEXT: setne %al
+; SSE42-NEXT: movmskpd %xmm0, %ecx
+; SSE42-NEXT: movl %ecx, %eax
+; SSE42-NEXT: shrb %al
+; SSE42-NEXT: orb %cl, %al
; SSE42-NEXT: retq
;
; AVX1OR2-LABEL: select_v2i8:
@@ -1314,8 +1316,10 @@ define i1 @select_v2i8(ptr %s0, ptr %s1) {
; AVX1OR2-NEXT: vmovd %eax, %xmm1
; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
; AVX1OR2-NEXT: vpmovsxbq %xmm0, %xmm0
-; AVX1OR2-NEXT: vtestpd %xmm0, %xmm0
-; AVX1OR2-NEXT: setne %al
+; AVX1OR2-NEXT: vmovmskpd %xmm0, %ecx
+; AVX1OR2-NEXT: movl %ecx, %eax
+; AVX1OR2-NEXT: shrb %al
+; AVX1OR2-NEXT: orb %cl, %al
; AVX1OR2-NEXT: retq
;
; AVX512-LABEL: select_v2i8:
@@ -1325,9 +1329,11 @@ define i1 @select_v2i8(ptr %s0, ptr %s1) {
; AVX512-NEXT: movzwl (%rsi), %eax
; AVX512-NEXT: vmovd %eax, %xmm1
; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %k0
+; AVX512-NEXT: kshiftrw $1, %k0, %k1
+; AVX512-NEXT: kmovd %k1, %ecx
; AVX512-NEXT: kmovd %k0, %eax
-; AVX512-NEXT: testb $3, %al
-; AVX512-NEXT: setne %al
+; AVX512-NEXT: orb %cl, %al
+; AVX512-NEXT: # kill: def $al killed $al killed $eax
; AVX512-NEXT: retq
%v0 = load <2 x i8>, ptr %s0, align 1
%v1 = load <2 x i8>, ptr %s1, align 1
More information about the llvm-commits
mailing list