diff --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp --- a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -2004,7 +2004,10 @@ for (unsigned i = 0; i != NumElts; ++i) NewMask[i] = Mask[i] < (signed)NumElts ? Mask[i] : Mask1[i]; - assert(ShuffleVectorInst::isSelectMask(NewMask) && "Unexpected shuffle mask"); + // A select mask with undef elements might look like an identity mask. + assert((ShuffleVectorInst::isSelectMask(NewMask) || + ShuffleVectorInst::isIdentityMask(NewMask)) && + "Unexpected shuffle mask"); return new ShuffleVectorInst(X, Y, NewMask); } diff --git a/llvm/test/Transforms/InstCombine/shuffle_select.ll b/llvm/test/Transforms/InstCombine/shuffle_select.ll --- a/llvm/test/Transforms/InstCombine/shuffle_select.ll +++ b/llvm/test/Transforms/InstCombine/shuffle_select.ll @@ -1621,3 +1621,13 @@ %s2 = shufflevector <4 x i32> %s1, <4 x i32> %x, <4 x i32> ret <4 x i32> %s2 } + +define <4 x float> @identity_mask(<4 x float>%x, <4 x float> %y) { +; CHECK-LABEL: @identity_mask( +; CHECK-NEXT: [[S2:%.*]] = shufflevector <4 x float> [[X:%.*]], <4 x float> poison, <4 x i32> +; CHECK-NEXT: ret <4 x float> [[S2]] +; + %s1 = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> + %s2 = shufflevector <4 x float> %s1, <4 x float> %x, <4 x i32> + ret <4 x float> %s2 +}