[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / Transforms / SLPVectorizer / gather_extract_from_vectorbuild.ll
blobc1ec9b8eeadff8589496bee4832877d6e82dc539
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.
9 define 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]]
20 entry:
21   br label %loop
23 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
33   br label %loop
36 define 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]]
46 entry:
47   br label %loop
49 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
60   br label %loop
63 define 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]]
81 entry:
82   br label %bb3
84 bb1:
85   %ph = phi float [ poison, %bb2 ], [ %i5, %loop ]
86   unreachable
88 bb2:
89   br i1 poison, label %bb3, label %bb1
91 bb3:
92   br label %loop
94 loop:
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