Need to insert the vector value for the postponed gather/buildvector node after all uses non only if the vector value of the user node is phi, but also if the user node itself is PHI node, which may produce vector phi + shuffle. Fixes #162799
119 lines
5.0 KiB
LLVM
119 lines
5.0 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
|
|
; RUN: opt -passes=slp-vectorizer -S -slp-threshold=-99999 -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
|
|
|
|
define void @test(i32 %arg, i32 %arg1) {
|
|
; CHECK-LABEL: define void @test(
|
|
; CHECK-SAME: i32 [[ARG:%.*]], i32 [[ARG1:%.*]]) {
|
|
; CHECK-NEXT: [[BB:.*]]:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x i32> poison, i32 [[ARG1]], i32 0
|
|
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> poison, i32 [[ARG]], i32 0
|
|
; CHECK-NEXT: br label %[[BB6:.*]]
|
|
; CHECK: [[BB2:.*]]:
|
|
; CHECK-NEXT: [[TMP2:%.*]] = phi <4 x i32> [ [[TMP14:%.*]], %[[BB19:.*]] ]
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[BB6]]:
|
|
; CHECK-NEXT: [[TMP3:%.*]] = phi <4 x i32> [ zeroinitializer, %[[BB]] ], [ [[TMP17:%.*]], %[[BB26:.*]] ], [ [[TMP16:%.*]], %[[BB27:.*]] ], [ zeroinitializer, %[[BB25:.*]] ]
|
|
; CHECK-NEXT: switch i8 0, label %[[BB11:.*]] [
|
|
; CHECK-NEXT: i8 0, label %[[BB28:.*]]
|
|
; CHECK-NEXT: ]
|
|
; CHECK: [[BB11]]:
|
|
; CHECK-NEXT: [[PHI12:%.*]] = phi i32 [ 0, %[[BB28]] ], [ 0, %[[BB6]] ]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = phi <4 x i32> [ [[TMP3]], %[[BB28]] ], [ zeroinitializer, %[[BB6]] ]
|
|
; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> <i32 poison, i32 0, i32 poison, i32 poison>, <4 x i32> <i32 0, i32 5, i32 2, i32 3>
|
|
; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[ARG]], i32 0
|
|
; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> [[TMP6]], i32 [[PHI12]], i32 3
|
|
; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> <i32 poison, i32 0, i32 poison, i32 0>, <4 x i32> <i32 poison, i32 5, i32 2, i32 7>
|
|
; CHECK-NEXT: [[TMP9:%.*]] = shufflevector <4 x i32> [[TMP8]], <4 x i32> [[TMP1]], <4 x i32> <i32 4, i32 1, i32 2, i32 3>
|
|
; CHECK-NEXT: switch i8 0, label %[[BB19]] [
|
|
; CHECK-NEXT: i8 1, label %[[BB17:.*]]
|
|
; CHECK-NEXT: i8 0, label %[[BB18:.*]]
|
|
; CHECK-NEXT: ]
|
|
; CHECK: [[BB17]]:
|
|
; CHECK-NEXT: [[TMP10:%.*]] = add <4 x i32> [[TMP4]], zeroinitializer
|
|
; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> [[TMP10]], <4 x i32> <i32 0, i32 3, i32 6, i32 poison>
|
|
; CHECK-NEXT: [[TMP12:%.*]] = shufflevector <4 x i32> [[TMP11]], <4 x i32> <i32 poison, i32 poison, i32 poison, i32 0>, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
|
|
; CHECK-NEXT: br label %[[BB19]]
|
|
; CHECK: [[BB18]]:
|
|
; CHECK-NEXT: [[TMP13:%.*]] = shufflevector <4 x i32> [[TMP7]], <4 x i32> poison, <4 x i32> <i32 0, i32 3, i32 2, i32 0>
|
|
; CHECK-NEXT: br label %[[BB19]]
|
|
; CHECK: [[BB19]]:
|
|
; CHECK-NEXT: [[TMP14]] = phi <4 x i32> [ [[TMP10]], %[[BB17]] ], [ [[TMP7]], %[[BB18]] ], [ [[TMP9]], %[[BB11]] ]
|
|
; CHECK-NEXT: [[TMP15:%.*]] = phi <4 x i32> [ [[TMP12]], %[[BB17]] ], [ [[TMP13]], %[[BB18]] ], [ [[TMP7]], %[[BB11]] ]
|
|
; CHECK-NEXT: [[TMP16]] = shufflevector <4 x i32> [[TMP15]], <4 x i32> poison, <4 x i32> <i32 0, i32 3, i32 2, i32 1>
|
|
; CHECK-NEXT: br i1 false, label %[[BB2]], label %[[BB25]]
|
|
; CHECK: [[BB25]]:
|
|
; CHECK-NEXT: switch i8 0, label %[[BB6]] [
|
|
; CHECK-NEXT: i8 0, label %[[BB26]]
|
|
; CHECK-NEXT: i8 1, label %[[BB27]]
|
|
; CHECK-NEXT: i8 6, label %[[BB27]]
|
|
; CHECK-NEXT: ]
|
|
; CHECK: [[BB26]]:
|
|
; CHECK-NEXT: [[TMP17]] = shufflevector <4 x i32> [[TMP14]], <4 x i32> [[TMP0]], <4 x i32> <i32 4, i32 1, i32 2, i32 3>
|
|
; CHECK-NEXT: br label %[[BB6]]
|
|
; CHECK: [[BB27]]:
|
|
; CHECK-NEXT: br label %[[BB6]]
|
|
; CHECK: [[BB28]]:
|
|
; CHECK-NEXT: br label %[[BB11]]
|
|
;
|
|
bb:
|
|
br label %bb6
|
|
|
|
bb2:
|
|
%phi = phi i32 [ %phi21, %bb19 ]
|
|
%phi3 = phi i32 [ %phi22, %bb19 ]
|
|
%phi4 = phi i32 [ %phi23, %bb19 ]
|
|
%phi5 = phi i32 [ %phi24, %bb19 ]
|
|
ret void
|
|
|
|
bb6:
|
|
%phi7 = phi i32 [ 0, %bb ], [ %phi24, %bb26 ], [ %phi24, %bb27 ], [ 0, %bb25 ]
|
|
%phi8 = phi i32 [ 0, %bb ], [ %arg1, %bb26 ], [ %phi23, %bb27 ], [ 0, %bb25 ]
|
|
%phi9 = phi i32 [ 0, %bb ], [ %phi22, %bb26 ], [ %phi20, %bb27 ], [ 0, %bb25 ]
|
|
%phi10 = phi i32 [ 0, %bb ], [ %phi21, %bb26 ], [ %phi21, %bb27 ], [ 0, %bb25 ]
|
|
switch i8 0, label %bb11 [
|
|
i8 0, label %bb28
|
|
]
|
|
|
|
bb11:
|
|
%phi12 = phi i32 [ 0, %bb28 ], [ 0, %bb6 ]
|
|
%phi13 = phi i32 [ %phi10, %bb28 ], [ 0, %bb6 ]
|
|
%phi14 = phi i32 [ %phi9, %bb28 ], [ 0, %bb6 ]
|
|
%phi15 = phi i32 [ %phi8, %bb28 ], [ 0, %bb6 ]
|
|
%phi16 = phi i32 [ %phi7, %bb28 ], [ 0, %bb6 ]
|
|
switch i8 0, label %bb19 [
|
|
i8 1, label %bb17
|
|
i8 0, label %bb18
|
|
]
|
|
|
|
bb17:
|
|
%add = add i32 %phi16, 0
|
|
br label %bb19
|
|
|
|
bb18:
|
|
br label %bb19
|
|
|
|
bb19:
|
|
%phi20 = phi i32 [ 0, %bb17 ], [ %arg, %bb18 ], [ %phi12, %bb11 ]
|
|
%phi21 = phi i32 [ %phi13, %bb17 ], [ %phi12, %bb18 ], [ 0, %bb11 ]
|
|
%phi22 = phi i32 [ %phi14, %bb17 ], [ 0, %bb18 ], [ 0, %bb11 ]
|
|
%phi23 = phi i32 [ %phi15, %bb17 ], [ %arg, %bb18 ], [ %arg, %bb11 ]
|
|
%phi24 = phi i32 [ %add, %bb17 ], [ %phi16, %bb18 ], [ %phi16, %bb11 ]
|
|
br i1 false, label %bb2, label %bb25
|
|
|
|
bb25:
|
|
switch i8 0, label %bb6 [
|
|
i8 0, label %bb26
|
|
i8 1, label %bb27
|
|
i8 6, label %bb27
|
|
]
|
|
|
|
bb26:
|
|
br label %bb6
|
|
|
|
bb27:
|
|
br label %bb6
|
|
|
|
bb28:
|
|
br label %bb11
|
|
}
|