Skip to content

Commit

Permalink
[SLP]Check if vector user exist before accessing it
Browse files Browse the repository at this point in the history
Need to check if vector user exist before accessing it to avoid compiler
crash.
Fixes #126581
  • Loading branch information
alexey-bataev committed Feb 13, 2025
1 parent c81139f commit d18b1eb
Show file tree
Hide file tree
Showing 2 changed files with 78 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 @@ -18467,8 +18467,8 @@ void BoUpSLP::computeMinimumValueSizes() {
any_of(
VectorizableTree[NodeIdx]->UserTreeIndices,
[&](const EdgeInfo &EI) {
return (EI.UserTE->hasState() &&
EI.UserTE->getOpcode() == Instruction::ICmp) &&
return EI.UserTE && EI.UserTE->hasState() &&
EI.UserTE->getOpcode() == Instruction::ICmp &&
any_of(EI.UserTE->Scalars, [&](Value *V) {
auto *IC = dyn_cast<ICmpInst>(V);
return IC &&
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S --passes=slp-vectorizer -mtriple=riscv64-unknown-linux-gnu -mattr=+v < %s | FileCheck %s

@r = external global [8 x i8]

define void @test(i64 %0, ptr %1) {
; CHECK-LABEL: define void @test(
; CHECK-SAME: i64 [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr @r, align 1
; CHECK-NEXT: [[TMP4:%.*]] = trunc i8 [[TMP3]] to i1
; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP4]], i64 [[TMP0]], i64 0
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr @r, i64 [[TMP5]]
; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[TMP6]], align 1
; CHECK-NEXT: [[TMP8:%.*]] = icmp ule i8 [[TMP3]], [[TMP7]]
; CHECK-NEXT: [[TMP9:%.*]] = sext i1 [[TMP8]] to i32
; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr getelementptr (i8, ptr @r, i64 -8049), align 1
; CHECK-NEXT: [[TMP11:%.*]] = trunc i8 [[TMP10]] to i1
; CHECK-NEXT: [[TMP12:%.*]] = select i1 [[TMP11]], i64 [[TMP0]], i64 0
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr @r, i64 [[TMP12]]
; CHECK-NEXT: [[TMP14:%.*]] = load i8, ptr [[TMP13]], align 1
; CHECK-NEXT: [[TMP15:%.*]] = icmp ule i8 [[TMP10]], [[TMP14]]
; CHECK-NEXT: [[TMP16:%.*]] = sext i1 [[TMP15]] to i32
; CHECK-NEXT: [[TMP17:%.*]] = add i32 [[TMP9]], [[TMP16]]
; CHECK-NEXT: [[TMP18:%.*]] = load i8, ptr getelementptr (i8, ptr @r, i64 -16098), align 1
; CHECK-NEXT: [[TMP19:%.*]] = trunc i8 [[TMP18]] to i1
; CHECK-NEXT: [[TMP20:%.*]] = select i1 [[TMP19]], i64 [[TMP0]], i64 0
; CHECK-NEXT: [[TMP21:%.*]] = getelementptr i8, ptr @r, i64 [[TMP20]]
; CHECK-NEXT: [[TMP22:%.*]] = load i8, ptr [[TMP21]], align 1
; CHECK-NEXT: [[TMP23:%.*]] = icmp ule i8 [[TMP18]], [[TMP22]]
; CHECK-NEXT: [[TMP24:%.*]] = sext i1 [[TMP23]] to i32
; CHECK-NEXT: [[TMP25:%.*]] = add i32 [[TMP17]], [[TMP24]]
; CHECK-NEXT: [[TMP26:%.*]] = load i8, ptr getelementptr (i8, ptr @r, i64 -24147), align 1
; CHECK-NEXT: [[TMP27:%.*]] = trunc i8 [[TMP26]] to i1
; CHECK-NEXT: [[TMP28:%.*]] = select i1 [[TMP27]], i64 [[TMP0]], i64 0
; CHECK-NEXT: [[TMP29:%.*]] = getelementptr i8, ptr @r, i64 [[TMP28]]
; CHECK-NEXT: [[TMP30:%.*]] = load i8, ptr [[TMP29]], align 1
; CHECK-NEXT: [[TMP31:%.*]] = icmp ule i8 [[TMP26]], [[TMP30]]
; CHECK-NEXT: [[TMP32:%.*]] = sext i1 [[TMP31]] to i32
; CHECK-NEXT: [[TMP33:%.*]] = add i32 [[TMP25]], [[TMP32]]
; CHECK-NEXT: store i32 [[TMP33]], ptr [[TMP1]], align 4
; CHECK-NEXT: ret void
;
%3 = load i8, ptr @r, align 1
%4 = trunc i8 %3 to i1
%5 = select i1 %4, i64 %0, i64 0
%6 = getelementptr i8, ptr @r, i64 %5
%7 = load i8, ptr %6, align 1
%8 = icmp ule i8 %3, %7
%9 = sext i1 %8 to i32
%10 = load i8, ptr getelementptr (i8, ptr @r, i64 -8049), align 1
%11 = trunc i8 %10 to i1
%12 = select i1 %11, i64 %0, i64 0
%13 = getelementptr i8, ptr @r, i64 %12
%14 = load i8, ptr %13, align 1
%15 = icmp ule i8 %10, %14
%16 = sext i1 %15 to i32
%17 = add i32 %9, %16
%18 = load i8, ptr getelementptr (i8, ptr @r, i64 -16098), align 1
%19 = trunc i8 %18 to i1
%20 = select i1 %19, i64 %0, i64 0
%21 = getelementptr i8, ptr @r, i64 %20
%22 = load i8, ptr %21, align 1
%23 = icmp ule i8 %18, %22
%24 = sext i1 %23 to i32
%25 = add i32 %17, %24
%26 = load i8, ptr getelementptr (i8, ptr @r, i64 -24147), align 1
%27 = trunc i8 %26 to i1
%28 = select i1 %27, i64 %0, i64 0
%29 = getelementptr i8, ptr @r, i64 %28
%30 = load i8, ptr %29, align 1
%31 = icmp ule i8 %26, %30
%32 = sext i1 %31 to i32
%33 = add i32 %25, %32
store i32 %33, ptr %1, align 4
ret void
}

0 comments on commit d18b1eb

Please sign in to comment.