xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/AArch64/reused-scalar-repeated-in-node.ll (revision 07d284d4ebffd58d4b2934769b4e11fedd0b106e)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt -S --passes=slp-vectorizer -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
3
4define void @test() {
5; CHECK-LABEL: define void @test() {
6; CHECK-NEXT:  [[ENTRY:.*:]]
7; CHECK-NEXT:    br label %[[BB61:.*]]
8; CHECK:       [[BB61]]:
9; CHECK-NEXT:    br label %[[BB64:.*]]
10; CHECK:       [[BB62:.*]]:
11; CHECK-NEXT:    br i1 poison, label %[[BB63:.*]], label %[[BB64]]
12; CHECK:       [[BB63]]:
13; CHECK-NEXT:    br label %[[BB64]]
14; CHECK:       [[BB64]]:
15; CHECK-NEXT:    [[TMP25:%.*]] = phi <16 x float> [ poison, %[[BB61]] ], [ poison, %[[BB63]] ], [ poison, %[[BB62]] ]
16; CHECK-NEXT:    [[I66:%.*]] = load float, ptr poison, align 16
17; CHECK-NEXT:    [[I67:%.*]] = load float, ptr poison, align 4
18; CHECK-NEXT:    [[I68:%.*]] = load float, ptr poison, align 8
19; CHECK-NEXT:    [[I69:%.*]] = load float, ptr poison, align 4
20; CHECK-NEXT:    [[I70:%.*]] = load float, ptr poison, align 4
21; CHECK-NEXT:    [[I71:%.*]] = load float, ptr poison, align 16
22; CHECK-NEXT:    [[I72:%.*]] = load float, ptr poison, align 4
23; CHECK-NEXT:    [[I73:%.*]] = load float, ptr poison, align 8
24; CHECK-NEXT:    [[I74:%.*]] = load float, ptr poison, align 4
25; CHECK-NEXT:    [[I75:%.*]] = load float, ptr poison, align 16
26; CHECK-NEXT:    [[I76:%.*]] = load float, ptr poison, align 4
27; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <16 x float> poison, float [[I76]], i32 0
28; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <16 x float> [[TMP1]], float [[I75]], i32 1
29; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <16 x float> [[TMP2]], float [[I74]], i32 2
30; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <16 x float> [[TMP3]], float [[I73]], i32 3
31; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <16 x float> [[TMP4]], float [[I71]], i32 4
32; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <16 x float> [[TMP5]], float [[I70]], i32 5
33; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <16 x float> [[TMP6]], float [[I68]], i32 6
34; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <16 x float> [[TMP7]], float [[I66]], i32 7
35; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <16 x float> [[TMP8]], float [[I72]], i32 13
36; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <16 x float> [[TMP9]], float [[I67]], i32 14
37; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <16 x float> [[TMP10]], float [[I69]], i32 15
38; CHECK-NEXT:    br i1 poison, label %[[BB167:.*]], label %[[BB77:.*]]
39; CHECK:       [[BB77]]:
40; CHECK-NEXT:    [[TMP12:%.*]] = shufflevector <16 x float> [[TMP11]], <16 x float> poison, <8 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 14, i32 15, i32 poison, i32 poison>
41; CHECK-NEXT:    [[TMP17:%.*]] = insertelement <8 x float> [[TMP12]], float [[I70]], i32 0
42; CHECK-NEXT:    [[TMP30:%.*]] = insertelement <2 x float> poison, float [[I68]], i32 0
43; CHECK-NEXT:    [[TMP31:%.*]] = insertelement <2 x float> [[TMP30]], float [[I66]], i32 1
44; CHECK-NEXT:    [[TMP39:%.*]] = shufflevector <16 x float> [[TMP25]], <16 x float> poison, <16 x i32> <i32 poison, i32 poison, i32 3, i32 2, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
45; CHECK-NEXT:    [[TMP13:%.*]] = shufflevector <16 x float> [[TMP39]], <16 x float> [[TMP25]], <16 x i32> <i32 poison, i32 poison, i32 2, i32 3, i32 18, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 19, i32 poison, i32 poison>
46; CHECK-NEXT:    br label %[[BB78:.*]]
47; CHECK:       [[BB78]]:
48; CHECK-NEXT:    [[TMP15:%.*]] = phi <8 x float> [ [[TMP17]], %[[BB77]] ], [ [[TMP36:%.*]], %[[BB78]] ]
49; CHECK-NEXT:    [[TMP16:%.*]] = phi <2 x float> [ [[TMP31]], %[[BB77]] ], [ [[TMP37:%.*]], %[[BB78]] ]
50; CHECK-NEXT:    [[TMP38:%.*]] = shufflevector <8 x float> [[TMP15]], <8 x float> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 1, i32 0, i32 3, i32 1, i32 3, i32 5, i32 3, i32 1, i32 0, i32 4, i32 5, i32 5>
51; CHECK-NEXT:    [[TMP21:%.*]] = shufflevector <8 x float> [[TMP15]], <8 x float> poison, <16 x i32> <i32 2, i32 poison, i32 0, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
52; CHECK-NEXT:    [[TMP20:%.*]] = shufflevector <2 x float> [[TMP16]], <2 x float> poison, <16 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
53; CHECK-NEXT:    [[TMP23:%.*]] = shufflevector <16 x float> [[TMP21]], <16 x float> [[TMP20]], <16 x i32> <i32 0, i32 17, i32 2, i32 16, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
54; CHECK-NEXT:    [[TMP22:%.*]] = shufflevector <8 x float> [[TMP15]], <8 x float> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
55; CHECK-NEXT:    [[TMP40:%.*]] = shufflevector <16 x float> [[TMP23]], <16 x float> [[TMP22]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 18, i32 6, i32 7, i32 8, i32 20, i32 10, i32 11, i32 12, i32 21, i32 14, i32 15>
56; CHECK-NEXT:    [[TMP24:%.*]] = shufflevector <16 x float> [[TMP40]], <16 x float> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 1, i32 5, i32 3, i32 1, i32 3, i32 9, i32 3, i32 1, i32 5, i32 13, i32 9, i32 9>
57; CHECK-NEXT:    [[TMP18:%.*]] = fmul fast <16 x float> [[TMP24]], [[TMP13]]
58; CHECK-NEXT:    [[TMP26:%.*]] = fmul fast <16 x float> [[TMP38]], [[TMP25]]
59; CHECK-NEXT:    [[TMP27:%.*]] = fadd fast <16 x float> [[TMP26]], [[TMP18]]
60; CHECK-NEXT:    [[TMP28:%.*]] = fadd fast <16 x float> [[TMP27]], poison
61; CHECK-NEXT:    [[TMP29:%.*]] = fadd fast <16 x float> [[TMP28]], poison
62; CHECK-NEXT:    [[TMP36]] = shufflevector <16 x float> [[TMP29]], <16 x float> poison, <8 x i32> <i32 5, i32 11, i32 12, i32 10, i32 14, i32 15, i32 poison, i32 poison>
63; CHECK-NEXT:    [[TMP37]] = shufflevector <16 x float> [[TMP29]], <16 x float> poison, <2 x i32> <i32 6, i32 7>
64; CHECK-NEXT:    br i1 poison, label %[[BB78]], label %[[BB167]]
65; CHECK:       [[BB167]]:
66; CHECK-NEXT:    [[TMP32:%.*]] = phi <16 x float> [ [[TMP11]], %[[BB64]] ], [ [[TMP29]], %[[BB78]] ]
67; CHECK-NEXT:    [[TMP33:%.*]] = extractelement <16 x float> [[TMP32]], i32 14
68; CHECK-NEXT:    store float [[TMP33]], ptr poison, align 1
69; CHECK-NEXT:    [[TMP34:%.*]] = extractelement <16 x float> [[TMP32]], i32 13
70; CHECK-NEXT:    store float [[TMP34]], ptr poison, align 1
71; CHECK-NEXT:    [[TMP35:%.*]] = extractelement <16 x float> [[TMP32]], i32 15
72; CHECK-NEXT:    br i1 poison, label %[[BB186:.*]], label %[[BB184:.*]]
73; CHECK:       [[BB184]]:
74; CHECK-NEXT:    br label %[[BB185:.*]]
75; CHECK:       [[BB185]]:
76; CHECK-NEXT:    br i1 poison, label %[[BB185]], label %[[BB186]]
77; CHECK:       [[BB186]]:
78; CHECK-NEXT:    [[I187:%.*]] = phi nsz float [ [[TMP35]], %[[BB167]] ], [ poison, %[[BB185]] ]
79; CHECK-NEXT:    ret void
80;
81entry:
82  br label %bb61
83
84bb61:
85  br label %bb64
86
87bb62:
88  br i1 poison, label %bb63, label %bb64
89
90bb63:
91  br label %bb64
92
93bb64:
94  %i = phi nsz float [ poison, %bb61 ], [ poison, %bb63 ], [ poison, %bb62 ]
95  %i65 = phi nsz float [ poison, %bb61 ], [ poison, %bb63 ], [ poison, %bb62 ]
96  %i66 = load float, ptr poison, align 16
97  %i67 = load float, ptr poison, align 4
98  %i68 = load float, ptr poison, align 8
99  %i69 = load float, ptr poison, align 4
100  %i70 = load float, ptr poison, align 4
101  %i71 = load float, ptr poison, align 16
102  %i72 = load float, ptr poison, align 4
103  %i73 = load float, ptr poison, align 8
104  %i74 = load float, ptr poison, align 4
105  %i75 = load float, ptr poison, align 16
106  %i76 = load float, ptr poison, align 4
107  br i1 poison, label %bb167, label %bb77
108
109bb77:
110  br label %bb78
111
112bb78:
113  %i79 = phi nsz float [ %i66, %bb77 ], [ %i103, %bb78 ]
114  %i80 = phi nsz float [ %i67, %bb77 ], [ %i104, %bb78 ]
115  %i81 = phi nsz float [ %i68, %bb77 ], [ %i105, %bb78 ]
116  %i82 = phi nsz float [ poison, %bb77 ], [ %i106, %bb78 ]
117  %i83 = phi nsz float [ poison, %bb77 ], [ %i123, %bb78 ]
118  %i84 = phi nsz float [ %i69, %bb77 ], [ %i124, %bb78 ]
119  %i85 = phi nsz float [ poison, %bb77 ], [ %i125, %bb78 ]
120  %i86 = phi nsz float [ %i70, %bb77 ], [ %i126, %bb78 ]
121  %i87 = fmul fast float %i79, poison
122  %i88 = fmul fast float %i80, poison
123  %i89 = fmul fast float %i81, poison
124  %i90 = fmul fast float %i82, poison
125  %i91 = fmul fast float %i83, poison
126  %i92 = fadd fast float %i91, %i87
127  %i93 = fmul fast float %i84, poison
128  %i94 = fadd fast float %i93, %i88
129  %i95 = fmul fast float %i85, poison
130  %i96 = fadd fast float %i95, %i89
131  %i97 = fmul fast float %i86, poison
132  %i98 = fadd fast float %i97, %i90
133  %i99 = fadd fast float %i92, poison
134  %i100 = fadd fast float %i94, poison
135  %i101 = fadd fast float %i96, poison
136  %i102 = fadd fast float %i98, poison
137  %i103 = fadd fast float %i99, poison
138  %i104 = fadd fast float %i100, poison
139  %i105 = fadd fast float %i101, poison
140  %i106 = fadd fast float %i102, poison
141  %i107 = fmul fast float %i79, poison
142  %i108 = fmul fast float %i80, poison
143  %i109 = fmul fast float %i81, poison
144  %i110 = fmul fast float %i82, poison
145  %i111 = fmul fast float %i83, poison
146  %i112 = fadd fast float %i111, %i107
147  %i113 = fmul fast float %i84, poison
148  %i114 = fadd fast float %i113, %i108
149  %i115 = fmul fast float %i85, poison
150  %i116 = fadd fast float %i115, %i109
151  %i117 = fmul fast float %i86, poison
152  %i118 = fadd fast float %i117, %i110
153  %i119 = fadd fast float %i112, poison
154  %i120 = fadd fast float %i114, poison
155  %i121 = fadd fast float %i116, poison
156  %i122 = fadd fast float %i118, poison
157  %i123 = fadd fast float %i119, poison
158  %i124 = fadd fast float %i120, poison
159  %i125 = fadd fast float %i121, poison
160  %i126 = fadd fast float %i122, poison
161  %i127 = fmul fast float %i79, %i
162  %i128 = fmul fast float %i80, %i
163  %i129 = fmul fast float %i81, %i
164  %i130 = fmul fast float %i82, %i
165  %i131 = fmul fast float %i83, %i65
166  %i132 = fadd fast float %i131, %i127
167  %i133 = fmul fast float %i84, %i65
168  %i134 = fadd fast float %i133, %i128
169  %i135 = fmul fast float %i85, %i65
170  %i136 = fadd fast float %i135, %i129
171  %i137 = fmul fast float %i86, %i65
172  %i138 = fadd fast float %i137, %i130
173  %i139 = fadd fast float %i132, poison
174  %i140 = fadd fast float %i134, poison
175  %i141 = fadd fast float %i136, poison
176  %i142 = fadd fast float %i138, poison
177  %i143 = fadd fast float %i139, poison
178  %i144 = fadd fast float %i140, poison
179  %i145 = fadd fast float %i141, poison
180  %i146 = fadd fast float %i142, poison
181  %i147 = fmul fast float %i79, poison
182  %i148 = fmul fast float %i80, poison
183  %i149 = fmul fast float %i81, poison
184  %i150 = fmul fast float %i82, poison
185  %i151 = fmul fast float %i83, poison
186  %i152 = fadd fast float %i151, %i147
187  %i153 = fmul fast float %i84, poison
188  %i154 = fadd fast float %i153, %i148
189  %i155 = fmul fast float %i85, poison
190  %i156 = fadd fast float %i155, %i149
191  %i157 = fmul fast float %i86, poison
192  %i158 = fadd fast float %i157, %i150
193  %i159 = fadd fast float %i152, poison
194  %i160 = fadd fast float %i154, poison
195  %i161 = fadd fast float %i156, poison
196  %i162 = fadd fast float %i158, poison
197  %i163 = fadd fast float %i159, poison
198  %i164 = fadd fast float %i160, poison
199  %i165 = fadd fast float %i161, poison
200  %i166 = fadd fast float %i162, poison
201  br i1 poison, label %bb78, label %bb167
202
203bb167:
204  %i168 = phi nsz float [ %i76, %bb64 ], [ %i166, %bb78 ]
205  %i169 = phi nsz float [ poison, %bb64 ], [ %i165, %bb78 ]
206  %i170 = phi nsz float [ poison, %bb64 ], [ %i164, %bb78 ]
207  %i171 = phi nsz float [ %i75, %bb64 ], [ %i163, %bb78 ]
208  %i172 = phi nsz float [ %i74, %bb64 ], [ %i146, %bb78 ]
209  %i173 = phi nsz float [ %i73, %bb64 ], [ %i145, %bb78 ]
210  %i174 = phi nsz float [ %i72, %bb64 ], [ %i144, %bb78 ]
211  %i175 = phi nsz float [ %i71, %bb64 ], [ %i143, %bb78 ]
212  %i176 = phi nsz float [ %i70, %bb64 ], [ %i126, %bb78 ]
213  %i177 = phi nsz float [ poison, %bb64 ], [ %i125, %bb78 ]
214  %i178 = phi nsz float [ %i69, %bb64 ], [ %i124, %bb78 ]
215  %i179 = phi nsz float [ poison, %bb64 ], [ %i123, %bb78 ]
216  %i180 = phi nsz float [ poison, %bb64 ], [ %i106, %bb78 ]
217  %i181 = phi nsz float [ %i68, %bb64 ], [ %i105, %bb78 ]
218  %i182 = phi nsz float [ %i67, %bb64 ], [ %i104, %bb78 ]
219  %i183 = phi nsz float [ %i66, %bb64 ], [ %i103, %bb78 ]
220  store float %i182, ptr poison, align 1
221  store float %i174, ptr poison, align 1
222  br i1 poison, label %bb186, label %bb184
223
224bb184:
225  br label %bb185
226
227bb185:
228  br i1 poison, label %bb185, label %bb186
229
230bb186:
231  %i187 = phi nsz float [ %i178, %bb167 ], [ poison, %bb185 ]
232  ret void
233}
234