Skip to content

Commit a3508e0

Browse files
committed
[SLP]Small buidlvector only graph should contains scalars from same block
If the graph is small and has single buildvector node, all scalars instructions must be from the same basic block to prevent compiler crash. Fixes #113451
1 parent 7a10369 commit a3508e0

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11588,7 +11588,8 @@ bool BoUpSLP::isTreeTinyAndNotFullyVectorizable(bool ForReduction) const {
1158811588

1158911589
if (VectorizableTree.back()->isGather() &&
1159011590
VectorizableTree.back()->isAltShuffle() &&
11591-
VectorizableTree.back()->getVectorFactor() > 2)
11591+
VectorizableTree.back()->getVectorFactor() > 2 &&
11592+
allSameBlock(VectorizableTree.back()->Scalars))
1159211593
return false;
1159311594

1159411595
assert(VectorizableTree.empty()
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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-gnu -mattr=+avx512dq -slp-threshold=-99999 < %s | FileCheck %s
3+
4+
define i32 @test(i32 %arg, i32 %arg1) {
5+
; CHECK-LABEL: define i32 @test(
6+
; CHECK-SAME: i32 [[ARG:%.*]], i32 [[ARG1:%.*]]) #[[ATTR0:[0-9]+]] {
7+
; CHECK-NEXT: [[BB:.*:]]
8+
; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 [[ARG1]] to i64
9+
; CHECK-NEXT: [[ZEXT2:%.*]] = zext i32 [[ARG]] to i64
10+
; CHECK-NEXT: [[SEXT:%.*]] = sext i32 [[ARG]] to i64
11+
; CHECK-NEXT: br label %[[BB3:.*]]
12+
; CHECK: [[BB3]]:
13+
; CHECK-NEXT: [[GETELEMENTPTR:%.*]] = getelementptr i64, ptr addrspace(1) null, i64 [[ZEXT]]
14+
; CHECK-NEXT: [[GETELEMENTPTR4:%.*]] = getelementptr i64, ptr addrspace(1) null, i64 [[ZEXT2]]
15+
; CHECK-NEXT: [[GETELEMENTPTR5:%.*]] = getelementptr i64, ptr addrspace(1) null, i64 [[SEXT]]
16+
; CHECK-NEXT: [[ZEXT6:%.*]] = zext i32 0 to i64
17+
; CHECK-NEXT: [[GETELEMENTPTR7:%.*]] = getelementptr i64, ptr addrspace(1) null, i64 [[ZEXT6]]
18+
; CHECK-NEXT: ret i32 0
19+
;
20+
bb:
21+
%zext = zext i32 %arg1 to i64
22+
%zext2 = zext i32 %arg to i64
23+
%sext = sext i32 %arg to i64
24+
br label %bb3
25+
26+
bb3:
27+
%getelementptr = getelementptr i64, ptr addrspace(1) null, i64 %zext
28+
%getelementptr4 = getelementptr i64, ptr addrspace(1) null, i64 %zext2
29+
%getelementptr5 = getelementptr i64, ptr addrspace(1) null, i64 %sext
30+
%zext6 = zext i32 0 to i64
31+
%getelementptr7 = getelementptr i64, ptr addrspace(1) null, i64 %zext6
32+
ret i32 0
33+
}

0 commit comments

Comments
 (0)