Skip to content

Commit 42f18ee

Browse files
alexey-bataevtru
authored andcommitted
[SLP]Fix PR107036: Check if the type of the user is sizable before requesting its size.
Only some instructions should be considered as potentially reducing the size of the operands types, not all instructions should be considered. Fixes #107036 (cherry picked from commit f381cd0)
1 parent 11e2a15 commit 42f18ee

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -15539,6 +15539,11 @@ void BoUpSLP::computeMinimumValueSizes() {
1553915539
const TreeEntry *UserTE = E.UserTreeIndices.back().UserTE;
1554015540
if (TE == UserTE || !TE)
1554115541
return false;
15542+
if (!isa<CastInst, BinaryOperator, FreezeInst, PHINode,
15543+
SelectInst>(U) ||
15544+
!isa<CastInst, BinaryOperator, FreezeInst, PHINode,
15545+
SelectInst>(UserTE->getMainOp()))
15546+
return true;
1554215547
unsigned UserTESz = DL->getTypeSizeInBits(
1554315548
UserTE->Scalars.front()->getType());
1554415549
auto It = MinBWs.find(TE);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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 < %s -slp-threshold=-100 | FileCheck %s
3+
4+
define void @test(ptr %i) {
5+
; CHECK-LABEL: define void @test(
6+
; CHECK-SAME: ptr [[I:%.*]]) {
7+
; CHECK-NEXT: [[BB:.*]]:
8+
; CHECK-NEXT: br label %[[BB2:.*]]
9+
; CHECK: [[BB2]]:
10+
; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x i32> [ [[TMP3:%.*]], %[[BB2]] ], [ zeroinitializer, %[[BB]] ]
11+
; CHECK-NEXT: store <2 x i32> [[TMP0]], ptr [[I]], align 4
12+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x i32> [[TMP0]], <2 x i32> <i32 0, i32 poison>, <2 x i32> <i32 2, i32 1>
13+
; CHECK-NEXT: [[TMP2:%.*]] = trunc <2 x i32> [[TMP1]] to <2 x i1>
14+
; CHECK-NEXT: [[TMP3]] = select <2 x i1> [[TMP2]], <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
15+
; CHECK-NEXT: br label %[[BB2]]
16+
;
17+
bb:
18+
%i1 = getelementptr i8, ptr %i, i64 4
19+
br label %bb2
20+
21+
bb2:
22+
%i3 = phi i32 [ %i6, %bb2 ], [ 0, %bb ]
23+
%i4 = phi i32 [ %i8, %bb2 ], [ 0, %bb ]
24+
store i32 %i3, ptr %i
25+
store i32 %i4, ptr %i1
26+
%i5 = trunc i32 0 to i1
27+
%i6 = select i1 %i5, i32 0, i32 0
28+
%i7 = trunc i32 %i4 to i1
29+
%i8 = select i1 %i7, i32 0, i32 0
30+
br label %bb2
31+
}

0 commit comments

Comments
 (0)