Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -26815,12 +26815,18 @@ SDLoc DL(N); const TargetLowering &TLI = DAG.getTargetLoweringInfo(); - // Condition value type must match vselect operand type. - if (N->getOpcode() != ISD::VSELECT || CondVT != VT) + if (N->getOpcode() != ISD::VSELECT) return SDValue(); - assert(Cond.getValueType().isVector() && - "Vector select expects a vector selector!"); + assert(CondVT.isVector() && "Vector select expects a vector selector!"); + + // To use the condition operand as a bitwise mask, it must have elements that + // are the same size as the select elements. Ie, the condition operand must + // have already been promoted from the IR select condition type . + // Don't check if the types themselves are equal because that excludes + // vector floating-point selects. + if (CondVT.getScalarSizeInBits() != VT.getScalarSizeInBits()) + return SDValue(); bool TValIsAllOnes = ISD::isBuildVectorAllOnes(LHS.getNode()); bool FValIsAllZeros = ISD::isBuildVectorAllZeros(RHS.getNode()); Index: test/CodeGen/X86/avx512-cvt.ll =================================================================== --- test/CodeGen/X86/avx512-cvt.ll +++ test/CodeGen/X86/avx512-cvt.ll @@ -415,9 +415,9 @@ ; KNL-LABEL: fptrunc02: ; KNL: ## BB#0: ; KNL-NEXT: vpslld $31, %xmm1, %xmm1 +; KNL-NEXT: vpsrad $31, %xmm1, %xmm1 ; KNL-NEXT: vcvtpd2psy %ymm0, %xmm0 -; KNL-NEXT: vxorps %xmm2, %xmm2, %xmm2 -; KNL-NEXT: vblendvps %xmm1, %xmm0, %xmm2, %xmm0 +; KNL-NEXT: vpand %xmm0, %xmm1, %xmm0 ; KNL-NEXT: retq ; ; SKX-LABEL: fptrunc02: @@ -445,8 +445,7 @@ ; KNL: ## BB#0: ; KNL-NEXT: vcvtps2pd %xmm0, %ymm0 ; KNL-NEXT: vcmpltpd %ymm2, %ymm1, %ymm1 -; KNL-NEXT: vxorpd %ymm2, %ymm2, %ymm2 -; KNL-NEXT: vblendvpd %ymm1, %ymm0, %ymm2, %ymm0 +; KNL-NEXT: vandpd %ymm0, %ymm1, %ymm0 ; KNL-NEXT: retq ; ; SKX-LABEL: fpext01: Index: test/CodeGen/X86/select-with-and-or.ll =================================================================== --- test/CodeGen/X86/select-with-and-or.ll +++ test/CodeGen/X86/select-with-and-or.ll @@ -91,8 +91,7 @@ ; CHECK-LABEL: test1f: ; CHECK: # BB#0: ; CHECK-NEXT: vcmpnlepd %xmm0, %xmm1, %xmm0 -; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm0 +; CHECK-NEXT: vandpd %xmm2, %xmm0, %xmm0 ; CHECK-NEXT: retq ; %f = fcmp ult <2 x double> %a, %b @@ -104,8 +103,7 @@ ; CHECK-LABEL: test2f: ; CHECK: # BB#0: ; CHECK-NEXT: vcmpnlepd %xmm0, %xmm1, %xmm0 -; CHECK-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0 +; CHECK-NEXT: vorpd %xmm2, %xmm0, %xmm0 ; CHECK-NEXT: retq ; %f = fcmp ult <2 x double> %a, %b @@ -116,9 +114,8 @@ define <2 x double> @test3f(<2 x double> %a, <2 x double> %b, <2 x double> %c) { ; CHECK-LABEL: test3f: ; CHECK: # BB#0: -; CHECK-NEXT: vcmpnlepd %xmm0, %xmm1, %xmm0 -; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0 +; CHECK-NEXT: vcmplepd %xmm0, %xmm1, %xmm0 +; CHECK-NEXT: vandpd %xmm2, %xmm0, %xmm0 ; CHECK-NEXT: retq ; %f = fcmp ult <2 x double> %a, %b @@ -129,9 +126,8 @@ define <2 x double> @test4f(<2 x double> %a, <2 x double> %b, <2 x double> %c) { ; CHECK-LABEL: test4f: ; CHECK: # BB#0: -; CHECK-NEXT: vcmpnlepd %xmm0, %xmm1, %xmm0 -; CHECK-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm0 +; CHECK-NEXT: vcmplepd %xmm0, %xmm1, %xmm0 +; CHECK-NEXT: vorpd %xmm2, %xmm0, %xmm0 ; CHECK-NEXT: retq ; %f = fcmp ult <2 x double> %a, %b @@ -143,9 +139,6 @@ ; CHECK-LABEL: test5f: ; CHECK: # BB#0: ; CHECK-NEXT: vcmpnlepd %xmm0, %xmm1, %xmm0 -; CHECK-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vxorpd %xmm2, %xmm2, %xmm2 -; CHECK-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0 ; CHECK-NEXT: retq ; %f = fcmp ult <2 x double> %a, %b @@ -156,10 +149,7 @@ define <2 x double> @test6f(<2 x double> %a, <2 x double> %b, <2 x double> %c) { ; CHECK-LABEL: test6f: ; CHECK: # BB#0: -; CHECK-NEXT: vcmpnlepd %xmm0, %xmm1, %xmm0 -; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; CHECK-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0 +; CHECK-NEXT: vcmplepd %xmm0, %xmm1, %xmm0 ; CHECK-NEXT: retq ; %f = fcmp ult <2 x double> %a, %b @@ -171,8 +161,7 @@ ; CHECK-LABEL: test7f: ; CHECK: # BB#0: ; CHECK-NEXT: vcmpnlepd %xmm0, %xmm1, %xmm0 -; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendvpd %xmm0, (%rdi), %xmm1, %xmm0 +; CHECK-NEXT: vandpd (%rdi), %xmm0, %xmm0 ; CHECK-NEXT: retq ; %f = fcmp ult <2 x double> %a, %b