Skip to content

Commit 414abff

Browse files
committed
[SLP]Fix PR52090: clang crashes: Assertion `Index < Length && "Invalid index!"' failed.
Need to check that either Idx is UndefMaskElem and value is UndefValue or Idx is valid and value is the same as the scalar value in the node. Differential Revision: https://reviews.llvm.org/D111802
1 parent 277623f commit 414abff

File tree

2 files changed

+53
-3
lines changed

2 files changed

+53
-3
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1640,9 +1640,12 @@ class BoUpSLP {
16401640
if (Mask.size() != VL.size() && VL.size() == Scalars.size())
16411641
return std::equal(VL.begin(), VL.end(), Scalars.begin());
16421642
return VL.size() == Mask.size() &&
1643-
std::equal(
1644-
VL.begin(), VL.end(), Mask.begin(),
1645-
[Scalars](Value *V, int Idx) { return V == Scalars[Idx]; });
1643+
std::equal(VL.begin(), VL.end(), Mask.begin(),
1644+
[Scalars](Value *V, int Idx) {
1645+
return (isa<UndefValue>(V) &&
1646+
Idx == UndefMaskElem) ||
1647+
(Idx != UndefMaskElem && V == Scalars[Idx]);
1648+
});
16461649
};
16471650
if (!ReorderIndices.empty()) {
16481651
// TODO: implement matching if the nodes are just reordered, still can
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -slp-vectorizer -S -o - -mtriple=x86_64 < %s | FileCheck %s
3+
4+
define void @main(i32 %x, i1 %b) {
5+
; CHECK-LABEL: @main(
6+
; CHECK-NEXT: entry:
7+
; CHECK-NEXT: br i1 [[B:%.*]], label [[L3:%.*]], label [[L1_THREAD:%.*]]
8+
; CHECK: L1:
9+
; CHECK-NEXT: br label [[L3]]
10+
; CHECK: L1.thread:
11+
; CHECK-NEXT: br label [[L3]]
12+
; CHECK: L3:
13+
; CHECK-NEXT: [[DOTPR21:%.*]] = phi i32 [ [[X:%.*]], [[ENTRY:%.*]] ], [ [[DOTPR21]], [[L1:%.*]] ], [ [[X]], [[L1_THREAD]] ]
14+
; CHECK-NEXT: [[DOTOLD_PR15:%.*]] = phi i32 [ [[X]], [[ENTRY]] ], [ 0, [[L1]] ], [ [[X]], [[L1_THREAD]] ]
15+
; CHECK-NEXT: [[H_1:%.*]] = phi i32 [ undef, [[ENTRY]] ], [ undef, [[L1]] ], [ undef, [[L1_THREAD]] ]
16+
; CHECK-NEXT: [[I_2:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[I_2]], [[L1]] ], [ 1, [[L1_THREAD]] ]
17+
; CHECK-NEXT: [[K_3:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[I_2]], [[L1]] ], [ 1, [[L1_THREAD]] ]
18+
; CHECK-NEXT: [[G_1:%.*]] = phi i32 [ undef, [[ENTRY]] ], [ [[O_1:%.*]], [[L1]] ], [ undef, [[L1_THREAD]] ]
19+
; CHECK-NEXT: [[M_3:%.*]] = phi i32 [ undef, [[ENTRY]] ], [ [[I_2]], [[L1]] ], [ 1, [[L1_THREAD]] ]
20+
; CHECK-NEXT: [[O_1]] = phi i32 [ undef, [[ENTRY]] ], [ [[O_1]], [[L1]] ], [ undef, [[L1_THREAD]] ]
21+
; CHECK-NEXT: br label [[L4:%.*]]
22+
; CHECK: L4:
23+
; CHECK-NEXT: br label [[L1]]
24+
;
25+
entry:
26+
br i1 %b, label %L3, label %L1.thread
27+
28+
L1:
29+
br label %L3
30+
31+
L1.thread:
32+
br label %L3
33+
34+
L3:
35+
%.pr21 = phi i32 [ %x, %entry ], [ %.pr21, %L1 ], [ %x, %L1.thread ]
36+
%.old.pr15 = phi i32 [ %x, %entry ], [ 0, %L1 ], [ %x, %L1.thread ]
37+
%h.1 = phi i32 [ undef, %entry ], [ undef, %L1 ], [ undef, %L1.thread ]
38+
%i.2 = phi i32 [ 1, %entry ], [ %i.2, %L1 ], [ 1, %L1.thread ]
39+
%k.3 = phi i32 [ 0, %entry ], [ %i.2, %L1 ], [ 1, %L1.thread ]
40+
%g.1 = phi i32 [ undef, %entry ], [ %o.1, %L1 ], [ undef, %L1.thread ]
41+
%m.3 = phi i32 [ undef, %entry ], [ %i.2, %L1 ], [ 1, %L1.thread ]
42+
%o.1 = phi i32 [ undef, %entry ], [ %o.1, %L1 ], [ undef, %L1.thread ]
43+
br label %L4
44+
45+
L4:
46+
br label %L1
47+
}

0 commit comments

Comments
 (0)