Skip to content

Commit

Permalink
[SLP] Check for PHI nodes (potentially cycles!) when checking depende…
Browse files Browse the repository at this point in the history
…ncies

When checking for dependecies for gather nodes with users with the same
last instruction, cannot rely on the index order, if there is (even
potential!) cycle in the graph, which may cause order not work correctly
and cause compiler crash.

Fixes #127128
  • Loading branch information
alexey-bataev committed Feb 13, 2025
1 parent 1ff5f32 commit ac217ee
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 3 deletions.
10 changes: 9 additions & 1 deletion llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13206,8 +13206,16 @@ BoUpSLP::isGatherShuffledSingleRegisterEntry(
continue;
// If the user instruction is used for some reason in different
// vectorized nodes - make it depend on index.
// If any vector node is PHI node, this dependency might not work
// because of cycle dependencies, so disable it.
if (TEUseEI.UserTE != UseEI.UserTE &&
TEUseEI.UserTE->Idx < UseEI.UserTE->Idx)
(TEUseEI.UserTE->Idx < UseEI.UserTE->Idx ||
any_of(
VectorizableTree,
[](const std::unique_ptr<TreeEntry> &TE) {
return TE->State == TreeEntry::Vectorize &&
TE->getOpcode() == Instruction::PHI;
})))
continue;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ define void @test() {
; CHECK-NEXT: [[TOBOOL:%.*]] = fcmp une float [[I2]], 0.000000e+00
; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <2 x float> [[TMP5]], <2 x float> poison, <2 x i32> <i32 poison, i32 0>
; CHECK-NEXT: [[TMP9]] = insertelement <2 x float> [[TMP8]], float [[I2]], i32 0
; CHECK-NEXT: [[TMP10]] = shufflevector <2 x float> [[TMP9]], <2 x float> [[TMP2]], <2 x i32> <i32 0, i32 3>
; CHECK-NEXT: [[TMP10]] = insertelement <2 x float> [[TMP2]], float [[I2]], i32 0
; CHECK-NEXT: br i1 [[TOBOOL]], label [[BB1]], label [[BB2]]
;
entry:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
; YAML: Function: test
; YAML: Args:
; YAML: - String: 'Stores SLP vectorized with cost '
; YAML: - Cost: '-6'
; YAML: - Cost: '-3'
; YAML: - String: ' and with tree size '
; YAML: - TreeSize: '14'
; YAML: ...
Expand Down
59 changes: 59 additions & 0 deletions llvm/test/Transforms/SLPVectorizer/X86/phi-node-with-cycle.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu -mcpu=haswell < %s | FileCheck %s

define void @test(float %0) {
; CHECK-LABEL: define void @test(
; CHECK-SAME: float [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x float> <float 0.000000e+00, float poison>, float [[TMP0]], i32 1
; CHECK-NEXT: [[TMP3:%.*]] = fdiv <2 x float> [[TMP2]], zeroinitializer
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x float> <float poison, float 0.000000e+00>, float [[TMP0]], i32 0
; CHECK-NEXT: [[TMP5:%.*]] = fdiv <2 x float> [[TMP4]], zeroinitializer
; CHECK-NEXT: br label %[[BB6:.*]]
; CHECK: [[BB6]]:
; CHECK-NEXT: [[TMP7:%.*]] = fmul <2 x float> [[TMP5]], zeroinitializer
; CHECK-NEXT: [[TMP8:%.*]] = fsub <2 x float> zeroinitializer, [[TMP7]]
; CHECK-NEXT: br label %[[BB10:.*]]
; CHECK: [[BB9:.*]]:
; CHECK-NEXT: br label %[[BB10]]
; CHECK: [[BB10]]:
; CHECK-NEXT: [[TMP11:%.*]] = phi <2 x float> [ [[TMP8]], %[[BB6]] ], [ poison, %[[BB9]] ]
; CHECK-NEXT: br label %[[BB12:.*]]
; CHECK: [[BB12]]:
; CHECK-NEXT: [[TMP13:%.*]] = fmul <2 x float> [[TMP3]], zeroinitializer
; CHECK-NEXT: [[TMP14:%.*]] = fsub <2 x float> [[TMP11]], [[TMP13]]
; CHECK-NEXT: [[TMP15:%.*]] = extractelement <2 x float> [[TMP14]], i32 0
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <2 x float> [[TMP14]], i32 1
; CHECK-NEXT: [[TMP17:%.*]] = fadd float [[TMP15]], [[TMP16]]
; CHECK-NEXT: [[TMP18:%.*]] = call float @llvm.fabs.f32(float [[TMP17]])
; CHECK-NEXT: ret void
;
%2 = fdiv float 0.000000e+00, 0.000000e+00
%3 = fdiv float 0.000000e+00, 0.000000e+00
%4 = fdiv float %0, 0.000000e+00
br label %5

5:
%6 = fmul float %4, 0.000000e+00
%7 = fsub float 0.000000e+00, %6
%8 = fmul float %3, 0.000000e+00
%9 = fsub float 0.000000e+00, %8
br label %11

10:
br label %11

11:
%12 = phi float [ %7, %5 ], [ 0.000000e+00, %10 ]
%13 = phi float [ %9, %5 ], [ 0.000000e+00, %10 ]
br label %14

14:
%15 = fmul float %2, 0.000000e+00
%16 = fsub float %12, %15
%17 = fmul float %4, 0.000000e+00
%18 = fsub float %13, %17
%19 = fadd float %16, %18
%20 = call float @llvm.fabs.f32(float %19)
ret void
}

0 comments on commit ac217ee

Please sign in to comment.