Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -21950,10 +21950,23 @@ MVT RootVT = Root.getSimpleValueType(); SDLoc DL(Root); - // Just remove no-op shuffle masks. if (Mask.size() == 1) { - DCI.CombineTo(Root.getNode(), DAG.getBitcast(RootVT, Input), - /*AddTo*/ true); + int Index = Mask[0]; + assert((Index >= 0 || Index == SM_SentinelUndef || + Index == SM_SentinelZero) && + "Invalid shuffle index found!"); + + // We may end up with an accumulated mask of size 1 as a result of + // widening of shuffle operands (see function canWidenShuffleElements). + // If the only shuffle index is equal to SM_SentinelZero then propagate + // a zero vector. + if (Index == SM_SentinelZero) + // fold this shuffle chain to a zero vector. + DCI.CombineTo(Root.getNode(), getZeroVector(RootVT, Subtarget, DAG, DL)); + else + // Just remove no-op shuffle masks. + DCI.CombineTo(Root.getNode(), DAG.getBitcast(RootVT, Input), + /*AddTo*/ true); return true; } Index: test/CodeGen/X86/pr24562.ll =================================================================== --- test/CodeGen/X86/pr24562.ll +++ test/CodeGen/X86/pr24562.ll @@ -0,0 +1,19 @@ +; RUN: llc -mattr=+ssse3 -mtriple=x86_64-unknown-unknown < %s | FileCheck %s + +; The pshufb from function @pr24562 was wrongly folded into its first operand +; as a result of a late target shuffle combine on the legalized selection dag. +; +; Check that the pshufb is correctly folded to a zero vector. + +define <2 x i64> @pr24562() { +; CHECK-LABEL: pr24562: +; CHECK: # BB#0: # %entry +; CHECK-NEXT: xorps %xmm0, %xmm0 +; CHECK-NEXT: retq +entry: + %0 = call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> , <16 x i8> ) #2 + %1 = bitcast <16 x i8> %0 to <2 x i64> + ret <2 x i64> %1 +} + +declare <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8>, <16 x i8>)