Index: llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp =================================================================== --- llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -2004,7 +2004,8 @@ 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); } Index: llvm/test/Transforms/InstCombine/foldSelectShuffleOfSelectShuffle.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/InstCombine/foldSelectShuffleOfSelectShuffle.ll @@ -0,0 +1,13 @@ +; RUN: opt -passes=instcombine %s -S -o - | FileCheck %s + +; CHECK: shufflevector <4 x float> %1, <4 x float> poison, <4 x i32> + +@g = dso_local local_unnamed_addr global [4 x float] zeroinitializer, align 16 +@h = dso_local local_unnamed_addr global [4 x float] zeroinitializer, align 16 +define <4 x float> @square() local_unnamed_addr #0 { + %1 = load <4 x float>, ptr @g, align 16 + %2 = load <4 x float>, ptr @h, align 16 + %3 = shufflevector <4 x float> %1, <4 x float> %2, <4 x i32> + %4 = shufflevector <4 x float> %3, <4 x float> %1, <4 x i32> + ret <4 x float> %4 +}