Skip to content

Commit

Permalink
[SLP] Fix crash on attempt to access on invalid iterator state.
Browse files Browse the repository at this point in the history
The patch fixes corner case when no of scalar instructions
required scheduling for vectorized node.

Differential Revision: https://reviews.llvm.org/D154175
  • Loading branch information
Valery N Dmitriev committed Jun 30, 2023
1 parent 4f065fc commit 03b118c
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 2 deletions.
4 changes: 2 additions & 2 deletions llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9074,8 +9074,8 @@ Instruction &BoUpSLP::getLastInstructionInBundle(const TreeEntry *E) {

// Set the insert point to the beginning of the basic block if the entry
// should not be scheduled.
if (E->State != TreeEntry::NeedToGather &&
(doesNotNeedToSchedule(E->Scalars) ||
if (doesNotNeedToSchedule(E->Scalars) ||
(E->State != TreeEntry::NeedToGather &&
all_of(E->Scalars, isVectorLikeInstWithConstOps))) {
Instruction *InsertInst;
if ((E->getOpcode() == Instruction::GetElementPtr &&
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
; RUN: opt -S -passes=slp-vectorizer -mattr=+avx -mtriple=x86_64 < %s | FileCheck %s

define void @test() {
; CHECK-LABEL: define void @test
; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
; CHECK: bb1:
; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 undef, i32 undef, i32 undef, i32 undef>)
; CHECK-NEXT: call void @f(i32 noundef [[TMP1]])
; CHECK-NEXT: br label [[BB2]]
; CHECK: bb2:
; CHECK-NEXT: ret void
;
%i27 = extractelement <4 x i32> poison, i64 0
%i28 = extractelement <4 x i32> poison, i64 1
%i29 = extractelement <4 x i32> poison, i64 2
%i30 = extractelement <4 x i32> poison, i64 3
%i31 = extractelement <4 x i32> zeroinitializer, i64 0
%i32 = extractelement <4 x i32> zeroinitializer, i64 1
%i33 = extractelement <4 x i32> zeroinitializer, i64 2
%i34 = extractelement <4 x i32> zeroinitializer, i64 3
br i1 undef, label %bb1, label %bb2

bb1:
%i11 = mul nsw i32 %i28, %i27
%i12 = mul nsw i32 %i11, %i29
%i13 = mul nsw i32 %i12, %i30
%i14 = mul nsw i32 %i13, %i31
%i15 = mul nsw i32 %i14, %i32
%i16 = mul nsw i32 %i15, %i33
%i17 = mul nsw i32 %i16, %i34
call void @f(i32 noundef %i17)
br label %bb2

bb2:
ret void
}

declare void @f(i32)

0 comments on commit 03b118c

Please sign in to comment.