Skip to content

Commit b64ec3c

Browse files
authored
[SLP] The order of store chains needs to consider the size of the values. (#101810)
When store chains have the same value type ID and pointer type ID, they may mix different sizes of values, such as i8 and i64. This can lead to missed vectorization opportunities.
1 parent 7a68449 commit b64ec3c

File tree

2 files changed

+7
-9
lines changed

2 files changed

+7
-9
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19159,6 +19159,12 @@ bool SLPVectorizerPass::vectorizeStoreChains(BoUpSLP &R) {
1915919159
if (V->getPointerOperandType()->getTypeID() >
1916019160
V2->getPointerOperandType()->getTypeID())
1916119161
return false;
19162+
if (V->getValueOperand()->getType()->getScalarSizeInBits() <
19163+
V2->getValueOperand()->getType()->getScalarSizeInBits())
19164+
return true;
19165+
if (V->getValueOperand()->getType()->getScalarSizeInBits() >
19166+
V2->getValueOperand()->getType()->getScalarSizeInBits())
19167+
return false;
1916219168
// UndefValues are compatible with all other values.
1916319169
if (isa<UndefValue>(V->getValueOperand()) ||
1916419170
isa<UndefValue>(V2->getValueOperand()))

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

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,9 @@ define void @test(ptr %p) {
55
; CHECK-SAME: ptr [[P:%.*]]) {
66
; CHECK-NEXT: [[ENTRY:.*:]]
77
; CHECK-NEXT: [[IDX1:%.*]] = getelementptr i8, ptr [[P]], i64 1
8-
; CHECK-NEXT: store i8 0, ptr [[IDX1]], align 4
98
; CHECK-NEXT: [[IDX_64_9:%.*]] = getelementptr i64, ptr [[P]], i64 9
109
; CHECK-NEXT: store i64 1, ptr [[IDX_64_9]], align 8
11-
; CHECK-NEXT: [[IDX2:%.*]] = getelementptr i8, ptr [[P]], i64 2
12-
; CHECK-NEXT: store <4 x i8> zeroinitializer, ptr [[IDX2]], align 4
13-
; CHECK-NEXT: [[IDX6:%.*]] = getelementptr i8, ptr [[P]], i64 6
14-
; CHECK-NEXT: store i8 0, ptr [[IDX6]], align 4
15-
; CHECK-NEXT: [[IDX7:%.*]] = getelementptr i8, ptr [[P]], i64 7
16-
; CHECK-NEXT: store i8 0, ptr [[IDX7]], align 4
17-
; CHECK-NEXT: [[IDX8:%.*]] = getelementptr i8, ptr [[P]], i64 8
18-
; CHECK-NEXT: store i8 0, ptr [[IDX8]], align 4
10+
; CHECK-NEXT: store <8 x i8> zeroinitializer, ptr [[IDX1]], align 4
1911
; CHECK-NEXT: ret void
2012
;
2113
entry:

0 commit comments

Comments
 (0)