xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/gather_extract_from_vectorbuild.ll (revision 706e71076e0276747e7ae94e3f8a7f73a45e5b6e)
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.
8
9define void @test() {
10; CHECK-LABEL: define void @test() {
11; CHECK-NEXT:  entry:
12; CHECK-NEXT:    br label [[LOOP:%.*]]
13; CHECK:       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]]
19;
20entry:
21  br label %loop
22
23loop:
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
33  br label %loop
34}
35
36define void @test1() {
37; CHECK-LABEL: define void @test1() {
38; CHECK-NEXT:  entry:
39; CHECK-NEXT:    br label [[LOOP:%.*]]
40; CHECK:       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]]
45;
46entry:
47  br label %loop
48
49loop:
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
60  br label %loop
61}
62
63define void @test2() {
64; CHECK-LABEL: define void @test2() {
65; CHECK-NEXT:  entry:
66; CHECK-NEXT:    br label [[BB3:%.*]]
67; CHECK:       bb1:
68; CHECK-NEXT:    [[PH:%.*]] = phi float [ poison, [[BB2:%.*]] ], [ [[TMP3:%.*]], [[LOOP:%.*]] ]
69; CHECK-NEXT:    unreachable
70; CHECK:       bb2:
71; CHECK-NEXT:    br i1 poison, label [[BB3]], label [[BB1:%.*]]
72; CHECK:       bb3:
73; CHECK-NEXT:    br label [[LOOP]]
74; CHECK:       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]]
80;
81entry:
82  br label %bb3
83
84bb1:
85  %ph = phi float [ poison, %bb2 ], [ %i5, %loop ]
86  unreachable
87
88bb2:
89  br i1 poison, label %bb3, label %bb1
90
91bb3:
92  br label %loop
93
94loop:
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
106}
107