diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -34853,7 +34853,7 @@ return false; if (!Subtarget.hasVLX() && !VT.is512BitVector()) return false; - if (!VT.isVector()) + if (!VT.isVector() || VT.getScalarType() == MVT::i1) return false; return true; diff --git a/llvm/test/CodeGen/X86/fold-select.ll b/llvm/test/CodeGen/X86/fold-select.ll --- a/llvm/test/CodeGen/X86/fold-select.ll +++ b/llvm/test/CodeGen/X86/fold-select.ll @@ -4,16 +4,9 @@ define <8 x float> @select_and_v8i1(<8 x i1> %a, <8 x i1> %b, <8 x i1> %c, <8 x float> %d) { ; CHECK-LABEL: select_and_v8i1: ; CHECK: # %bb.0: -; CHECK-NEXT: vpsllw $15, %xmm2, %xmm4 +; CHECK-NEXT: vpternlogq $200, %xmm1, %xmm2, %xmm0 ; CHECK-NEXT: vpsllw $15, %xmm0, %xmm0 ; CHECK-NEXT: vpmovw2m %xmm0, %k1 -; CHECK-NEXT: vpxor %xmm0, %xmm0, %xmm0 -; CHECK-NEXT: vpcmpgtw %xmm4, %xmm0, %k0 {%k1} -; CHECK-NEXT: vpand %xmm1, %xmm2, %xmm0 -; CHECK-NEXT: vpsllw $15, %xmm0, %xmm0 -; CHECK-NEXT: vpmovw2m %xmm0, %k2 -; CHECK-NEXT: kandnb %k2, %k1, %k1 -; CHECK-NEXT: korb %k1, %k0, %k1 ; CHECK-NEXT: vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] ; CHECK-NEXT: vmovaps %ymm3, %ymm0 {%k1} ; CHECK-NEXT: retq @@ -26,13 +19,9 @@ define <8 x float> @select_and_v8i1_2(i8 %m1, i8 %m2, i8 %m3, <8 x float> %d) { ; CHECK-LABEL: select_and_v8i1_2: ; CHECK: # %bb.0: -; CHECK-NEXT: kmovd %edi, %k0 -; CHECK-NEXT: andl %edx, %esi -; CHECK-NEXT: kmovd %edx, %k1 -; CHECK-NEXT: kandb %k0, %k1, %k1 -; CHECK-NEXT: kmovd %esi, %k2 -; CHECK-NEXT: kandnb %k2, %k0, %k0 -; CHECK-NEXT: korb %k0, %k1, %k1 +; CHECK-NEXT: orl %esi, %edi +; CHECK-NEXT: andl %edx, %edi +; CHECK-NEXT: kmovd %edi, %k1 ; CHECK-NEXT: vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] ; CHECK-NEXT: vmovaps %ymm0, %ymm1 {%k1} ; CHECK-NEXT: vmovaps %ymm1, %ymm0 @@ -49,11 +38,10 @@ define <8 x float> @select_and_v8i1_3(<8 x i16> %m1, <8 x i16> %m2, <8 x i16> %m3, <8 x float> %d) { ; CHECK-LABEL: select_and_v8i1_3: ; CHECK: # %bb.0: -; CHECK-NEXT: vpcmpeqw %xmm2, %xmm1, %k1 -; CHECK-NEXT: vpcmpeqw %xmm1, %xmm0, %k0 {%k1} -; CHECK-NEXT: vpcmpeqw %xmm2, %xmm0, %k1 {%k1} -; CHECK-NEXT: vpcmpneqw %xmm1, %xmm0, %k1 {%k1} +; CHECK-NEXT: vpcmpeqw %xmm1, %xmm0, %k0 +; CHECK-NEXT: vpcmpeqw %xmm2, %xmm0, %k1 ; CHECK-NEXT: korb %k1, %k0, %k1 +; CHECK-NEXT: vpcmpeqw %xmm2, %xmm1, %k1 {%k1} ; CHECK-NEXT: vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] ; CHECK-NEXT: vmovaps %ymm3, %ymm0 {%k1} ; CHECK-NEXT: retq @@ -69,15 +57,13 @@ define <8 x float> @select_or_v8i1(<8 x i1> %a, <8 x i1> %b, <8 x i1> %c, <8 x float> %d) { ; CHECK-LABEL: select_or_v8i1: ; CHECK: # %bb.0: -; CHECK-NEXT: vpsllw $15, %xmm2, %xmm4 -; CHECK-NEXT: vpsllw $15, %xmm0, %xmm0 -; CHECK-NEXT: vpmovw2m %xmm0, %k1 -; CHECK-NEXT: vpxor %xmm0, %xmm0, %xmm0 -; CHECK-NEXT: vpcmpgtw %xmm4, %xmm0, %k0 {%k1} -; CHECK-NEXT: vpor %xmm1, %xmm2, %xmm0 +; CHECK-NEXT: vpsllw $15, %xmm2, %xmm2 +; CHECK-NEXT: vpmovw2m %xmm2, %k0 +; CHECK-NEXT: vpsllw $15, %xmm1, %xmm1 +; CHECK-NEXT: vpmovw2m %xmm1, %k1 ; CHECK-NEXT: vpsllw $15, %xmm0, %xmm0 ; CHECK-NEXT: vpmovw2m %xmm0, %k2 -; CHECK-NEXT: kandnb %k2, %k1, %k1 +; CHECK-NEXT: kandnb %k1, %k2, %k1 ; CHECK-NEXT: korb %k1, %k0, %k1 ; CHECK-NEXT: vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] ; CHECK-NEXT: vmovaps %ymm3, %ymm0 {%k1} @@ -92,12 +78,10 @@ ; CHECK-LABEL: select_or_v8i1_2: ; CHECK: # %bb.0: ; CHECK-NEXT: kmovd %edi, %k0 -; CHECK-NEXT: orl %edx, %esi -; CHECK-NEXT: kmovd %edx, %k1 -; CHECK-NEXT: kandb %k0, %k1, %k1 -; CHECK-NEXT: kmovd %esi, %k2 -; CHECK-NEXT: kandnb %k2, %k0, %k0 -; CHECK-NEXT: korb %k0, %k1, %k1 +; CHECK-NEXT: kmovd %esi, %k1 +; CHECK-NEXT: kmovd %edx, %k2 +; CHECK-NEXT: kandnb %k1, %k0, %k0 +; CHECK-NEXT: korb %k0, %k2, %k1 ; CHECK-NEXT: vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] ; CHECK-NEXT: vmovaps %ymm0, %ymm1 {%k1} ; CHECK-NEXT: vmovaps %ymm1, %ymm0 @@ -114,12 +98,10 @@ define <8 x float> @select_or_v8i1_3(<8 x i16> %m1, <8 x i16> %m2, <8 x i16> %m3, <8 x float> %d) { ; CHECK-LABEL: select_or_v8i1_3: ; CHECK: # %bb.0: -; CHECK-NEXT: vpcmpeqw %xmm2, %xmm0, %k0 -; CHECK-NEXT: vpcmpeqw %xmm2, %xmm1, %k1 -; CHECK-NEXT: korb %k0, %k1, %k2 -; CHECK-NEXT: vpcmpneqw %xmm1, %xmm0, %k0 {%k2} -; CHECK-NEXT: vpcmpeqw %xmm1, %xmm0, %k1 {%k1} -; CHECK-NEXT: korb %k0, %k1, %k1 +; CHECK-NEXT: vpcmpneqw %xmm1, %xmm0, %k1 +; CHECK-NEXT: vpcmpeqw %xmm2, %xmm1, %k0 +; CHECK-NEXT: vpcmpeqw %xmm2, %xmm0, %k1 {%k1} +; CHECK-NEXT: korb %k1, %k0, %k1 ; CHECK-NEXT: vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] ; CHECK-NEXT: vmovaps %ymm3, %ymm0 {%k1} ; CHECK-NEXT: retq