Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -27153,13 +27153,18 @@ } if (Match) { unsigned SrcSize = std::max(128u, NumDstElts * MaskEltSize); - SrcVT = MVT::getVectorVT(MaskVT.getScalarType(), SrcSize / MaskEltSize); - if (SrcVT != MaskVT) + MVT ScalarTy = MaskVT.isInteger() ? MaskVT.getScalarType() : + MVT::getIntegerVT(MaskEltSize); + SrcVT = MVT::getVectorVT(ScalarTy, SrcSize / MaskEltSize); + + if (SrcVT.getSizeInBits() != MaskVT.getSizeInBits()) { V1 = extractSubVector(V1, 0, DAG, DL, SrcSize); + Shuffle = unsigned(X86ISD::VZEXT); + } else + Shuffle = unsigned(ISD::ZERO_EXTEND_VECTOR_INREG); + DstVT = MVT::getIntegerVT(Scale * MaskEltSize); DstVT = MVT::getVectorVT(DstVT, NumDstElts); - Shuffle = SrcVT != MaskVT ? unsigned(X86ISD::VZEXT) - : unsigned(ISD::ZERO_EXTEND_VECTOR_INREG); return true; } } Index: test/CodeGen/X86/pr34577.ll =================================================================== --- /dev/null +++ test/CodeGen/X86/pr34577.ll @@ -0,0 +1,10 @@ +; RUN: llc -mattr=+avx2 -mtriple=x86_64-unknown %s + +define internal fastcc <8 x float> @test(<8 x float> %inp0, <8 x float> %inp1, <8 x float> %inp2) #0 { +entry: + %shuf0 = shufflevector <8 x float> %inp0, <8 x float> %inp2, <8 x i32> + %sel = select <8 x i1> , <8 x float> %shuf0, <8 x float> zeroinitializer + %shuf1 = shufflevector <8 x float> zeroinitializer, <8 x float> %sel, <8 x i32> + %shuf2 = shufflevector <8 x float> %inp1, <8 x float> %shuf1, <8 x i32> + ret <8 x float> %shuf2 +}