Skip to content

Commit 79e6231

Browse files
committed
[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.
1 parent 96c23eb commit 79e6231

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11905,8 +11905,10 @@ Value *BoUpSLP::vectorizeTree(
1190511905
if (!Ex) {
1190611906
// "Reuse" the existing extract to improve final codegen.
1190711907
if (auto *ES = dyn_cast<ExtractElementInst>(Scalar)) {
11908-
Ex = Builder.CreateExtractElement(ES->getOperand(0),
11909-
ES->getOperand(1));
11908+
Value *V = ES->getVectorOperand();
11909+
if (const TreeEntry *ETE = getTreeEntry(V))
11910+
V = ETE->VectorizedValue;
11911+
Ex = Builder.CreateExtractElement(V, ES->getIndexOperand());
1191011912
} else {
1191111913
Ex = Builder.CreateExtractElement(Vec, Lane);
1191211914
}

llvm/test/Transforms/SLPVectorizer/X86/gather_extract_from_vectorbuild.ll

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,48 @@ loop:
5858
%i5 = extractelement <2 x float> %ins1, i64 1
5959
br label %loop
6060
}
61+
62+
define void @test2() {
63+
; CHECK-LABEL: define void @test2() {
64+
; CHECK-NEXT: entry:
65+
; CHECK-NEXT: br label [[BB3:%.*]]
66+
; CHECK: bb1:
67+
; CHECK-NEXT: [[PH:%.*]] = phi float [ poison, [[BB2:%.*]] ], [ [[TMP3:%.*]], [[LOOP:%.*]] ]
68+
; CHECK-NEXT: unreachable
69+
; CHECK: bb2:
70+
; CHECK-NEXT: br i1 poison, label [[BB3]], label [[BB1:%.*]]
71+
; CHECK: bb3:
72+
; CHECK-NEXT: br label [[LOOP]]
73+
; CHECK: loop:
74+
; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x float> [ zeroinitializer, [[BB3]] ], [ [[TMP2:%.*]], [[LOOP]] ]
75+
; CHECK-NEXT: [[TMP1:%.*]] = fadd <2 x float> zeroinitializer, [[TMP0]]
76+
; CHECK-NEXT: [[TMP2]] = select <2 x i1> zeroinitializer, <2 x float> [[TMP1]], <2 x float> zeroinitializer
77+
; CHECK-NEXT: [[TMP3]] = extractelement <2 x float> [[TMP2]], i64 1
78+
; CHECK-NEXT: br i1 poison, label [[BB1]], label [[LOOP]]
79+
;
80+
entry:
81+
br label %bb3
82+
83+
bb1:
84+
%ph = phi float [ poison, %bb2 ], [ %i5, %loop ]
85+
unreachable
86+
87+
bb2:
88+
br i1 poison, label %bb3, label %bb1
89+
90+
bb3:
91+
br label %loop
92+
93+
loop:
94+
%ph0 = phi float [ 0.000000e+00, %bb3 ], [ %i4, %loop ]
95+
%ph1 = phi float [ 0.000000e+00, %bb3 ], [ %i5, %loop ]
96+
%i = fadd float 0.000000e+00, %ph0
97+
%i1 = fadd float 0.000000e+00, %ph1
98+
%i2 = select i1 false, float %i, float 0.000000e+00
99+
%i3 = select i1 false, float %i1, float 0.000000e+00
100+
%ins0 = insertelement <2 x float> zeroinitializer, float %i2, i64 0
101+
%ins1 = insertelement <2 x float> %ins0, float %i3, i64 1
102+
%i4 = extractelement <2 x float> %ins1, i64 0
103+
%i5 = extractelement <2 x float> %ins1, i64 1
104+
br i1 poison, label %bb1, label %loop
105+
}

0 commit comments

Comments
 (0)