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,8 +34853,13 @@ return false; if (!Subtarget.hasVLX() && !VT.is512BitVector()) return false; + if (!VT.isSimple()) + return false; if (!VT.isVector()) return false; + // Not for i1 vectors because there is no mask instruction for vXi1. + if (VT.getSimpleVT().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,15 +19,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}