Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vreductions-fp-sdnode.ll
blobc5245451dc44091a105b1dd5940cb097e6328ff9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=ilp32d \
3 ; RUN:     -verify-machineinstrs < %s | FileCheck %s
4 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=lp64d \
5 ; RUN:     -verify-machineinstrs < %s | FileCheck %s
7 declare half @llvm.vector.reduce.fadd.nxv1f16(half, <vscale x 1 x half>)
9 define half @vreduce_fadd_nxv1f16(<vscale x 1 x half> %v, half %s) {
10 ; CHECK-LABEL: vreduce_fadd_nxv1f16:
11 ; CHECK:       # %bb.0:
12 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
13 ; CHECK-NEXT:    vfmv.s.f v9, fa0
14 ; CHECK-NEXT:    vfredusum.vs v8, v8, v9
15 ; CHECK-NEXT:    vfmv.f.s fa0, v8
16 ; CHECK-NEXT:    ret
17   %red = call reassoc half @llvm.vector.reduce.fadd.nxv1f16(half %s, <vscale x 1 x half> %v)
18   ret half %red
21 define half @vreduce_ord_fadd_nxv1f16(<vscale x 1 x half> %v, half %s) {
22 ; CHECK-LABEL: vreduce_ord_fadd_nxv1f16:
23 ; CHECK:       # %bb.0:
24 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
25 ; CHECK-NEXT:    vfmv.s.f v9, fa0
26 ; CHECK-NEXT:    vfredosum.vs v8, v8, v9
27 ; CHECK-NEXT:    vfmv.f.s fa0, v8
28 ; CHECK-NEXT:    ret
29   %red = call half @llvm.vector.reduce.fadd.nxv1f16(half %s, <vscale x 1 x half> %v)
30   ret half %red
33 declare half @llvm.vector.reduce.fadd.nxv2f16(half, <vscale x 2 x half>)
35 define half @vreduce_fadd_nxv2f16(<vscale x 2 x half> %v, half %s) {
36 ; CHECK-LABEL: vreduce_fadd_nxv2f16:
37 ; CHECK:       # %bb.0:
38 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
39 ; CHECK-NEXT:    vfmv.s.f v9, fa0
40 ; CHECK-NEXT:    vfredusum.vs v8, v8, v9
41 ; CHECK-NEXT:    vfmv.f.s fa0, v8
42 ; CHECK-NEXT:    ret
43   %red = call reassoc half @llvm.vector.reduce.fadd.nxv2f16(half %s, <vscale x 2 x half> %v)
44   ret half %red
47 define half @vreduce_ord_fadd_nxv2f16(<vscale x 2 x half> %v, half %s) {
48 ; CHECK-LABEL: vreduce_ord_fadd_nxv2f16:
49 ; CHECK:       # %bb.0:
50 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
51 ; CHECK-NEXT:    vfmv.s.f v9, fa0
52 ; CHECK-NEXT:    vfredosum.vs v8, v8, v9
53 ; CHECK-NEXT:    vfmv.f.s fa0, v8
54 ; CHECK-NEXT:    ret
55   %red = call half @llvm.vector.reduce.fadd.nxv2f16(half %s, <vscale x 2 x half> %v)
56   ret half %red
59 declare half @llvm.vector.reduce.fadd.nxv4f16(half, <vscale x 4 x half>)
61 define half @vreduce_fadd_nxv4f16(<vscale x 4 x half> %v, half %s) {
62 ; CHECK-LABEL: vreduce_fadd_nxv4f16:
63 ; CHECK:       # %bb.0:
64 ; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
65 ; CHECK-NEXT:    vfmv.s.f v9, fa0
66 ; CHECK-NEXT:    vfredusum.vs v8, v8, v9
67 ; CHECK-NEXT:    vfmv.f.s fa0, v8
68 ; CHECK-NEXT:    ret
69   %red = call reassoc half @llvm.vector.reduce.fadd.nxv4f16(half %s, <vscale x 4 x half> %v)
70   ret half %red
73 define half @vreduce_ord_fadd_nxv4f16(<vscale x 4 x half> %v, half %s) {
74 ; CHECK-LABEL: vreduce_ord_fadd_nxv4f16:
75 ; CHECK:       # %bb.0:
76 ; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
77 ; CHECK-NEXT:    vfmv.s.f v9, fa0
78 ; CHECK-NEXT:    vfredosum.vs v8, v8, v9
79 ; CHECK-NEXT:    vfmv.f.s fa0, v8
80 ; CHECK-NEXT:    ret
81   %red = call half @llvm.vector.reduce.fadd.nxv4f16(half %s, <vscale x 4 x half> %v)
82   ret half %red
85 declare float @llvm.vector.reduce.fadd.nxv1f32(float, <vscale x 1 x float>)
87 define float @vreduce_fadd_nxv1f32(<vscale x 1 x float> %v, float %s) {
88 ; CHECK-LABEL: vreduce_fadd_nxv1f32:
89 ; CHECK:       # %bb.0:
90 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
91 ; CHECK-NEXT:    vfmv.s.f v9, fa0
92 ; CHECK-NEXT:    vfredusum.vs v8, v8, v9
93 ; CHECK-NEXT:    vfmv.f.s fa0, v8
94 ; CHECK-NEXT:    ret
95   %red = call reassoc float @llvm.vector.reduce.fadd.nxv1f32(float %s, <vscale x 1 x float> %v)
96   ret float %red
99 define float @vreduce_ord_fadd_nxv1f32(<vscale x 1 x float> %v, float %s) {
100 ; CHECK-LABEL: vreduce_ord_fadd_nxv1f32:
101 ; CHECK:       # %bb.0:
102 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
103 ; CHECK-NEXT:    vfmv.s.f v9, fa0
104 ; CHECK-NEXT:    vfredosum.vs v8, v8, v9
105 ; CHECK-NEXT:    vfmv.f.s fa0, v8
106 ; CHECK-NEXT:    ret
107   %red = call float @llvm.vector.reduce.fadd.nxv1f32(float %s, <vscale x 1 x float> %v)
108   ret float %red
111 define float @vreduce_fwadd_nxv1f32(<vscale x 1 x half> %v, float %s) {
112 ; CHECK-LABEL: vreduce_fwadd_nxv1f32:
113 ; CHECK:       # %bb.0:
114 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
115 ; CHECK-NEXT:    vfmv.s.f v9, fa0
116 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
117 ; CHECK-NEXT:    vfwredusum.vs v8, v8, v9
118 ; CHECK-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
119 ; CHECK-NEXT:    vfmv.f.s fa0, v8
120 ; CHECK-NEXT:    ret
121   %e = fpext <vscale x 1 x half> %v to <vscale x 1 x float>
122   %red = call reassoc float @llvm.vector.reduce.fadd.nxv1f32(float %s, <vscale x 1 x float> %e)
123   ret float %red
126 define float @vreduce_ord_fwadd_nxv1f32(<vscale x 1 x half> %v, float %s) {
127 ; CHECK-LABEL: vreduce_ord_fwadd_nxv1f32:
128 ; CHECK:       # %bb.0:
129 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
130 ; CHECK-NEXT:    vfmv.s.f v9, fa0
131 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
132 ; CHECK-NEXT:    vfwredosum.vs v8, v8, v9
133 ; CHECK-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
134 ; CHECK-NEXT:    vfmv.f.s fa0, v8
135 ; CHECK-NEXT:    ret
136   %e = fpext <vscale x 1 x half> %v to <vscale x 1 x float>
137   %red = call float @llvm.vector.reduce.fadd.nxv1f32(float %s, <vscale x 1 x float> %e)
138   ret float %red
141 declare float @llvm.vector.reduce.fadd.nxv2f32(float, <vscale x 2 x float>)
143 define float @vreduce_fadd_nxv2f32(<vscale x 2 x float> %v, float %s) {
144 ; CHECK-LABEL: vreduce_fadd_nxv2f32:
145 ; CHECK:       # %bb.0:
146 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
147 ; CHECK-NEXT:    vfmv.s.f v9, fa0
148 ; CHECK-NEXT:    vfredusum.vs v8, v8, v9
149 ; CHECK-NEXT:    vfmv.f.s fa0, v8
150 ; CHECK-NEXT:    ret
151   %red = call reassoc float @llvm.vector.reduce.fadd.nxv2f32(float %s, <vscale x 2 x float> %v)
152   ret float %red
155 define float @vreduce_ord_fadd_nxv2f32(<vscale x 2 x float> %v, float %s) {
156 ; CHECK-LABEL: vreduce_ord_fadd_nxv2f32:
157 ; CHECK:       # %bb.0:
158 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
159 ; CHECK-NEXT:    vfmv.s.f v9, fa0
160 ; CHECK-NEXT:    vfredosum.vs v8, v8, v9
161 ; CHECK-NEXT:    vfmv.f.s fa0, v8
162 ; CHECK-NEXT:    ret
163   %red = call float @llvm.vector.reduce.fadd.nxv2f32(float %s, <vscale x 2 x float> %v)
164   ret float %red
167 define float @vreduce_fwadd_nxv2f32(<vscale x 2 x half> %v, float %s) {
168 ; CHECK-LABEL: vreduce_fwadd_nxv2f32:
169 ; CHECK:       # %bb.0:
170 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
171 ; CHECK-NEXT:    vfmv.s.f v9, fa0
172 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
173 ; CHECK-NEXT:    vfwredusum.vs v8, v8, v9
174 ; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
175 ; CHECK-NEXT:    vfmv.f.s fa0, v8
176 ; CHECK-NEXT:    ret
177   %e = fpext <vscale x 2 x half> %v to <vscale x 2 x float>
178   %red = call reassoc float @llvm.vector.reduce.fadd.nxv2f32(float %s, <vscale x 2 x float> %e)
179   ret float %red
182 define float @vreduce_ord_fwadd_nxv2f32(<vscale x 2 x half> %v, float %s) {
183 ; CHECK-LABEL: vreduce_ord_fwadd_nxv2f32:
184 ; CHECK:       # %bb.0:
185 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
186 ; CHECK-NEXT:    vfmv.s.f v9, fa0
187 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
188 ; CHECK-NEXT:    vfwredosum.vs v8, v8, v9
189 ; CHECK-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
190 ; CHECK-NEXT:    vfmv.f.s fa0, v8
191 ; CHECK-NEXT:    ret
192   %e = fpext <vscale x 2 x half> %v to <vscale x 2 x float>
193   %red = call float @llvm.vector.reduce.fadd.nxv2f32(float %s, <vscale x 2 x float> %e)
194   ret float %red
197 declare float @llvm.vector.reduce.fadd.nxv4f32(float, <vscale x 4 x float>)
199 define float @vreduce_fadd_nxv4f32(<vscale x 4 x float> %v, float %s) {
200 ; CHECK-LABEL: vreduce_fadd_nxv4f32:
201 ; CHECK:       # %bb.0:
202 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
203 ; CHECK-NEXT:    vfmv.s.f v10, fa0
204 ; CHECK-NEXT:    vfredusum.vs v8, v8, v10
205 ; CHECK-NEXT:    vfmv.f.s fa0, v8
206 ; CHECK-NEXT:    ret
207   %red = call reassoc float @llvm.vector.reduce.fadd.nxv4f32(float %s, <vscale x 4 x float> %v)
208   ret float %red
211 define float @vreduce_ord_fadd_nxv4f32(<vscale x 4 x float> %v, float %s) {
212 ; CHECK-LABEL: vreduce_ord_fadd_nxv4f32:
213 ; CHECK:       # %bb.0:
214 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
215 ; CHECK-NEXT:    vfmv.s.f v10, fa0
216 ; CHECK-NEXT:    vfredosum.vs v8, v8, v10
217 ; CHECK-NEXT:    vfmv.f.s fa0, v8
218 ; CHECK-NEXT:    ret
219   %red = call float @llvm.vector.reduce.fadd.nxv4f32(float %s, <vscale x 4 x float> %v)
220   ret float %red
223 define float @vreduce_fwadd_nxv4f32(<vscale x 4 x half> %v, float %s) {
224 ; CHECK-LABEL: vreduce_fwadd_nxv4f32:
225 ; CHECK:       # %bb.0:
226 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
227 ; CHECK-NEXT:    vfmv.s.f v9, fa0
228 ; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
229 ; CHECK-NEXT:    vfwredusum.vs v8, v8, v9
230 ; CHECK-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
231 ; CHECK-NEXT:    vfmv.f.s fa0, v8
232 ; CHECK-NEXT:    ret
233   %e = fpext <vscale x 4 x half> %v to <vscale x 4 x float>
234   %red = call reassoc float @llvm.vector.reduce.fadd.nxv4f32(float %s, <vscale x 4 x float> %e)
235   ret float %red
238 define float @vreduce_ord_fwadd_nxv4f32(<vscale x 4 x half> %v, float %s) {
239 ; CHECK-LABEL: vreduce_ord_fwadd_nxv4f32:
240 ; CHECK:       # %bb.0:
241 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
242 ; CHECK-NEXT:    vfmv.s.f v9, fa0
243 ; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
244 ; CHECK-NEXT:    vfwredosum.vs v8, v8, v9
245 ; CHECK-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
246 ; CHECK-NEXT:    vfmv.f.s fa0, v8
247 ; CHECK-NEXT:    ret
248   %e = fpext <vscale x 4 x half> %v to <vscale x 4 x float>
249   %red = call float @llvm.vector.reduce.fadd.nxv4f32(float %s, <vscale x 4 x float> %e)
250   ret float %red
253 declare double @llvm.vector.reduce.fadd.nxv1f64(double, <vscale x 1 x double>)
255 define double @vreduce_fadd_nxv1f64(<vscale x 1 x double> %v, double %s) {
256 ; CHECK-LABEL: vreduce_fadd_nxv1f64:
257 ; CHECK:       # %bb.0:
258 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
259 ; CHECK-NEXT:    vfmv.s.f v9, fa0
260 ; CHECK-NEXT:    vfredusum.vs v8, v8, v9
261 ; CHECK-NEXT:    vfmv.f.s fa0, v8
262 ; CHECK-NEXT:    ret
263   %red = call reassoc double @llvm.vector.reduce.fadd.nxv1f64(double %s, <vscale x 1 x double> %v)
264   ret double %red
267 define double @vreduce_ord_fadd_nxv1f64(<vscale x 1 x double> %v, double %s) {
268 ; CHECK-LABEL: vreduce_ord_fadd_nxv1f64:
269 ; CHECK:       # %bb.0:
270 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
271 ; CHECK-NEXT:    vfmv.s.f v9, fa0
272 ; CHECK-NEXT:    vfredosum.vs v8, v8, v9
273 ; CHECK-NEXT:    vfmv.f.s fa0, v8
274 ; CHECK-NEXT:    ret
275   %red = call double @llvm.vector.reduce.fadd.nxv1f64(double %s, <vscale x 1 x double> %v)
276   ret double %red
279 define double @vreduce_fwadd_nxv1f64(<vscale x 1 x float> %v, double %s) {
280 ; CHECK-LABEL: vreduce_fwadd_nxv1f64:
281 ; CHECK:       # %bb.0:
282 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
283 ; CHECK-NEXT:    vfmv.s.f v9, fa0
284 ; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
285 ; CHECK-NEXT:    vfwredusum.vs v8, v8, v9
286 ; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
287 ; CHECK-NEXT:    vfmv.f.s fa0, v8
288 ; CHECK-NEXT:    ret
289   %e = fpext <vscale x 1 x float> %v to <vscale x 1 x double>
290   %red = call reassoc double @llvm.vector.reduce.fadd.nxv1f64(double %s, <vscale x 1 x double> %e)
291   ret double %red
294 define double @vreduce_ord_fwadd_nxv1f64(<vscale x 1 x float> %v, double %s) {
295 ; CHECK-LABEL: vreduce_ord_fwadd_nxv1f64:
296 ; CHECK:       # %bb.0:
297 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
298 ; CHECK-NEXT:    vfmv.s.f v9, fa0
299 ; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
300 ; CHECK-NEXT:    vfwredosum.vs v8, v8, v9
301 ; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
302 ; CHECK-NEXT:    vfmv.f.s fa0, v8
303 ; CHECK-NEXT:    ret
304   %e = fpext <vscale x 1 x float> %v to <vscale x 1 x double>
305   %red = call double @llvm.vector.reduce.fadd.nxv1f64(double %s, <vscale x 1 x double> %e)
306   ret double %red
309 declare double @llvm.vector.reduce.fadd.nxv2f64(double, <vscale x 2 x double>)
311 define double @vreduce_fadd_nxv2f64(<vscale x 2 x double> %v, double %s) {
312 ; CHECK-LABEL: vreduce_fadd_nxv2f64:
313 ; CHECK:       # %bb.0:
314 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
315 ; CHECK-NEXT:    vfmv.s.f v10, fa0
316 ; CHECK-NEXT:    vfredusum.vs v8, v8, v10
317 ; CHECK-NEXT:    vfmv.f.s fa0, v8
318 ; CHECK-NEXT:    ret
319   %red = call reassoc double @llvm.vector.reduce.fadd.nxv2f64(double %s, <vscale x 2 x double> %v)
320   ret double %red
323 define double @vreduce_ord_fadd_nxv2f64(<vscale x 2 x double> %v, double %s) {
324 ; CHECK-LABEL: vreduce_ord_fadd_nxv2f64:
325 ; CHECK:       # %bb.0:
326 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
327 ; CHECK-NEXT:    vfmv.s.f v10, fa0
328 ; CHECK-NEXT:    vfredosum.vs v8, v8, v10
329 ; CHECK-NEXT:    vfmv.f.s fa0, v8
330 ; CHECK-NEXT:    ret
331   %red = call double @llvm.vector.reduce.fadd.nxv2f64(double %s, <vscale x 2 x double> %v)
332   ret double %red
335 define double @vreduce_fwadd_nxv2f64(<vscale x 2 x float> %v, double %s) {
336 ; CHECK-LABEL: vreduce_fwadd_nxv2f64:
337 ; CHECK:       # %bb.0:
338 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
339 ; CHECK-NEXT:    vfmv.s.f v9, fa0
340 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
341 ; CHECK-NEXT:    vfwredusum.vs v8, v8, v9
342 ; CHECK-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
343 ; CHECK-NEXT:    vfmv.f.s fa0, v8
344 ; CHECK-NEXT:    ret
345   %e = fpext <vscale x 2 x float> %v to <vscale x 2 x double>
346   %red = call reassoc double @llvm.vector.reduce.fadd.nxv2f64(double %s, <vscale x 2 x double> %e)
347   ret double %red
350 define double @vreduce_ord_fwadd_nxv2f64(<vscale x 2 x float> %v, double %s) {
351 ; CHECK-LABEL: vreduce_ord_fwadd_nxv2f64:
352 ; CHECK:       # %bb.0:
353 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
354 ; CHECK-NEXT:    vfmv.s.f v9, fa0
355 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
356 ; CHECK-NEXT:    vfwredosum.vs v8, v8, v9
357 ; CHECK-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
358 ; CHECK-NEXT:    vfmv.f.s fa0, v8
359 ; CHECK-NEXT:    ret
360   %e = fpext <vscale x 2 x float> %v to <vscale x 2 x double>
361   %red = call double @llvm.vector.reduce.fadd.nxv2f64(double %s, <vscale x 2 x double> %e)
362   ret double %red
365 declare double @llvm.vector.reduce.fadd.nxv4f64(double, <vscale x 4 x double>)
367 define double @vreduce_fadd_nxv4f64(<vscale x 4 x double> %v, double %s) {
368 ; CHECK-LABEL: vreduce_fadd_nxv4f64:
369 ; CHECK:       # %bb.0:
370 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
371 ; CHECK-NEXT:    vfmv.s.f v12, fa0
372 ; CHECK-NEXT:    vfredusum.vs v8, v8, v12
373 ; CHECK-NEXT:    vfmv.f.s fa0, v8
374 ; CHECK-NEXT:    ret
375   %red = call reassoc double @llvm.vector.reduce.fadd.nxv4f64(double %s, <vscale x 4 x double> %v)
376   ret double %red
379 define double @vreduce_ord_fadd_nxv4f64(<vscale x 4 x double> %v, double %s) {
380 ; CHECK-LABEL: vreduce_ord_fadd_nxv4f64:
381 ; CHECK:       # %bb.0:
382 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
383 ; CHECK-NEXT:    vfmv.s.f v12, fa0
384 ; CHECK-NEXT:    vfredosum.vs v8, v8, v12
385 ; CHECK-NEXT:    vfmv.f.s fa0, v8
386 ; CHECK-NEXT:    ret
387   %red = call double @llvm.vector.reduce.fadd.nxv4f64(double %s, <vscale x 4 x double> %v)
388   ret double %red
391 define double @vreduce_fwadd_nxv4f64(<vscale x 4 x float> %v, double %s) {
392 ; CHECK-LABEL: vreduce_fwadd_nxv4f64:
393 ; CHECK:       # %bb.0:
394 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
395 ; CHECK-NEXT:    vfmv.s.f v10, fa0
396 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
397 ; CHECK-NEXT:    vfwredusum.vs v8, v8, v10
398 ; CHECK-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
399 ; CHECK-NEXT:    vfmv.f.s fa0, v8
400 ; CHECK-NEXT:    ret
401   %e = fpext <vscale x 4 x float> %v to <vscale x 4 x double>
402   %red = call reassoc double @llvm.vector.reduce.fadd.nxv4f64(double %s, <vscale x 4 x double> %e)
403   ret double %red
406 define double @vreduce_ord_fwadd_nxv4f64(<vscale x 4 x float> %v, double %s) {
407 ; CHECK-LABEL: vreduce_ord_fwadd_nxv4f64:
408 ; CHECK:       # %bb.0:
409 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
410 ; CHECK-NEXT:    vfmv.s.f v10, fa0
411 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
412 ; CHECK-NEXT:    vfwredosum.vs v8, v8, v10
413 ; CHECK-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
414 ; CHECK-NEXT:    vfmv.f.s fa0, v8
415 ; CHECK-NEXT:    ret
416   %e = fpext <vscale x 4 x float> %v to <vscale x 4 x double>
417   %red = call double @llvm.vector.reduce.fadd.nxv4f64(double %s, <vscale x 4 x double> %e)
418   ret double %red
421 declare half @llvm.vector.reduce.fmin.nxv1f16(<vscale x 1 x half>)
423 define half @vreduce_fmin_nxv1f16(<vscale x 1 x half> %v) {
424 ; CHECK-LABEL: vreduce_fmin_nxv1f16:
425 ; CHECK:       # %bb.0:
426 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
427 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
428 ; CHECK-NEXT:    vfmv.f.s fa0, v8
429 ; CHECK-NEXT:    ret
430   %red = call half @llvm.vector.reduce.fmin.nxv1f16(<vscale x 1 x half> %v)
431   ret half %red
434 define half @vreduce_fmin_nxv1f16_nonans(<vscale x 1 x half> %v) #0 {
435 ; CHECK-LABEL: vreduce_fmin_nxv1f16_nonans:
436 ; CHECK:       # %bb.0:
437 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
438 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
439 ; CHECK-NEXT:    vfmv.f.s fa0, v8
440 ; CHECK-NEXT:    ret
441   %red = call nnan half @llvm.vector.reduce.fmin.nxv1f16(<vscale x 1 x half> %v)
442   ret half %red
445 define half @vreduce_fmin_nxv1f16_nonans_noinfs(<vscale x 1 x half> %v) #1 {
446 ; CHECK-LABEL: vreduce_fmin_nxv1f16_nonans_noinfs:
447 ; CHECK:       # %bb.0:
448 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
449 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
450 ; CHECK-NEXT:    vfmv.f.s fa0, v8
451 ; CHECK-NEXT:    ret
452   %red = call nnan ninf half @llvm.vector.reduce.fmin.nxv1f16(<vscale x 1 x half> %v)
453   ret half %red
456 declare half @llvm.vector.reduce.fmin.nxv2f16(<vscale x 2 x half>)
458 define half @vreduce_fmin_nxv2f16(<vscale x 2 x half> %v) {
459 ; CHECK-LABEL: vreduce_fmin_nxv2f16:
460 ; CHECK:       # %bb.0:
461 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
462 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
463 ; CHECK-NEXT:    vfmv.f.s fa0, v8
464 ; CHECK-NEXT:    ret
465   %red = call half @llvm.vector.reduce.fmin.nxv2f16(<vscale x 2 x half> %v)
466   ret half %red
469 declare half @llvm.vector.reduce.fmin.nxv4f16(<vscale x 4 x half>)
471 define half @vreduce_fmin_nxv4f16(<vscale x 4 x half> %v) {
472 ; CHECK-LABEL: vreduce_fmin_nxv4f16:
473 ; CHECK:       # %bb.0:
474 ; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
475 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
476 ; CHECK-NEXT:    vfmv.f.s fa0, v8
477 ; CHECK-NEXT:    ret
478   %red = call half @llvm.vector.reduce.fmin.nxv4f16(<vscale x 4 x half> %v)
479   ret half %red
482 declare half @llvm.vector.reduce.fmin.nxv64f16(<vscale x 64 x half>)
484 define half @vreduce_fmin_nxv64f16(<vscale x 64 x half> %v) {
485 ; CHECK-LABEL: vreduce_fmin_nxv64f16:
486 ; CHECK:       # %bb.0:
487 ; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
488 ; CHECK-NEXT:    vfmin.vv v8, v8, v16
489 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
490 ; CHECK-NEXT:    vfmv.f.s fa0, v8
491 ; CHECK-NEXT:    ret
492   %red = call half @llvm.vector.reduce.fmin.nxv64f16(<vscale x 64 x half> %v)
493   ret half %red
496 declare float @llvm.vector.reduce.fmin.nxv1f32(<vscale x 1 x float>)
498 define float @vreduce_fmin_nxv1f32(<vscale x 1 x float> %v) {
499 ; CHECK-LABEL: vreduce_fmin_nxv1f32:
500 ; CHECK:       # %bb.0:
501 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
502 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
503 ; CHECK-NEXT:    vfmv.f.s fa0, v8
504 ; CHECK-NEXT:    ret
505   %red = call float @llvm.vector.reduce.fmin.nxv1f32(<vscale x 1 x float> %v)
506   ret float %red
509 define float @vreduce_fmin_nxv1f32_nonans(<vscale x 1 x float> %v) {
510 ; CHECK-LABEL: vreduce_fmin_nxv1f32_nonans:
511 ; CHECK:       # %bb.0:
512 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
513 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
514 ; CHECK-NEXT:    vfmv.f.s fa0, v8
515 ; CHECK-NEXT:    ret
516   %red = call nnan float @llvm.vector.reduce.fmin.nxv1f32(<vscale x 1 x float> %v)
517   ret float %red
520 define float @vreduce_fmin_nxv1f32_nonans_noinfs(<vscale x 1 x float> %v) {
521 ; CHECK-LABEL: vreduce_fmin_nxv1f32_nonans_noinfs:
522 ; CHECK:       # %bb.0:
523 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
524 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
525 ; CHECK-NEXT:    vfmv.f.s fa0, v8
526 ; CHECK-NEXT:    ret
527   %red = call nnan ninf float @llvm.vector.reduce.fmin.nxv1f32(<vscale x 1 x float> %v)
528   ret float %red
531 declare float @llvm.vector.reduce.fmin.nxv2f32(<vscale x 2 x float>)
533 define float @vreduce_fmin_nxv2f32(<vscale x 2 x float> %v) {
534 ; CHECK-LABEL: vreduce_fmin_nxv2f32:
535 ; CHECK:       # %bb.0:
536 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
537 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
538 ; CHECK-NEXT:    vfmv.f.s fa0, v8
539 ; CHECK-NEXT:    ret
540   %red = call float @llvm.vector.reduce.fmin.nxv2f32(<vscale x 2 x float> %v)
541   ret float %red
544 declare float @llvm.vector.reduce.fmin.nxv4f32(<vscale x 4 x float>)
546 define float @vreduce_fmin_nxv4f32(<vscale x 4 x float> %v) {
547 ; CHECK-LABEL: vreduce_fmin_nxv4f32:
548 ; CHECK:       # %bb.0:
549 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
550 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
551 ; CHECK-NEXT:    vfmv.f.s fa0, v8
552 ; CHECK-NEXT:    ret
553   %red = call float @llvm.vector.reduce.fmin.nxv4f32(<vscale x 4 x float> %v)
554   ret float %red
557 declare float @llvm.vector.reduce.fmin.nxv32f32(<vscale x 32 x float>)
559 define float @vreduce_fmin_nxv32f32(<vscale x 32 x float> %v) {
560 ; CHECK-LABEL: vreduce_fmin_nxv32f32:
561 ; CHECK:       # %bb.0:
562 ; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
563 ; CHECK-NEXT:    vfmin.vv v8, v8, v16
564 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
565 ; CHECK-NEXT:    vfmv.f.s fa0, v8
566 ; CHECK-NEXT:    ret
567   %red = call float @llvm.vector.reduce.fmin.nxv32f32(<vscale x 32 x float> %v)
568   ret float %red
571 declare double @llvm.vector.reduce.fmin.nxv1f64(<vscale x 1 x double>)
573 define double @vreduce_fmin_nxv1f64(<vscale x 1 x double> %v) {
574 ; CHECK-LABEL: vreduce_fmin_nxv1f64:
575 ; CHECK:       # %bb.0:
576 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
577 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
578 ; CHECK-NEXT:    vfmv.f.s fa0, v8
579 ; CHECK-NEXT:    ret
580   %red = call double @llvm.vector.reduce.fmin.nxv1f64(<vscale x 1 x double> %v)
581   ret double %red
584 define double @vreduce_fmin_nxv1f64_nonans(<vscale x 1 x double> %v) {
585 ; CHECK-LABEL: vreduce_fmin_nxv1f64_nonans:
586 ; CHECK:       # %bb.0:
587 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
588 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
589 ; CHECK-NEXT:    vfmv.f.s fa0, v8
590 ; CHECK-NEXT:    ret
591   %red = call nnan double @llvm.vector.reduce.fmin.nxv1f64(<vscale x 1 x double> %v)
592   ret double %red
595 define double @vreduce_fmin_nxv1f64_nonans_noinfs(<vscale x 1 x double> %v) {
596 ; CHECK-LABEL: vreduce_fmin_nxv1f64_nonans_noinfs:
597 ; CHECK:       # %bb.0:
598 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
599 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
600 ; CHECK-NEXT:    vfmv.f.s fa0, v8
601 ; CHECK-NEXT:    ret
602   %red = call nnan ninf double @llvm.vector.reduce.fmin.nxv1f64(<vscale x 1 x double> %v)
603   ret double %red
606 declare double @llvm.vector.reduce.fmin.nxv2f64(<vscale x 2 x double>)
608 define double @vreduce_fmin_nxv2f64(<vscale x 2 x double> %v) {
609 ; CHECK-LABEL: vreduce_fmin_nxv2f64:
610 ; CHECK:       # %bb.0:
611 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
612 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
613 ; CHECK-NEXT:    vfmv.f.s fa0, v8
614 ; CHECK-NEXT:    ret
615   %red = call double @llvm.vector.reduce.fmin.nxv2f64(<vscale x 2 x double> %v)
616   ret double %red
619 declare double @llvm.vector.reduce.fmin.nxv4f64(<vscale x 4 x double>)
621 define double @vreduce_fmin_nxv4f64(<vscale x 4 x double> %v) {
622 ; CHECK-LABEL: vreduce_fmin_nxv4f64:
623 ; CHECK:       # %bb.0:
624 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
625 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
626 ; CHECK-NEXT:    vfmv.f.s fa0, v8
627 ; CHECK-NEXT:    ret
628   %red = call double @llvm.vector.reduce.fmin.nxv4f64(<vscale x 4 x double> %v)
629   ret double %red
632 declare double @llvm.vector.reduce.fmin.nxv16f64(<vscale x 16 x double>)
634 define double @vreduce_fmin_nxv16f64(<vscale x 16 x double> %v) {
635 ; CHECK-LABEL: vreduce_fmin_nxv16f64:
636 ; CHECK:       # %bb.0:
637 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
638 ; CHECK-NEXT:    vfmin.vv v8, v8, v16
639 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
640 ; CHECK-NEXT:    vfmv.f.s fa0, v8
641 ; CHECK-NEXT:    ret
642   %red = call double @llvm.vector.reduce.fmin.nxv16f64(<vscale x 16 x double> %v)
643   ret double %red
646 declare half @llvm.vector.reduce.fmax.nxv1f16(<vscale x 1 x half>)
648 define half @vreduce_fmax_nxv1f16(<vscale x 1 x half> %v) {
649 ; CHECK-LABEL: vreduce_fmax_nxv1f16:
650 ; CHECK:       # %bb.0:
651 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
652 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
653 ; CHECK-NEXT:    vfmv.f.s fa0, v8
654 ; CHECK-NEXT:    ret
655   %red = call half @llvm.vector.reduce.fmax.nxv1f16(<vscale x 1 x half> %v)
656   ret half %red
659 define half @vreduce_fmax_nxv1f16_nonans(<vscale x 1 x half> %v) #0 {
660 ; CHECK-LABEL: vreduce_fmax_nxv1f16_nonans:
661 ; CHECK:       # %bb.0:
662 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
663 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
664 ; CHECK-NEXT:    vfmv.f.s fa0, v8
665 ; CHECK-NEXT:    ret
666   %red = call nnan half @llvm.vector.reduce.fmax.nxv1f16(<vscale x 1 x half> %v)
667   ret half %red
670 define half @vreduce_fmax_nxv1f16_nonans_noinfs(<vscale x 1 x half> %v) #1 {
671 ; CHECK-LABEL: vreduce_fmax_nxv1f16_nonans_noinfs:
672 ; CHECK:       # %bb.0:
673 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
674 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
675 ; CHECK-NEXT:    vfmv.f.s fa0, v8
676 ; CHECK-NEXT:    ret
677   %red = call nnan ninf half @llvm.vector.reduce.fmax.nxv1f16(<vscale x 1 x half> %v)
678   ret half %red
681 declare half @llvm.vector.reduce.fmax.nxv2f16(<vscale x 2 x half>)
683 define half @vreduce_fmax_nxv2f16(<vscale x 2 x half> %v) {
684 ; CHECK-LABEL: vreduce_fmax_nxv2f16:
685 ; CHECK:       # %bb.0:
686 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
687 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
688 ; CHECK-NEXT:    vfmv.f.s fa0, v8
689 ; CHECK-NEXT:    ret
690   %red = call half @llvm.vector.reduce.fmax.nxv2f16(<vscale x 2 x half> %v)
691   ret half %red
694 declare half @llvm.vector.reduce.fmax.nxv4f16(<vscale x 4 x half>)
696 define half @vreduce_fmax_nxv4f16(<vscale x 4 x half> %v) {
697 ; CHECK-LABEL: vreduce_fmax_nxv4f16:
698 ; CHECK:       # %bb.0:
699 ; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
700 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
701 ; CHECK-NEXT:    vfmv.f.s fa0, v8
702 ; CHECK-NEXT:    ret
703   %red = call half @llvm.vector.reduce.fmax.nxv4f16(<vscale x 4 x half> %v)
704   ret half %red
707 declare half @llvm.vector.reduce.fmax.nxv64f16(<vscale x 64 x half>)
709 define half @vreduce_fmax_nxv64f16(<vscale x 64 x half> %v) {
710 ; CHECK-LABEL: vreduce_fmax_nxv64f16:
711 ; CHECK:       # %bb.0:
712 ; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
713 ; CHECK-NEXT:    vfmax.vv v8, v8, v16
714 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
715 ; CHECK-NEXT:    vfmv.f.s fa0, v8
716 ; CHECK-NEXT:    ret
717   %red = call half @llvm.vector.reduce.fmax.nxv64f16(<vscale x 64 x half> %v)
718   ret half %red
721 declare float @llvm.vector.reduce.fmax.nxv1f32(<vscale x 1 x float>)
723 define float @vreduce_fmax_nxv1f32(<vscale x 1 x float> %v) {
724 ; CHECK-LABEL: vreduce_fmax_nxv1f32:
725 ; CHECK:       # %bb.0:
726 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
727 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
728 ; CHECK-NEXT:    vfmv.f.s fa0, v8
729 ; CHECK-NEXT:    ret
730   %red = call float @llvm.vector.reduce.fmax.nxv1f32(<vscale x 1 x float> %v)
731   ret float %red
734 define float @vreduce_fmax_nxv1f32_nonans(<vscale x 1 x float> %v) {
735 ; CHECK-LABEL: vreduce_fmax_nxv1f32_nonans:
736 ; CHECK:       # %bb.0:
737 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
738 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
739 ; CHECK-NEXT:    vfmv.f.s fa0, v8
740 ; CHECK-NEXT:    ret
741   %red = call nnan float @llvm.vector.reduce.fmax.nxv1f32(<vscale x 1 x float> %v)
742   ret float %red
745 define float @vreduce_fmax_nxv1f32_nonans_noinfs(<vscale x 1 x float> %v) {
746 ; CHECK-LABEL: vreduce_fmax_nxv1f32_nonans_noinfs:
747 ; CHECK:       # %bb.0:
748 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
749 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
750 ; CHECK-NEXT:    vfmv.f.s fa0, v8
751 ; CHECK-NEXT:    ret
752   %red = call nnan ninf float @llvm.vector.reduce.fmax.nxv1f32(<vscale x 1 x float> %v)
753   ret float %red
756 declare float @llvm.vector.reduce.fmax.nxv2f32(<vscale x 2 x float>)
758 define float @vreduce_fmax_nxv2f32(<vscale x 2 x float> %v) {
759 ; CHECK-LABEL: vreduce_fmax_nxv2f32:
760 ; CHECK:       # %bb.0:
761 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
762 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
763 ; CHECK-NEXT:    vfmv.f.s fa0, v8
764 ; CHECK-NEXT:    ret
765   %red = call float @llvm.vector.reduce.fmax.nxv2f32(<vscale x 2 x float> %v)
766   ret float %red
769 declare float @llvm.vector.reduce.fmax.nxv4f32(<vscale x 4 x float>)
771 define float @vreduce_fmax_nxv4f32(<vscale x 4 x float> %v) {
772 ; CHECK-LABEL: vreduce_fmax_nxv4f32:
773 ; CHECK:       # %bb.0:
774 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
775 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
776 ; CHECK-NEXT:    vfmv.f.s fa0, v8
777 ; CHECK-NEXT:    ret
778   %red = call float @llvm.vector.reduce.fmax.nxv4f32(<vscale x 4 x float> %v)
779   ret float %red
782 declare float @llvm.vector.reduce.fmax.nxv32f32(<vscale x 32 x float>)
784 define float @vreduce_fmax_nxv32f32(<vscale x 32 x float> %v) {
785 ; CHECK-LABEL: vreduce_fmax_nxv32f32:
786 ; CHECK:       # %bb.0:
787 ; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
788 ; CHECK-NEXT:    vfmax.vv v8, v8, v16
789 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
790 ; CHECK-NEXT:    vfmv.f.s fa0, v8
791 ; CHECK-NEXT:    ret
792   %red = call float @llvm.vector.reduce.fmax.nxv32f32(<vscale x 32 x float> %v)
793   ret float %red
796 declare double @llvm.vector.reduce.fmax.nxv1f64(<vscale x 1 x double>)
798 define double @vreduce_fmax_nxv1f64(<vscale x 1 x double> %v) {
799 ; CHECK-LABEL: vreduce_fmax_nxv1f64:
800 ; CHECK:       # %bb.0:
801 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
802 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
803 ; CHECK-NEXT:    vfmv.f.s fa0, v8
804 ; CHECK-NEXT:    ret
805   %red = call double @llvm.vector.reduce.fmax.nxv1f64(<vscale x 1 x double> %v)
806   ret double %red
809 define double @vreduce_fmax_nxv1f64_nonans(<vscale x 1 x double> %v) {
810 ; CHECK-LABEL: vreduce_fmax_nxv1f64_nonans:
811 ; CHECK:       # %bb.0:
812 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
813 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
814 ; CHECK-NEXT:    vfmv.f.s fa0, v8
815 ; CHECK-NEXT:    ret
816   %red = call nnan double @llvm.vector.reduce.fmax.nxv1f64(<vscale x 1 x double> %v)
817   ret double %red
820 define double @vreduce_fmax_nxv1f64_nonans_noinfs(<vscale x 1 x double> %v) {
821 ; CHECK-LABEL: vreduce_fmax_nxv1f64_nonans_noinfs:
822 ; CHECK:       # %bb.0:
823 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
824 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
825 ; CHECK-NEXT:    vfmv.f.s fa0, v8
826 ; CHECK-NEXT:    ret
827   %red = call nnan ninf double @llvm.vector.reduce.fmax.nxv1f64(<vscale x 1 x double> %v)
828   ret double %red
831 declare double @llvm.vector.reduce.fmax.nxv2f64(<vscale x 2 x double>)
833 define double @vreduce_fmax_nxv2f64(<vscale x 2 x double> %v) {
834 ; CHECK-LABEL: vreduce_fmax_nxv2f64:
835 ; CHECK:       # %bb.0:
836 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
837 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
838 ; CHECK-NEXT:    vfmv.f.s fa0, v8
839 ; CHECK-NEXT:    ret
840   %red = call double @llvm.vector.reduce.fmax.nxv2f64(<vscale x 2 x double> %v)
841   ret double %red
844 declare double @llvm.vector.reduce.fmax.nxv4f64(<vscale x 4 x double>)
846 define double @vreduce_fmax_nxv4f64(<vscale x 4 x double> %v) {
847 ; CHECK-LABEL: vreduce_fmax_nxv4f64:
848 ; CHECK:       # %bb.0:
849 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
850 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
851 ; CHECK-NEXT:    vfmv.f.s fa0, v8
852 ; CHECK-NEXT:    ret
853   %red = call double @llvm.vector.reduce.fmax.nxv4f64(<vscale x 4 x double> %v)
854   ret double %red
857 declare double @llvm.vector.reduce.fmax.nxv16f64(<vscale x 16 x double>)
859 define double @vreduce_fmax_nxv16f64(<vscale x 16 x double> %v) {
860 ; CHECK-LABEL: vreduce_fmax_nxv16f64:
861 ; CHECK:       # %bb.0:
862 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
863 ; CHECK-NEXT:    vfmax.vv v8, v8, v16
864 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
865 ; CHECK-NEXT:    vfmv.f.s fa0, v8
866 ; CHECK-NEXT:    ret
867   %red = call double @llvm.vector.reduce.fmax.nxv16f64(<vscale x 16 x double> %v)
868   ret double %red
871 define float @vreduce_nsz_fadd_nxv1f32(<vscale x 1 x float> %v, float %s) {
872 ; CHECK-LABEL: vreduce_nsz_fadd_nxv1f32:
873 ; CHECK:       # %bb.0:
874 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
875 ; CHECK-NEXT:    vfmv.s.f v9, fa0
876 ; CHECK-NEXT:    vfredusum.vs v8, v8, v9
877 ; CHECK-NEXT:    vfmv.f.s fa0, v8
878 ; CHECK-NEXT:    ret
879   %red = call reassoc nsz float @llvm.vector.reduce.fadd.nxv1f32(float %s, <vscale x 1 x float> %v)
880   ret float %red
883 ; Test Widen VECREDUCE_SEQ_FADD
884 declare half @llvm.vector.reduce.fadd.nxv3f16(half, <vscale x 3 x half>)
886 define half @vreduce_ord_fadd_nxv3f16(<vscale x 3 x half> %v, half %s) {
887 ; CHECK-LABEL: vreduce_ord_fadd_nxv3f16:
888 ; CHECK:       # %bb.0:
889 ; CHECK-NEXT:    csrr a0, vlenb
890 ; CHECK-NEXT:    srli a0, a0, 3
891 ; CHECK-NEXT:    slli a1, a0, 1
892 ; CHECK-NEXT:    add a1, a1, a0
893 ; CHECK-NEXT:    add a0, a1, a0
894 ; CHECK-NEXT:    lui a2, 1048568
895 ; CHECK-NEXT:    vsetvli a3, zero, e16, m1, ta, ma
896 ; CHECK-NEXT:    vmv.v.x v9, a2
897 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, tu, ma
898 ; CHECK-NEXT:    vslideup.vx v8, v9, a1
899 ; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
900 ; CHECK-NEXT:    vfmv.s.f v9, fa0
901 ; CHECK-NEXT:    vfredosum.vs v8, v8, v9
902 ; CHECK-NEXT:    vfmv.f.s fa0, v8
903 ; CHECK-NEXT:    ret
904   %red = call half @llvm.vector.reduce.fadd.nxv3f16(half %s, <vscale x 3 x half> %v)
905   ret half %red
908 declare half @llvm.vector.reduce.fadd.nxv6f16(half, <vscale x 6 x half>)
910 define half @vreduce_ord_fadd_nxv6f16(<vscale x 6 x half> %v, half %s) {
911 ; CHECK-LABEL: vreduce_ord_fadd_nxv6f16:
912 ; CHECK:       # %bb.0:
913 ; CHECK-NEXT:    lui a0, 1048568
914 ; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
915 ; CHECK-NEXT:    vmv.v.x v10, a0
916 ; CHECK-NEXT:    csrr a0, vlenb
917 ; CHECK-NEXT:    srli a0, a0, 2
918 ; CHECK-NEXT:    add a1, a0, a0
919 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, tu, ma
920 ; CHECK-NEXT:    vslideup.vx v9, v10, a0
921 ; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
922 ; CHECK-NEXT:    vfmv.s.f v10, fa0
923 ; CHECK-NEXT:    vfredosum.vs v8, v8, v10
924 ; CHECK-NEXT:    vfmv.f.s fa0, v8
925 ; CHECK-NEXT:    ret
926   %red = call half @llvm.vector.reduce.fadd.nxv6f16(half %s, <vscale x 6 x half> %v)
927   ret half %red
930 declare half @llvm.vector.reduce.fadd.nxv10f16(half, <vscale x 10 x half>)
932 define half @vreduce_ord_fadd_nxv10f16(<vscale x 10 x half> %v, half %s) {
933 ; CHECK-LABEL: vreduce_ord_fadd_nxv10f16:
934 ; CHECK:       # %bb.0:
935 ; CHECK-NEXT:    lui a0, 1048568
936 ; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
937 ; CHECK-NEXT:    vmv.v.x v12, a0
938 ; CHECK-NEXT:    csrr a0, vlenb
939 ; CHECK-NEXT:    srli a0, a0, 2
940 ; CHECK-NEXT:    add a1, a0, a0
941 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, tu, ma
942 ; CHECK-NEXT:    vslideup.vx v10, v12, a0
943 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, tu, ma
944 ; CHECK-NEXT:    vmv.v.v v11, v12
945 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, tu, ma
946 ; CHECK-NEXT:    vslideup.vx v11, v12, a0
947 ; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
948 ; CHECK-NEXT:    vfmv.s.f v12, fa0
949 ; CHECK-NEXT:    vfredosum.vs v8, v8, v12
950 ; CHECK-NEXT:    vfmv.f.s fa0, v8
951 ; CHECK-NEXT:    ret
952   %red = call half @llvm.vector.reduce.fadd.nxv10f16(half %s, <vscale x 10 x half> %v)
953   ret half %red
956 declare half @llvm.vector.reduce.fadd.nxv12f16(half, <vscale x 12 x half>)
958 define half @vreduce_ord_fadd_nxv12f16(<vscale x 12 x half> %v, half %s) {
959 ; CHECK-LABEL: vreduce_ord_fadd_nxv12f16:
960 ; CHECK:       # %bb.0:
961 ; CHECK-NEXT:    lui a0, 1048568
962 ; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
963 ; CHECK-NEXT:    vmv.v.x v11, a0
964 ; CHECK-NEXT:    vfmv.s.f v12, fa0
965 ; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
966 ; CHECK-NEXT:    vfredosum.vs v8, v8, v12
967 ; CHECK-NEXT:    vfmv.f.s fa0, v8
968 ; CHECK-NEXT:    ret
969   %red = call half @llvm.vector.reduce.fadd.nxv12f16(half %s, <vscale x 12 x half> %v)
970   ret half %red
973 ; Test Widen vector reduce type (fadd/fmin/fmax)
974 define half @vreduce_fadd_nxv3f16(<vscale x 3 x half> %v, half %s) {
975 ; CHECK-LABEL: vreduce_fadd_nxv3f16:
976 ; CHECK:       # %bb.0:
977 ; CHECK-NEXT:    csrr a0, vlenb
978 ; CHECK-NEXT:    srli a0, a0, 3
979 ; CHECK-NEXT:    slli a1, a0, 1
980 ; CHECK-NEXT:    add a1, a1, a0
981 ; CHECK-NEXT:    add a0, a1, a0
982 ; CHECK-NEXT:    lui a2, 1048568
983 ; CHECK-NEXT:    vsetvli a3, zero, e16, m1, ta, ma
984 ; CHECK-NEXT:    vmv.v.x v9, a2
985 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, tu, ma
986 ; CHECK-NEXT:    vslideup.vx v8, v9, a1
987 ; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
988 ; CHECK-NEXT:    vfmv.s.f v9, fa0
989 ; CHECK-NEXT:    vfredusum.vs v8, v8, v9
990 ; CHECK-NEXT:    vfmv.f.s fa0, v8
991 ; CHECK-NEXT:    ret
992   %red = call reassoc half @llvm.vector.reduce.fadd.nxv3f16(half %s, <vscale x 3 x half> %v)
993   ret half %red
996 define half @vreduce_fadd_nxv6f16(<vscale x 6 x half> %v, half %s) {
997 ; CHECK-LABEL: vreduce_fadd_nxv6f16:
998 ; CHECK:       # %bb.0:
999 ; CHECK-NEXT:    lui a0, 1048568
1000 ; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
1001 ; CHECK-NEXT:    vmv.v.x v10, a0
1002 ; CHECK-NEXT:    csrr a0, vlenb
1003 ; CHECK-NEXT:    srli a0, a0, 2
1004 ; CHECK-NEXT:    add a1, a0, a0
1005 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, tu, ma
1006 ; CHECK-NEXT:    vslideup.vx v9, v10, a0
1007 ; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
1008 ; CHECK-NEXT:    vfmv.s.f v10, fa0
1009 ; CHECK-NEXT:    vfredusum.vs v8, v8, v10
1010 ; CHECK-NEXT:    vfmv.f.s fa0, v8
1011 ; CHECK-NEXT:    ret
1012   %red = call reassoc half @llvm.vector.reduce.fadd.nxv6f16(half %s, <vscale x 6 x half> %v)
1013   ret half %red
1016 declare half @llvm.vector.reduce.fmin.nxv10f16(<vscale x 10 x half>)
1018 define half @vreduce_fmin_nxv10f16(<vscale x 10 x half> %v) {
1019 ; CHECK-LABEL: vreduce_fmin_nxv10f16:
1020 ; CHECK:       # %bb.0:
1021 ; CHECK-NEXT:    csrr a0, vlenb
1022 ; CHECK-NEXT:    lui a1, %hi(.LCPI73_0)
1023 ; CHECK-NEXT:    addi a1, a1, %lo(.LCPI73_0)
1024 ; CHECK-NEXT:    vsetvli a2, zero, e16, m1, ta, ma
1025 ; CHECK-NEXT:    vlse16.v v12, (a1), zero
1026 ; CHECK-NEXT:    srli a0, a0, 2
1027 ; CHECK-NEXT:    add a1, a0, a0
1028 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, tu, ma
1029 ; CHECK-NEXT:    vslideup.vx v10, v12, a0
1030 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, tu, ma
1031 ; CHECK-NEXT:    vmv.v.v v11, v12
1032 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, tu, ma
1033 ; CHECK-NEXT:    vslideup.vx v11, v12, a0
1034 ; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1035 ; CHECK-NEXT:    vfredmin.vs v8, v8, v8
1036 ; CHECK-NEXT:    vfmv.f.s fa0, v8
1037 ; CHECK-NEXT:    ret
1038   %red = call half @llvm.vector.reduce.fmin.nxv10f16(<vscale x 10 x half> %v)
1039   ret half %red
1042 declare half @llvm.vector.reduce.fmax.nxv12f16(<vscale x 12 x half>)
1044 define half @vreduce_fmax_nxv12f16(<vscale x 12 x half> %v) {
1045 ; CHECK-LABEL: vreduce_fmax_nxv12f16:
1046 ; CHECK:       # %bb.0:
1047 ; CHECK-NEXT:    li a0, -512
1048 ; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
1049 ; CHECK-NEXT:    vmv.v.x v11, a0
1050 ; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
1051 ; CHECK-NEXT:    vfredmax.vs v8, v8, v8
1052 ; CHECK-NEXT:    vfmv.f.s fa0, v8
1053 ; CHECK-NEXT:    ret
1054   %red = call half @llvm.vector.reduce.fmax.nxv12f16(<vscale x 12 x half> %v)
1055   ret half %red