1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2 ; RUN: %if x86-registered-target %{ opt -passes=slp-vectorizer -S -mtriple=x86_64 < %s | FileCheck %s %}
3 ; RUN: %if aarch64-registered-target %{ opt -passes=slp-vectorizer -S -mtriple=aarch64 < %s | FileCheck %s %}
4 ; Vectorization tree roots at vector build sequence (insertelement),
5 ; SLP crashed on generating vector code for pair {%i4, 0.0} trying to produce
6 ; a shuffle with %ins1 as a source because it was marked deleted
7 ; due to vectorization.
10 ; CHECK-LABEL: define void @test() {
12 ; CHECK-NEXT: br label [[LOOP:%.*]]
14 ; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x float> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[TMP3:%.*]], [[LOOP]] ]
15 ; CHECK-NEXT: [[TMP1:%.*]] = fadd <2 x float> zeroinitializer, [[TMP0]]
16 ; CHECK-NEXT: [[TMP2:%.*]] = select <2 x i1> zeroinitializer, <2 x float> [[TMP1]], <2 x float> zeroinitializer
17 ; CHECK-NEXT: [[TMP3]] = shufflevector <2 x float> [[TMP2]], <2 x float> <float poison, float 0.000000e+00>, <2 x i32> <i32 0, i32 3>
18 ; CHECK-NEXT: br label [[LOOP]]
24 %ph0 = phi float [ 0.000000e+00, %entry ], [ %i4, %loop ]
25 %ph1 = phi float [ 0.000000e+00, %entry ], [ 0.000000e+00, %loop ]
26 %i = fadd float 0.000000e+00, %ph0
27 %i1 = fadd float 0.000000e+00, %ph1
28 %i2 = select i1 false, float %i, float 0.000000e+00
29 %i3 = select i1 false, float %i1, float 0.000000e+00
30 %ins0 = insertelement <2 x float> zeroinitializer, float %i2, i64 0
31 %ins1 = insertelement <2 x float> %ins0, float %i3, i64 1
32 %i4 = extractelement <2 x float> %ins1, i64 0
36 define void @test1() {
37 ; CHECK-LABEL: define void @test1() {
39 ; CHECK-NEXT: br label [[LOOP:%.*]]
41 ; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x float> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[TMP2:%.*]], [[LOOP]] ]
42 ; CHECK-NEXT: [[TMP1:%.*]] = fadd <2 x float> zeroinitializer, [[TMP0]]
43 ; CHECK-NEXT: [[TMP2]] = select <2 x i1> zeroinitializer, <2 x float> [[TMP1]], <2 x float> zeroinitializer
44 ; CHECK-NEXT: br label [[LOOP]]
50 %ph0 = phi float [ 0.000000e+00, %entry ], [ %i4, %loop ]
51 %ph1 = phi float [ 0.000000e+00, %entry ], [ %i5, %loop ]
52 %i = fadd float 0.000000e+00, %ph0
53 %i1 = fadd float 0.000000e+00, %ph1
54 %i2 = select i1 false, float %i, float 0.000000e+00
55 %i3 = select i1 false, float %i1, float 0.000000e+00
56 %ins0 = insertelement <2 x float> zeroinitializer, float %i2, i64 0
57 %ins1 = insertelement <2 x float> %ins0, float %i3, i64 1
58 %i4 = extractelement <2 x float> %ins1, i64 0
59 %i5 = extractelement <2 x float> %ins1, i64 1
63 define void @test2() {
64 ; CHECK-LABEL: define void @test2() {
66 ; CHECK-NEXT: br label [[BB3:%.*]]
68 ; CHECK-NEXT: [[PH:%.*]] = phi float [ poison, [[BB2:%.*]] ], [ [[TMP3:%.*]], [[LOOP:%.*]] ]
69 ; CHECK-NEXT: unreachable
71 ; CHECK-NEXT: br i1 poison, label [[BB3]], label [[BB1:%.*]]
73 ; CHECK-NEXT: br label [[LOOP]]
75 ; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x float> [ zeroinitializer, [[BB3]] ], [ [[TMP2:%.*]], [[LOOP]] ]
76 ; CHECK-NEXT: [[TMP1:%.*]] = fadd <2 x float> zeroinitializer, [[TMP0]]
77 ; CHECK-NEXT: [[TMP2]] = select <2 x i1> zeroinitializer, <2 x float> [[TMP1]], <2 x float> zeroinitializer
78 ; CHECK-NEXT: [[TMP3]] = extractelement <2 x float> [[TMP2]], i64 1
79 ; CHECK-NEXT: br i1 poison, label [[BB1]], label [[LOOP]]
85 %ph = phi float [ poison, %bb2 ], [ %i5, %loop ]
89 br i1 poison, label %bb3, label %bb1
95 %ph0 = phi float [ 0.000000e+00, %bb3 ], [ %i4, %loop ]
96 %ph1 = phi float [ 0.000000e+00, %bb3 ], [ %i5, %loop ]
97 %i = fadd float 0.000000e+00, %ph0
98 %i1 = fadd float 0.000000e+00, %ph1
99 %i2 = select i1 false, float %i, float 0.000000e+00
100 %i3 = select i1 false, float %i1, float 0.000000e+00
101 %ins0 = insertelement <2 x float> zeroinitializer, float %i2, i64 0
102 %ins1 = insertelement <2 x float> %ins0, float %i3, i64 1
103 %i4 = extractelement <2 x float> %ins1, i64 0
104 %i5 = extractelement <2 x float> %ins1, i64 1
105 br i1 poison, label %bb1, label %loop