Skip to content

Commit 1160994

Browse files
committed
[SLP]Fix a crash for very long GEP chains
Need to check if the GEP bases are equal and return false early. Also, need to return false if the lookup is too deep, considering bases equal too. Fixes a crash in the assertion.
1 parent fdd7caf commit 1160994

File tree

2 files changed

+79
-4
lines changed

2 files changed

+79
-4
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5355,11 +5355,10 @@ static bool clusterSortPtrAccesses(ArrayRef<Value *> VL,
53555355
SmallPtrSet<Value *, 13> SecondPointers;
53565356
Value *P1 = Ptr1;
53575357
Value *P2 = Ptr2;
5358-
if (P1 == P2)
5359-
return false;
53605358
unsigned Depth = 0;
5361-
while (!FirstPointers.contains(P2) && !SecondPointers.contains(P1) &&
5362-
Depth <= RecursionMaxDepth) {
5359+
while (!FirstPointers.contains(P2) && !SecondPointers.contains(P1)) {
5360+
if (P1 == P2 || Depth > RecursionMaxDepth)
5361+
return false;
53635362
FirstPointers.insert(P1);
53645363
SecondPointers.insert(P2);
53655364
P1 = getUnderlyingObject(P1, /*MaxLookup=*/1);
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -passes=slp-vectorizer -mtriple=riscv64-unknown-linux -mattr=+v < %s | FileCheck %s
3+
4+
define i64 @test(ptr %arg, i32 %arg1, i64 %i) {
5+
; CHECK-LABEL: define i64 @test(
6+
; CHECK-SAME: ptr [[ARG:%.*]], i32 [[ARG1:%.*]], i64 [[I:%.*]]) #[[ATTR0:[0-9]+]] {
7+
; CHECK-NEXT: [[BB:.*:]]
8+
; CHECK-NEXT: [[I2:%.*]] = getelementptr i8, ptr [[ARG]], i64 [[I]]
9+
; CHECK-NEXT: [[I3:%.*]] = getelementptr i8, ptr [[I2]], i64 [[I]]
10+
; CHECK-NEXT: [[I4:%.*]] = getelementptr i8, ptr [[I3]], i64 [[I]]
11+
; CHECK-NEXT: [[I5:%.*]] = getelementptr i8, ptr [[I4]], i64 [[I]]
12+
; CHECK-NEXT: [[I6:%.*]] = getelementptr i8, ptr [[I5]], i64 [[I]]
13+
; CHECK-NEXT: [[I7:%.*]] = getelementptr i8, ptr [[I6]], i64 [[I]]
14+
; CHECK-NEXT: [[I8:%.*]] = getelementptr i8, ptr [[I7]], i64 [[I]]
15+
; CHECK-NEXT: [[I9:%.*]] = getelementptr i8, ptr [[I8]], i64 [[I]]
16+
; CHECK-NEXT: [[I10:%.*]] = getelementptr i8, ptr [[I9]], i64 [[I]]
17+
; CHECK-NEXT: [[I11:%.*]] = getelementptr i8, ptr [[I10]], i64 [[I]]
18+
; CHECK-NEXT: [[I12:%.*]] = getelementptr i8, ptr [[I11]], i64 [[I]]
19+
; CHECK-NEXT: [[I13:%.*]] = getelementptr i8, ptr [[I12]], i64 [[I]]
20+
; CHECK-NEXT: [[I14:%.*]] = getelementptr i8, ptr [[I13]], i64 [[I]]
21+
; CHECK-NEXT: [[I140:%.*]] = load i8, ptr [[I14]], align 1
22+
; CHECK-NEXT: [[I1412:%.*]] = zext i8 [[I140]] to i32
23+
; CHECK-NEXT: [[I142:%.*]] = mul i32 [[ARG1]], [[I1412]]
24+
; CHECK-NEXT: [[I143:%.*]] = getelementptr i8, ptr [[I13]], i64 15
25+
; CHECK-NEXT: [[I144:%.*]] = load i8, ptr [[I143]], align 1
26+
; CHECK-NEXT: [[I1453:%.*]] = zext i8 [[I144]] to i32
27+
; CHECK-NEXT: [[I146:%.*]] = mul i32 [[ARG1]], [[I1453]]
28+
; CHECK-NEXT: [[I147:%.*]] = getelementptr i8, ptr [[I13]], i64 14
29+
; CHECK-NEXT: [[I148:%.*]] = load i8, ptr [[I147]], align 1
30+
; CHECK-NEXT: [[I1494:%.*]] = zext i8 [[I148]] to i32
31+
; CHECK-NEXT: [[I150:%.*]] = mul i32 [[ARG1]], [[I1494]]
32+
; CHECK-NEXT: [[I151:%.*]] = getelementptr i8, ptr [[I13]], i64 13
33+
; CHECK-NEXT: [[I152:%.*]] = load i8, ptr [[I151]], align 1
34+
; CHECK-NEXT: [[I1535:%.*]] = zext i8 [[I152]] to i32
35+
; CHECK-NEXT: [[I154:%.*]] = mul i32 [[ARG1]], [[I1535]]
36+
; CHECK-NEXT: [[I1311:%.*]] = or i32 [[I142]], [[I146]]
37+
; CHECK-NEXT: [[I1312:%.*]] = or i32 [[I1311]], [[I150]]
38+
; CHECK-NEXT: [[I1313:%.*]] = or i32 [[I1312]], [[I154]]
39+
; CHECK-NEXT: [[I1536:%.*]] = zext i32 [[I1313]] to i64
40+
; CHECK-NEXT: ret i64 [[I1536]]
41+
;
42+
bb:
43+
%i2 = getelementptr i8, ptr %arg, i64 %i
44+
%i3 = getelementptr i8, ptr %i2, i64 %i
45+
%i4 = getelementptr i8, ptr %i3, i64 %i
46+
%i5 = getelementptr i8, ptr %i4, i64 %i
47+
%i6 = getelementptr i8, ptr %i5, i64 %i
48+
%i7 = getelementptr i8, ptr %i6, i64 %i
49+
%i8 = getelementptr i8, ptr %i7, i64 %i
50+
%i9 = getelementptr i8, ptr %i8, i64 %i
51+
%i10 = getelementptr i8, ptr %i9, i64 %i
52+
%i11 = getelementptr i8, ptr %i10, i64 %i
53+
%i12 = getelementptr i8, ptr %i11, i64 %i
54+
%i13 = getelementptr i8, ptr %i12, i64 %i
55+
%i14 = getelementptr i8, ptr %i13, i64 %i
56+
%i140 = load i8, ptr %i14, align 1
57+
%i1412 = zext i8 %i140 to i32
58+
%i142 = mul i32 %arg1, %i1412
59+
%i143 = getelementptr i8, ptr %i13, i64 15
60+
%i144 = load i8, ptr %i143, align 1
61+
%i1453 = zext i8 %i144 to i32
62+
%i146 = mul i32 %arg1, %i1453
63+
%i147 = getelementptr i8, ptr %i13, i64 14
64+
%i148 = load i8, ptr %i147, align 1
65+
%i1494 = zext i8 %i148 to i32
66+
%i150 = mul i32 %arg1, %i1494
67+
%i151 = getelementptr i8, ptr %i13, i64 13
68+
%i152 = load i8, ptr %i151, align 1
69+
%i1535 = zext i8 %i152 to i32
70+
%i154 = mul i32 %arg1, %i1535
71+
%i1311 = or i32 %i142, %i146
72+
%i1312 = or i32 %i1311, %i150
73+
%i1313 = or i32 %i1312, %i154
74+
%i1536 = zext i32 %i1313 to i64
75+
ret i64 %i1536
76+
}

0 commit comments

Comments
 (0)