diff --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp index 1556d61981d51c..ef30f28c3da7fe 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -2462,7 +2462,7 @@ static Instruction *foldShuffleOfUnaryOps(ShuffleVectorInst &Shuf, // Match 1-input (unary) shuffle. // shuffle (fneg/fabs X), Mask --> fneg/fabs (shuffle X, Mask) - if (S0->hasOneUse() && match(Shuf.getOperand(1), m_Undef())) { + if (S0->hasOneUse() && match(Shuf.getOperand(1), m_Poison())) { Value *NewShuf = Builder.CreateShuffleVector(X, Shuf.getShuffleMask()); if (IsFNeg) return UnaryOperator::CreateFNegFMF(NewShuf, S0); diff --git a/llvm/test/Transforms/InstCombine/vec_shuffle.ll b/llvm/test/Transforms/InstCombine/vec_shuffle.ll index 00c7a4ca32a02d..4d7e9d9067e753 100644 --- a/llvm/test/Transforms/InstCombine/vec_shuffle.ll +++ b/llvm/test/Transforms/InstCombine/vec_shuffle.ll @@ -1280,12 +1280,11 @@ define <2 x float> @fneg(<2 x float> %x) { ret <2 x float> %r } -; FIXME: This is a miscompile. define <2 x float> @fneg_not_single_source(<2 x float> %x) { ; CHECK-LABEL: @fneg_not_single_source( -; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x float> [[X:%.*]], <2 x float> poison, <2 x i32> -; CHECK-NEXT: [[SPLAT:%.*]] = fneg <2 x float> [[TMP1]] -; CHECK-NEXT: ret <2 x float> [[SPLAT]] +; CHECK-NEXT: [[NEG:%.*]] = fneg <2 x float> [[X:%.*]] +; CHECK-NEXT: [[SPLAT1:%.*]] = insertelement <2 x float> [[NEG]], float undef, i64 1 +; CHECK-NEXT: ret <2 x float> [[SPLAT1]] ; %neg = fneg <2 x float> %x %splat = shufflevector <2 x float> %neg, <2 x float> undef, <2 x i32>