Skip to content

Commit 6bd29d6

Browse files
committed
[SLP]Fix PR89614: phis can be reordered, if reuses are not empty.
Need to relax assertion and check ReuseShuffleIndices is not empty, if the root phi node has reorder indices.
1 parent 102a811 commit 6bd29d6

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12229,7 +12229,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
1222912229
auto *VecTy = FixedVectorType::get(ScalarTy, E->Scalars.size());
1223012230
switch (ShuffleOrOp) {
1223112231
case Instruction::PHI: {
12232-
assert((E->ReorderIndices.empty() ||
12232+
assert((E->ReorderIndices.empty() || !E->ReuseShuffleIndices.empty() ||
1223312233
E != VectorizableTree.front().get() ||
1223412234
!E->UserTreeIndices.empty()) &&
1223512235
"PHI reordering is free.");
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu -mcpu=znver2 < %s | FileCheck %s
3+
4+
define void @test() {
5+
; CHECK-LABEL: define void @test(
6+
; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
7+
; CHECK-NEXT: bb:
8+
; CHECK-NEXT: br label [[BB1:%.*]]
9+
; CHECK: bb1:
10+
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, [[BB:%.*]] ], [ [[TMP2:%.*]], [[BB1]] ]
11+
; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x i32> [ zeroinitializer, [[BB]] ], [ [[TMP3:%.*]], [[BB1]] ]
12+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x i32> [[TMP0]], <2 x i32> poison, <32 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
13+
; CHECK-NEXT: [[TMP2]] = call i32 @llvm.vector.reduce.mul.v32i32(<32 x i32> [[TMP1]])
14+
; CHECK-NEXT: [[TMP3]] = shufflevector <2 x i32> [[TMP0]], <2 x i32> poison, <2 x i32> <i32 1, i32 0>
15+
; CHECK-NEXT: br label [[BB1]]
16+
;
17+
bb:
18+
br label %bb1
19+
20+
bb1:
21+
%phi = phi i32 [ 0, %bb ], [ %mul33, %bb1 ]
22+
%phi2 = phi i32 [ 0, %bb ], [ %phi3, %bb1 ]
23+
%phi3 = phi i32 [ 0, %bb ], [ %phi2, %bb1 ]
24+
%mul = mul i32 %phi2, %phi2
25+
%mul4 = mul i32 %phi3, %mul
26+
%mul5 = mul i32 %phi2, %mul4
27+
%mul6 = mul i32 %phi3, %mul5
28+
%mul7 = mul i32 %phi2, %mul6
29+
%mul8 = mul i32 %phi3, %mul7
30+
%mul9 = mul i32 %phi2, %mul8
31+
%mul10 = mul i32 %phi3, %mul9
32+
%mul11 = mul i32 %phi2, %mul10
33+
%mul12 = mul i32 %phi3, %mul11
34+
%mul13 = mul i32 %phi2, %mul12
35+
%mul14 = mul i32 %phi3, %mul13
36+
%mul15 = mul i32 %phi2, %mul14
37+
%mul16 = mul i32 %phi3, %mul15
38+
%mul17 = mul i32 %phi2, %mul16
39+
%mul18 = mul i32 %phi3, %mul17
40+
%mul19 = mul i32 %phi2, %mul18
41+
%mul20 = mul i32 %phi3, %mul19
42+
%mul21 = mul i32 %phi2, %mul20
43+
%mul22 = mul i32 %phi3, %mul21
44+
%mul23 = mul i32 %phi2, %mul22
45+
%mul24 = mul i32 %phi3, %mul23
46+
%mul25 = mul i32 %phi2, %mul24
47+
%mul26 = mul i32 %phi3, %mul25
48+
%mul27 = mul i32 %phi2, %mul26
49+
%mul28 = mul i32 %phi3, %mul27
50+
%mul29 = mul i32 %phi2, %mul28
51+
%mul30 = mul i32 %phi3, %mul29
52+
%mul31 = mul i32 %phi2, %mul30
53+
%mul32 = mul i32 %phi3, %mul31
54+
%mul33 = mul i32 %phi2, %mul32
55+
br label %bb1
56+
}
57+

0 commit comments

Comments
 (0)