diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 2d52e65aca1fb..b5d930ed4f7c3 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -59800,14 +59800,18 @@ static SDValue combineSCALAR_TO_VECTOR(SDNode *N, SelectionDAG &DAG, DAG.getZExtOrTrunc(ZeroExt, DL, MVT::i32)))); } - if (VT == MVT::v2i64 && Src.getOpcode() == ISD::BITCAST) { + if (Src.getOpcode() == ISD::BITCAST) { SDValue SrcOp = Src.getOperand(0); + // Combine (v4i32 (scalar_to_vector (i32 (bitcast (float))))) to MOVD. + if (VT == MVT::v4i32 && SrcOp.getValueType() == MVT::f32) + return DAG.getBitcast( + VT, DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, MVT::v4f32, SrcOp)); // Combine (v2i64 (scalar_to_vector (i64 (bitcast (double))))) to MOVQ. - if (SrcOp.getValueType() == MVT::f64) + if (VT == MVT::v2i64 && SrcOp.getValueType() == MVT::f64) return DAG.getBitcast( VT, DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, MVT::v2f64, SrcOp)); // Combine (v2i64 (scalar_to_vector (i64 (bitcast (mmx))))) to MOVQ2DQ. - if (SrcOp.getValueType() == MVT::x86mmx) + if (VT == MVT::v2i64 && SrcOp.getValueType() == MVT::x86mmx) return DAG.getNode(X86ISD::MOVQ2DQ, DL, VT, SrcOp); } diff --git a/llvm/test/CodeGen/X86/scalarize-fp.ll b/llvm/test/CodeGen/X86/scalarize-fp.ll index 410de083a01ab..ea9b69f8f5b80 100644 --- a/llvm/test/CodeGen/X86/scalarize-fp.ll +++ b/llvm/test/CodeGen/X86/scalarize-fp.ll @@ -911,8 +911,6 @@ define <4 x float> @merge_fcmp_cmpeqss_v4f32(<4 x float> %x, <4 x float> %y) { ; AVX1-LABEL: merge_fcmp_cmpeqss_v4f32: ; AVX1: # %bb.0: ; AVX1-NEXT: vcmpeqss %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vmovd %xmm1, %eax -; AVX1-NEXT: vmovd %eax, %xmm1 ; AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX1-NEXT: retq ;