[llvm] 7c963fd - [SLP]Use revectorized value for extracts from buildvector, beeing
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 3 10:53:22 PST 2024
Author: Alexey Bataev
Date: 2024-01-03T10:38:09-08:00
New Revision: 7c963fde16d8ba340d6a6ed044b9c775f9bfab48
URL: https://github.com/llvm/llvm-project/commit/7c963fde16d8ba340d6a6ed044b9c775f9bfab48
DIFF: https://github.com/llvm/llvm-project/commit/7c963fde16d8ba340d6a6ed044b9c775f9bfab48.diff
LOG: [SLP]Use revectorized value for extracts from buildvector, beeing
vectorized.
If the insertelement instruction is vectorized, and the extractelement
instruction from such insertelement also vectorized as part of the same
tree, need to extract from the corresponding for insertelement vectorized value rather than original insertelement instruction.
Added:
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/X86/gather_extract_from_vectorbuild.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 30499152606463..bd89ec09671a93 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -11139,6 +11139,8 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
case Instruction::ExtractElement: {
Value *V = E->getSingleOperand(0);
+ if (const TreeEntry *TE = getTreeEntry(V))
+ V = TE->VectorizedValue;
setInsertPointAfterBundle(E);
V = FinalShuffle(V, E, VecTy, IsSigned);
E->VectorizedValue = V;
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/gather_extract_from_vectorbuild.ll b/llvm/test/Transforms/SLPVectorizer/X86/gather_extract_from_vectorbuild.ll
index 3bccfac8566de8..b762c3a4f18589 100644
--- a/llvm/test/Transforms/SLPVectorizer/X86/gather_extract_from_vectorbuild.ll
+++ b/llvm/test/Transforms/SLPVectorizer/X86/gather_extract_from_vectorbuild.ll
@@ -31,3 +31,30 @@ loop:
%i4 = extractelement <2 x float> %ins1, i64 0
br label %loop
}
+
+define void @test1() {
+; CHECK-LABEL: define void @test1() {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x float> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[TMP2:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[TMP1:%.*]] = fadd <2 x float> zeroinitializer, [[TMP0]]
+; CHECK-NEXT: [[TMP2]] = select <2 x i1> zeroinitializer, <2 x float> [[TMP1]], <2 x float> zeroinitializer
+; CHECK-NEXT: br label [[LOOP]]
+;
+entry:
+ br label %loop
+
+loop:
+ %ph0 = phi float [ 0.000000e+00, %entry ], [ %i4, %loop ]
+ %ph1 = phi float [ 0.000000e+00, %entry ], [ %i5, %loop ]
+ %i = fadd float 0.000000e+00, %ph0
+ %i1 = fadd float 0.000000e+00, %ph1
+ %i2 = select i1 false, float %i, float 0.000000e+00
+ %i3 = select i1 false, float %i1, float 0.000000e+00
+ %ins0 = insertelement <2 x float> zeroinitializer, float %i2, i64 0
+ %ins1 = insertelement <2 x float> %ins0, float %i3, i64 1
+ %i4 = extractelement <2 x float> %ins1, i64 0
+ %i5 = extractelement <2 x float> %ins1, i64 1
+ br label %loop
+}
More information about the llvm-commits
mailing list