Skip to content

Commit 2d66d15

Browse files
committed
The order of store chains needs to consider the size of the values.
1 parent 79caa06 commit 2d66d15

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19125,6 +19125,14 @@ bool SLPVectorizerPass::vectorizeStoreChains(BoUpSLP &R) {
1912519125
if (V->getPointerOperandType()->getTypeID() >
1912619126
V2->getPointerOperandType()->getTypeID())
1912719127
return false;
19128+
if (V->getValueOperand()->getType()->getScalarSizeInBits() <
19129+
V2->getValueOperand()->getType()->getScalarSizeInBits()) {
19130+
return true;
19131+
}
19132+
if (V->getValueOperand()->getType()->getScalarSizeInBits() >
19133+
V2->getValueOperand()->getType()->getScalarSizeInBits()) {
19134+
return false;
19135+
}
1912819136
// UndefValues are compatible with all other values.
1912919137
if (isa<UndefValue>(V->getValueOperand()) ||
1913019138
isa<UndefValue>(V2->getValueOperand()))
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux < %s | FileCheck %s
3+
4+
define void @test(ptr %p) {
5+
; CHECK-LABEL: define void @test(
6+
; CHECK-SAME: ptr [[P:%.*]]) {
7+
; CHECK-NEXT: [[ENTRY:.*:]]
8+
; CHECK-NEXT: [[IDX1:%.*]] = getelementptr i8, ptr [[P]], i64 1
9+
; CHECK-NEXT: [[IDX_64_9:%.*]] = getelementptr i64, ptr [[P]], i64 9
10+
; CHECK-NEXT: store i64 1, ptr [[IDX_64_9]], align 8
11+
; CHECK-NEXT: store <8 x i8> zeroinitializer, ptr [[IDX1]], align 4
12+
; CHECK-NEXT: ret void
13+
;
14+
entry:
15+
%idx1 = getelementptr i8, ptr %p, i64 1
16+
store i8 0, ptr %idx1, align 4
17+
%idx.64.9 = getelementptr i64, ptr %p, i64 9
18+
store i64 1, ptr %idx.64.9, align 8
19+
%idx2 = getelementptr i8, ptr %p, i64 2
20+
store i8 0, ptr %idx2, align 4
21+
%idx3 = getelementptr i8, ptr %p, i64 3
22+
store i8 0, ptr %idx3, align 4
23+
%idx4 = getelementptr i8, ptr %p, i64 4
24+
store i8 0, ptr %idx4, align 4
25+
%idx5 = getelementptr i8, ptr %p, i64 5
26+
store i8 0, ptr %idx5, align 4
27+
%idx6 = getelementptr i8, ptr %p, i64 6
28+
store i8 0, ptr %idx6, align 4
29+
%idx7 = getelementptr i8, ptr %p, i64 7
30+
store i8 0, ptr %idx7, align 4
31+
%idx8 = getelementptr i8, ptr %p, i64 8
32+
store i8 0, ptr %idx8, align 4
33+
ret void
34+
}

0 commit comments

Comments
 (0)