Skip to content

Commit ca654ac

Browse files
committed
[SLP]Fix PR79321: SLPVectorizer's PHICompare doesn't provide a strict
weak ordering. Compared NumUses to meet the reaquirements of the strict weak ordering.
1 parent 3b8539c commit ca654ac

File tree

2 files changed

+5
-3
lines changed

2 files changed

+5
-3
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4138,9 +4138,11 @@ BoUpSLP::getReorderingData(const TreeEntry &TE, bool TopToBottom) {
41384138
auto PHICompare = [&](unsigned I1, unsigned I2) {
41394139
Value *V1 = TE.Scalars[I1];
41404140
Value *V2 = TE.Scalars[I2];
4141-
if (V1 == V2)
4141+
if (V1 == V2 || (V1->getNumUses() == 0 && V2->getNumUses() == 0))
41424142
return false;
4143-
if (!V1->hasOneUse() || !V2->hasOneUse())
4143+
if (V1->getNumUses() < V2->getNumUses())
4144+
return true;
4145+
if (V1->getNumUses() > V2->getNumUses())
41444146
return false;
41454147
auto *FirstUserOfPhi1 = cast<Instruction>(*V1->user_begin());
41464148
auto *FirstUserOfPhi2 = cast<Instruction>(*V2->user_begin());

llvm/test/Transforms/SLPVectorizer/X86/extract-subvector-long-input.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ define void @test() {
77
; CHECK-NEXT: br label [[BB1:%.*]]
88
; CHECK: bb1:
99
; CHECK-NEXT: [[TMP0:%.*]] = phi <8 x i32> [ poison, [[BB10:%.*]] ], [ zeroinitializer, [[BB:%.*]] ]
10-
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <2 x i32> <i32 6, i32 6>
10+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <2 x i32> <i32 7, i32 7>
1111
; CHECK-NEXT: switch i32 0, label [[BB16:%.*]] [
1212
; CHECK-NEXT: i32 0, label [[BB14:%.*]]
1313
; CHECK-NEXT: i32 1, label [[BB11:%.*]]

0 commit comments

Comments
 (0)