[llvm] 8f1c984 - [InstCombine] Check for poison instead of undef in shuffle of unop transform
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue May 21 06:44:30 PDT 2024
Author: Nikita Popov
Date: 2024-05-21T15:43:50+02:00
New Revision: 8f1c984325bd679b2634a6173db69548da87ac71
URL: https://github.com/llvm/llvm-project/commit/8f1c984325bd679b2634a6173db69548da87ac71
DIFF: https://github.com/llvm/llvm-project/commit/8f1c984325bd679b2634a6173db69548da87ac71.diff
LOG: [InstCombine] Check for poison instead of undef in shuffle of unop transform
Otherwise this may not actually be a single-source shuffle.
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
llvm/test/Transforms/InstCombine/vec_shuffle.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
index 1556d61981d51..ef30f28c3da7f 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 00c7a4ca32a02..4d7e9d9067e75 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> <i32 0, i32 poison>
-; 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> <i32 0, i32 2>
More information about the llvm-commits
mailing list