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 llvm#127128

(cherry picked from commit ac217ee)
  • Loading branch information
alexey-bataev authored and Zentrik committed Feb 14, 2025
1 parent 3cb75ba commit 7c6f2dd
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 @@ -11011,8 +11011,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 7c6f2dd

Please sign in to comment.