[llvm] 79e6231 - [SLP]Use revectorized value for extracts from buildvector, beeing

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 4 06:53:01 PST 2024


Author: Alexey Bataev
Date: 2024-01-04T06:45:26-08:00
New Revision: 79e62315be5b762f399e98c0b638e682eac66322

URL: https://github.com/llvm/llvm-project/commit/79e62315be5b762f399e98c0b638e682eac66322
DIFF: https://github.com/llvm/llvm-project/commit/79e62315be5b762f399e98c0b638e682eac66322.diff

LOG: [SLP]Use revectorized value for extracts from buildvector, beeing
vectorized.

When trying to reuse the extractelement instruction, emitted for the
insertelement instruction, need to check, if the this insertelement
instruction was vectorized. In this case, need to use vectorized value,
not the original insertelement.

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 bd89ec09671a93..cbe767537a1d63 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -11905,8 +11905,10 @@ Value *BoUpSLP::vectorizeTree(
         if (!Ex) {
           // "Reuse" the existing extract to improve final codegen.
           if (auto *ES = dyn_cast<ExtractElementInst>(Scalar)) {
-            Ex = Builder.CreateExtractElement(ES->getOperand(0),
-                                              ES->getOperand(1));
+            Value *V = ES->getVectorOperand();
+            if (const TreeEntry *ETE = getTreeEntry(V))
+              V = ETE->VectorizedValue;
+            Ex = Builder.CreateExtractElement(V, ES->getIndexOperand());
           } else {
             Ex = Builder.CreateExtractElement(Vec, Lane);
           }

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 b762c3a4f18589..dd5c52b99d00e8 100644
--- a/llvm/test/Transforms/SLPVectorizer/X86/gather_extract_from_vectorbuild.ll
+++ b/llvm/test/Transforms/SLPVectorizer/X86/gather_extract_from_vectorbuild.ll
@@ -58,3 +58,48 @@ loop:
   %i5 = extractelement <2 x float> %ins1, i64 1
   br label %loop
 }
+
+define void @test2() {
+; CHECK-LABEL: define void @test2() {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[BB3:%.*]]
+; CHECK:       bb1:
+; CHECK-NEXT:    [[PH:%.*]] = phi float [ poison, [[BB2:%.*]] ], [ [[TMP3:%.*]], [[LOOP:%.*]] ]
+; CHECK-NEXT:    unreachable
+; CHECK:       bb2:
+; CHECK-NEXT:    br i1 poison, label [[BB3]], label [[BB1:%.*]]
+; CHECK:       bb3:
+; CHECK-NEXT:    br label [[LOOP]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[TMP0:%.*]] = phi <2 x float> [ zeroinitializer, [[BB3]] ], [ [[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:    [[TMP3]] = extractelement <2 x float> [[TMP2]], i64 1
+; CHECK-NEXT:    br i1 poison, label [[BB1]], label [[LOOP]]
+;
+entry:
+  br label %bb3
+
+bb1:
+  %ph = phi float [ poison, %bb2 ], [ %i5, %loop ]
+  unreachable
+
+bb2:
+  br i1 poison, label %bb3, label %bb1
+
+bb3:
+  br label %loop
+
+loop:
+  %ph0 = phi float [ 0.000000e+00, %bb3 ], [ %i4, %loop ]
+  %ph1 = phi float [ 0.000000e+00, %bb3 ], [ %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 i1 poison, label %bb1, label %loop
+}


        


More information about the llvm-commits mailing list