Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vreductions-mask.ll
blobfcd7482dffe2ec96c333e449245294bfaa6c23b8
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+m,+v -verify-machineinstrs < %s | FileCheck %s
3 ; RUN: llc -mtriple=riscv64 -mattr=+m,+v -verify-machineinstrs < %s | FileCheck %s
5 declare i1 @llvm.vector.reduce.or.nxv1i1(<vscale x 1 x i1>)
7 define zeroext i1 @vreduce_or_nxv1i1(<vscale x 1 x i1> %v) {
8 ; CHECK-LABEL: vreduce_or_nxv1i1:
9 ; CHECK:       # %bb.0:
10 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
11 ; CHECK-NEXT:    vcpop.m a0, v0
12 ; CHECK-NEXT:    snez a0, a0
13 ; CHECK-NEXT:    ret
14   %red = call i1 @llvm.vector.reduce.or.nxv1i1(<vscale x 1 x i1> %v)
15   ret i1 %red
18 declare i1 @llvm.vector.reduce.xor.nxv1i1(<vscale x 1 x i1>)
20 define zeroext i1 @vreduce_xor_nxv1i1(<vscale x 1 x i1> %v) {
21 ; CHECK-LABEL: vreduce_xor_nxv1i1:
22 ; CHECK:       # %bb.0:
23 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
24 ; CHECK-NEXT:    vcpop.m a0, v0
25 ; CHECK-NEXT:    andi a0, a0, 1
26 ; CHECK-NEXT:    ret
27   %red = call i1 @llvm.vector.reduce.xor.nxv1i1(<vscale x 1 x i1> %v)
28   ret i1 %red
31 declare i1 @llvm.vector.reduce.and.nxv1i1(<vscale x 1 x i1>)
33 define zeroext i1 @vreduce_and_nxv1i1(<vscale x 1 x i1> %v) {
34 ; CHECK-LABEL: vreduce_and_nxv1i1:
35 ; CHECK:       # %bb.0:
36 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
37 ; CHECK-NEXT:    vmnot.m v8, v0
38 ; CHECK-NEXT:    vcpop.m a0, v8
39 ; CHECK-NEXT:    seqz a0, a0
40 ; CHECK-NEXT:    ret
41   %red = call i1 @llvm.vector.reduce.and.nxv1i1(<vscale x 1 x i1> %v)
42   ret i1 %red
45 declare i1 @llvm.vector.reduce.umax.nxv1i1(<vscale x 1 x i1>)
47 define zeroext i1 @vreduce_umax_nxv1i1(<vscale x 1 x i1> %v) {
48 ; CHECK-LABEL: vreduce_umax_nxv1i1:
49 ; CHECK:       # %bb.0:
50 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
51 ; CHECK-NEXT:    vcpop.m a0, v0
52 ; CHECK-NEXT:    snez a0, a0
53 ; CHECK-NEXT:    ret
54   %red = call i1 @llvm.vector.reduce.umax.nxv1i1(<vscale x 1 x i1> %v)
55   ret i1 %red
58 declare i1 @llvm.vector.reduce.smax.nxv1i1(<vscale x 1 x i1>)
60 define zeroext i1 @vreduce_smax_nxv1i1(<vscale x 1 x i1> %v) {
61 ; CHECK-LABEL: vreduce_smax_nxv1i1:
62 ; CHECK:       # %bb.0:
63 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
64 ; CHECK-NEXT:    vmnot.m v8, v0
65 ; CHECK-NEXT:    vcpop.m a0, v8
66 ; CHECK-NEXT:    seqz a0, a0
67 ; CHECK-NEXT:    ret
68   %red = call i1 @llvm.vector.reduce.smax.nxv1i1(<vscale x 1 x i1> %v)
69   ret i1 %red
72 declare i1 @llvm.vector.reduce.umin.nxv1i1(<vscale x 1 x i1>)
74 define zeroext i1 @vreduce_umin_nxv1i1(<vscale x 1 x i1> %v) {
75 ; CHECK-LABEL: vreduce_umin_nxv1i1:
76 ; CHECK:       # %bb.0:
77 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
78 ; CHECK-NEXT:    vmnot.m v8, v0
79 ; CHECK-NEXT:    vcpop.m a0, v8
80 ; CHECK-NEXT:    seqz a0, a0
81 ; CHECK-NEXT:    ret
82   %red = call i1 @llvm.vector.reduce.umin.nxv1i1(<vscale x 1 x i1> %v)
83   ret i1 %red
86 declare i1 @llvm.vector.reduce.smin.nxv1i1(<vscale x 1 x i1>)
88 define zeroext i1 @vreduce_smin_nxv1i1(<vscale x 1 x i1> %v) {
89 ; CHECK-LABEL: vreduce_smin_nxv1i1:
90 ; CHECK:       # %bb.0:
91 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
92 ; CHECK-NEXT:    vcpop.m a0, v0
93 ; CHECK-NEXT:    snez a0, a0
94 ; CHECK-NEXT:    ret
95   %red = call i1 @llvm.vector.reduce.smin.nxv1i1(<vscale x 1 x i1> %v)
96   ret i1 %red
99 declare i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1>)
101 define zeroext i1 @vreduce_or_nxv2i1(<vscale x 2 x i1> %v) {
102 ; CHECK-LABEL: vreduce_or_nxv2i1:
103 ; CHECK:       # %bb.0:
104 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
105 ; CHECK-NEXT:    vcpop.m a0, v0
106 ; CHECK-NEXT:    snez a0, a0
107 ; CHECK-NEXT:    ret
108   %red = call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> %v)
109   ret i1 %red
112 declare i1 @llvm.vector.reduce.xor.nxv2i1(<vscale x 2 x i1>)
114 define zeroext i1 @vreduce_xor_nxv2i1(<vscale x 2 x i1> %v) {
115 ; CHECK-LABEL: vreduce_xor_nxv2i1:
116 ; CHECK:       # %bb.0:
117 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
118 ; CHECK-NEXT:    vcpop.m a0, v0
119 ; CHECK-NEXT:    andi a0, a0, 1
120 ; CHECK-NEXT:    ret
121   %red = call i1 @llvm.vector.reduce.xor.nxv2i1(<vscale x 2 x i1> %v)
122   ret i1 %red
125 declare i1 @llvm.vector.reduce.and.nxv2i1(<vscale x 2 x i1>)
127 define zeroext i1 @vreduce_and_nxv2i1(<vscale x 2 x i1> %v) {
128 ; CHECK-LABEL: vreduce_and_nxv2i1:
129 ; CHECK:       # %bb.0:
130 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
131 ; CHECK-NEXT:    vmnot.m v8, v0
132 ; CHECK-NEXT:    vcpop.m a0, v8
133 ; CHECK-NEXT:    seqz a0, a0
134 ; CHECK-NEXT:    ret
135   %red = call i1 @llvm.vector.reduce.and.nxv2i1(<vscale x 2 x i1> %v)
136   ret i1 %red
139 declare i1 @llvm.vector.reduce.umax.nxv2i1(<vscale x 2 x i1>)
141 define zeroext i1 @vreduce_umax_nxv2i1(<vscale x 2 x i1> %v) {
142 ; CHECK-LABEL: vreduce_umax_nxv2i1:
143 ; CHECK:       # %bb.0:
144 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
145 ; CHECK-NEXT:    vcpop.m a0, v0
146 ; CHECK-NEXT:    snez a0, a0
147 ; CHECK-NEXT:    ret
148   %red = call i1 @llvm.vector.reduce.umax.nxv2i1(<vscale x 2 x i1> %v)
149   ret i1 %red
152 declare i1 @llvm.vector.reduce.smax.nxv2i1(<vscale x 2 x i1>)
154 define zeroext i1 @vreduce_smax_nxv2i1(<vscale x 2 x i1> %v) {
155 ; CHECK-LABEL: vreduce_smax_nxv2i1:
156 ; CHECK:       # %bb.0:
157 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
158 ; CHECK-NEXT:    vmnot.m v8, v0
159 ; CHECK-NEXT:    vcpop.m a0, v8
160 ; CHECK-NEXT:    seqz a0, a0
161 ; CHECK-NEXT:    ret
162   %red = call i1 @llvm.vector.reduce.smax.nxv2i1(<vscale x 2 x i1> %v)
163   ret i1 %red
166 declare i1 @llvm.vector.reduce.umin.nxv2i1(<vscale x 2 x i1>)
168 define zeroext i1 @vreduce_umin_nxv2i1(<vscale x 2 x i1> %v) {
169 ; CHECK-LABEL: vreduce_umin_nxv2i1:
170 ; CHECK:       # %bb.0:
171 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
172 ; CHECK-NEXT:    vmnot.m v8, v0
173 ; CHECK-NEXT:    vcpop.m a0, v8
174 ; CHECK-NEXT:    seqz a0, a0
175 ; CHECK-NEXT:    ret
176   %red = call i1 @llvm.vector.reduce.umin.nxv2i1(<vscale x 2 x i1> %v)
177   ret i1 %red
180 declare i1 @llvm.vector.reduce.smin.nxv2i1(<vscale x 2 x i1>)
182 define zeroext i1 @vreduce_smin_nxv2i1(<vscale x 2 x i1> %v) {
183 ; CHECK-LABEL: vreduce_smin_nxv2i1:
184 ; CHECK:       # %bb.0:
185 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
186 ; CHECK-NEXT:    vcpop.m a0, v0
187 ; CHECK-NEXT:    snez a0, a0
188 ; CHECK-NEXT:    ret
189   %red = call i1 @llvm.vector.reduce.smin.nxv2i1(<vscale x 2 x i1> %v)
190   ret i1 %red
193 declare i1 @llvm.vector.reduce.or.nxv4i1(<vscale x 4 x i1>)
195 define zeroext i1 @vreduce_or_nxv4i1(<vscale x 4 x i1> %v) {
196 ; CHECK-LABEL: vreduce_or_nxv4i1:
197 ; CHECK:       # %bb.0:
198 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
199 ; CHECK-NEXT:    vcpop.m a0, v0
200 ; CHECK-NEXT:    snez a0, a0
201 ; CHECK-NEXT:    ret
202   %red = call i1 @llvm.vector.reduce.or.nxv4i1(<vscale x 4 x i1> %v)
203   ret i1 %red
206 declare i1 @llvm.vector.reduce.xor.nxv4i1(<vscale x 4 x i1>)
208 define zeroext i1 @vreduce_xor_nxv4i1(<vscale x 4 x i1> %v) {
209 ; CHECK-LABEL: vreduce_xor_nxv4i1:
210 ; CHECK:       # %bb.0:
211 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
212 ; CHECK-NEXT:    vcpop.m a0, v0
213 ; CHECK-NEXT:    andi a0, a0, 1
214 ; CHECK-NEXT:    ret
215   %red = call i1 @llvm.vector.reduce.xor.nxv4i1(<vscale x 4 x i1> %v)
216   ret i1 %red
219 declare i1 @llvm.vector.reduce.and.nxv4i1(<vscale x 4 x i1>)
221 define zeroext i1 @vreduce_and_nxv4i1(<vscale x 4 x i1> %v) {
222 ; CHECK-LABEL: vreduce_and_nxv4i1:
223 ; CHECK:       # %bb.0:
224 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
225 ; CHECK-NEXT:    vmnot.m v8, v0
226 ; CHECK-NEXT:    vcpop.m a0, v8
227 ; CHECK-NEXT:    seqz a0, a0
228 ; CHECK-NEXT:    ret
229   %red = call i1 @llvm.vector.reduce.and.nxv4i1(<vscale x 4 x i1> %v)
230   ret i1 %red
233 declare i1 @llvm.vector.reduce.umax.nxv4i1(<vscale x 4 x i1>)
235 define zeroext i1 @vreduce_umax_nxv4i1(<vscale x 4 x i1> %v) {
236 ; CHECK-LABEL: vreduce_umax_nxv4i1:
237 ; CHECK:       # %bb.0:
238 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
239 ; CHECK-NEXT:    vcpop.m a0, v0
240 ; CHECK-NEXT:    snez a0, a0
241 ; CHECK-NEXT:    ret
242   %red = call i1 @llvm.vector.reduce.umax.nxv4i1(<vscale x 4 x i1> %v)
243   ret i1 %red
246 declare i1 @llvm.vector.reduce.smax.nxv4i1(<vscale x 4 x i1>)
248 define zeroext i1 @vreduce_smax_nxv4i1(<vscale x 4 x i1> %v) {
249 ; CHECK-LABEL: vreduce_smax_nxv4i1:
250 ; CHECK:       # %bb.0:
251 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
252 ; CHECK-NEXT:    vmnot.m v8, v0
253 ; CHECK-NEXT:    vcpop.m a0, v8
254 ; CHECK-NEXT:    seqz a0, a0
255 ; CHECK-NEXT:    ret
256   %red = call i1 @llvm.vector.reduce.smax.nxv4i1(<vscale x 4 x i1> %v)
257   ret i1 %red
260 declare i1 @llvm.vector.reduce.umin.nxv4i1(<vscale x 4 x i1>)
262 define zeroext i1 @vreduce_umin_nxv4i1(<vscale x 4 x i1> %v) {
263 ; CHECK-LABEL: vreduce_umin_nxv4i1:
264 ; CHECK:       # %bb.0:
265 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
266 ; CHECK-NEXT:    vmnot.m v8, v0
267 ; CHECK-NEXT:    vcpop.m a0, v8
268 ; CHECK-NEXT:    seqz a0, a0
269 ; CHECK-NEXT:    ret
270   %red = call i1 @llvm.vector.reduce.umin.nxv4i1(<vscale x 4 x i1> %v)
271   ret i1 %red
274 declare i1 @llvm.vector.reduce.smin.nxv4i1(<vscale x 4 x i1>)
276 define zeroext i1 @vreduce_smin_nxv4i1(<vscale x 4 x i1> %v) {
277 ; CHECK-LABEL: vreduce_smin_nxv4i1:
278 ; CHECK:       # %bb.0:
279 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
280 ; CHECK-NEXT:    vcpop.m a0, v0
281 ; CHECK-NEXT:    snez a0, a0
282 ; CHECK-NEXT:    ret
283   %red = call i1 @llvm.vector.reduce.smin.nxv4i1(<vscale x 4 x i1> %v)
284   ret i1 %red
287 declare i1 @llvm.vector.reduce.or.nxv8i1(<vscale x 8 x i1>)
289 define zeroext i1 @vreduce_or_nxv8i1(<vscale x 8 x i1> %v) {
290 ; CHECK-LABEL: vreduce_or_nxv8i1:
291 ; CHECK:       # %bb.0:
292 ; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
293 ; CHECK-NEXT:    vcpop.m a0, v0
294 ; CHECK-NEXT:    snez a0, a0
295 ; CHECK-NEXT:    ret
296   %red = call i1 @llvm.vector.reduce.or.nxv8i1(<vscale x 8 x i1> %v)
297   ret i1 %red
300 declare i1 @llvm.vector.reduce.xor.nxv8i1(<vscale x 8 x i1>)
302 define zeroext i1 @vreduce_xor_nxv8i1(<vscale x 8 x i1> %v) {
303 ; CHECK-LABEL: vreduce_xor_nxv8i1:
304 ; CHECK:       # %bb.0:
305 ; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
306 ; CHECK-NEXT:    vcpop.m a0, v0
307 ; CHECK-NEXT:    andi a0, a0, 1
308 ; CHECK-NEXT:    ret
309   %red = call i1 @llvm.vector.reduce.xor.nxv8i1(<vscale x 8 x i1> %v)
310   ret i1 %red
313 declare i1 @llvm.vector.reduce.and.nxv8i1(<vscale x 8 x i1>)
315 define zeroext i1 @vreduce_and_nxv8i1(<vscale x 8 x i1> %v) {
316 ; CHECK-LABEL: vreduce_and_nxv8i1:
317 ; CHECK:       # %bb.0:
318 ; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
319 ; CHECK-NEXT:    vmnot.m v8, v0
320 ; CHECK-NEXT:    vcpop.m a0, v8
321 ; CHECK-NEXT:    seqz a0, a0
322 ; CHECK-NEXT:    ret
323   %red = call i1 @llvm.vector.reduce.and.nxv8i1(<vscale x 8 x i1> %v)
324   ret i1 %red
327 declare i1 @llvm.vector.reduce.umax.nxv8i1(<vscale x 8 x i1>)
329 define zeroext i1 @vreduce_umax_nxv8i1(<vscale x 8 x i1> %v) {
330 ; CHECK-LABEL: vreduce_umax_nxv8i1:
331 ; CHECK:       # %bb.0:
332 ; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
333 ; CHECK-NEXT:    vcpop.m a0, v0
334 ; CHECK-NEXT:    snez a0, a0
335 ; CHECK-NEXT:    ret
336   %red = call i1 @llvm.vector.reduce.umax.nxv8i1(<vscale x 8 x i1> %v)
337   ret i1 %red
340 declare i1 @llvm.vector.reduce.smax.nxv8i1(<vscale x 8 x i1>)
342 define zeroext i1 @vreduce_smax_nxv8i1(<vscale x 8 x i1> %v) {
343 ; CHECK-LABEL: vreduce_smax_nxv8i1:
344 ; CHECK:       # %bb.0:
345 ; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
346 ; CHECK-NEXT:    vmnot.m v8, v0
347 ; CHECK-NEXT:    vcpop.m a0, v8
348 ; CHECK-NEXT:    seqz a0, a0
349 ; CHECK-NEXT:    ret
350   %red = call i1 @llvm.vector.reduce.smax.nxv8i1(<vscale x 8 x i1> %v)
351   ret i1 %red
354 declare i1 @llvm.vector.reduce.umin.nxv8i1(<vscale x 8 x i1>)
356 define zeroext i1 @vreduce_umin_nxv8i1(<vscale x 8 x i1> %v) {
357 ; CHECK-LABEL: vreduce_umin_nxv8i1:
358 ; CHECK:       # %bb.0:
359 ; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
360 ; CHECK-NEXT:    vmnot.m v8, v0
361 ; CHECK-NEXT:    vcpop.m a0, v8
362 ; CHECK-NEXT:    seqz a0, a0
363 ; CHECK-NEXT:    ret
364   %red = call i1 @llvm.vector.reduce.umin.nxv8i1(<vscale x 8 x i1> %v)
365   ret i1 %red
368 declare i1 @llvm.vector.reduce.smin.nxv8i1(<vscale x 8 x i1>)
370 define zeroext i1 @vreduce_smin_nxv8i1(<vscale x 8 x i1> %v) {
371 ; CHECK-LABEL: vreduce_smin_nxv8i1:
372 ; CHECK:       # %bb.0:
373 ; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
374 ; CHECK-NEXT:    vcpop.m a0, v0
375 ; CHECK-NEXT:    snez a0, a0
376 ; CHECK-NEXT:    ret
377   %red = call i1 @llvm.vector.reduce.smin.nxv8i1(<vscale x 8 x i1> %v)
378   ret i1 %red
381 declare i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1>)
383 define zeroext i1 @vreduce_or_nxv16i1(<vscale x 16 x i1> %v) {
384 ; CHECK-LABEL: vreduce_or_nxv16i1:
385 ; CHECK:       # %bb.0:
386 ; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
387 ; CHECK-NEXT:    vcpop.m a0, v0
388 ; CHECK-NEXT:    snez a0, a0
389 ; CHECK-NEXT:    ret
390   %red = call i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1> %v)
391   ret i1 %red
394 declare i1 @llvm.vector.reduce.xor.nxv16i1(<vscale x 16 x i1>)
396 define zeroext i1 @vreduce_xor_nxv16i1(<vscale x 16 x i1> %v) {
397 ; CHECK-LABEL: vreduce_xor_nxv16i1:
398 ; CHECK:       # %bb.0:
399 ; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
400 ; CHECK-NEXT:    vcpop.m a0, v0
401 ; CHECK-NEXT:    andi a0, a0, 1
402 ; CHECK-NEXT:    ret
403   %red = call i1 @llvm.vector.reduce.xor.nxv16i1(<vscale x 16 x i1> %v)
404   ret i1 %red
407 declare i1 @llvm.vector.reduce.and.nxv16i1(<vscale x 16 x i1>)
409 define zeroext i1 @vreduce_and_nxv16i1(<vscale x 16 x i1> %v) {
410 ; CHECK-LABEL: vreduce_and_nxv16i1:
411 ; CHECK:       # %bb.0:
412 ; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
413 ; CHECK-NEXT:    vmnot.m v8, v0
414 ; CHECK-NEXT:    vcpop.m a0, v8
415 ; CHECK-NEXT:    seqz a0, a0
416 ; CHECK-NEXT:    ret
417   %red = call i1 @llvm.vector.reduce.and.nxv16i1(<vscale x 16 x i1> %v)
418   ret i1 %red
421 declare i1 @llvm.vector.reduce.umax.nxv16i1(<vscale x 16 x i1>)
423 define zeroext i1 @vreduce_umax_nxv16i1(<vscale x 16 x i1> %v) {
424 ; CHECK-LABEL: vreduce_umax_nxv16i1:
425 ; CHECK:       # %bb.0:
426 ; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
427 ; CHECK-NEXT:    vcpop.m a0, v0
428 ; CHECK-NEXT:    snez a0, a0
429 ; CHECK-NEXT:    ret
430   %red = call i1 @llvm.vector.reduce.umax.nxv16i1(<vscale x 16 x i1> %v)
431   ret i1 %red
434 declare i1 @llvm.vector.reduce.smax.nxv16i1(<vscale x 16 x i1>)
436 define zeroext i1 @vreduce_smax_nxv16i1(<vscale x 16 x i1> %v) {
437 ; CHECK-LABEL: vreduce_smax_nxv16i1:
438 ; CHECK:       # %bb.0:
439 ; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
440 ; CHECK-NEXT:    vmnot.m v8, v0
441 ; CHECK-NEXT:    vcpop.m a0, v8
442 ; CHECK-NEXT:    seqz a0, a0
443 ; CHECK-NEXT:    ret
444   %red = call i1 @llvm.vector.reduce.smax.nxv16i1(<vscale x 16 x i1> %v)
445   ret i1 %red
448 declare i1 @llvm.vector.reduce.umin.nxv16i1(<vscale x 16 x i1>)
450 define zeroext i1 @vreduce_umin_nxv16i1(<vscale x 16 x i1> %v) {
451 ; CHECK-LABEL: vreduce_umin_nxv16i1:
452 ; CHECK:       # %bb.0:
453 ; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
454 ; CHECK-NEXT:    vmnot.m v8, v0
455 ; CHECK-NEXT:    vcpop.m a0, v8
456 ; CHECK-NEXT:    seqz a0, a0
457 ; CHECK-NEXT:    ret
458   %red = call i1 @llvm.vector.reduce.umin.nxv16i1(<vscale x 16 x i1> %v)
459   ret i1 %red
462 declare i1 @llvm.vector.reduce.smin.nxv16i1(<vscale x 16 x i1>)
464 define zeroext i1 @vreduce_smin_nxv16i1(<vscale x 16 x i1> %v) {
465 ; CHECK-LABEL: vreduce_smin_nxv16i1:
466 ; CHECK:       # %bb.0:
467 ; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
468 ; CHECK-NEXT:    vcpop.m a0, v0
469 ; CHECK-NEXT:    snez a0, a0
470 ; CHECK-NEXT:    ret
471   %red = call i1 @llvm.vector.reduce.smin.nxv16i1(<vscale x 16 x i1> %v)
472   ret i1 %red
475 declare i1 @llvm.vector.reduce.or.nxv32i1(<vscale x 32 x i1>)
477 define zeroext i1 @vreduce_or_nxv32i1(<vscale x 32 x i1> %v) {
478 ; CHECK-LABEL: vreduce_or_nxv32i1:
479 ; CHECK:       # %bb.0:
480 ; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
481 ; CHECK-NEXT:    vcpop.m a0, v0
482 ; CHECK-NEXT:    snez a0, a0
483 ; CHECK-NEXT:    ret
484   %red = call i1 @llvm.vector.reduce.or.nxv32i1(<vscale x 32 x i1> %v)
485   ret i1 %red
488 declare i1 @llvm.vector.reduce.xor.nxv32i1(<vscale x 32 x i1>)
490 define zeroext i1 @vreduce_xor_nxv32i1(<vscale x 32 x i1> %v) {
491 ; CHECK-LABEL: vreduce_xor_nxv32i1:
492 ; CHECK:       # %bb.0:
493 ; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
494 ; CHECK-NEXT:    vcpop.m a0, v0
495 ; CHECK-NEXT:    andi a0, a0, 1
496 ; CHECK-NEXT:    ret
497   %red = call i1 @llvm.vector.reduce.xor.nxv32i1(<vscale x 32 x i1> %v)
498   ret i1 %red
501 declare i1 @llvm.vector.reduce.and.nxv32i1(<vscale x 32 x i1>)
503 define zeroext i1 @vreduce_and_nxv32i1(<vscale x 32 x i1> %v) {
504 ; CHECK-LABEL: vreduce_and_nxv32i1:
505 ; CHECK:       # %bb.0:
506 ; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
507 ; CHECK-NEXT:    vmnot.m v8, v0
508 ; CHECK-NEXT:    vcpop.m a0, v8
509 ; CHECK-NEXT:    seqz a0, a0
510 ; CHECK-NEXT:    ret
511   %red = call i1 @llvm.vector.reduce.and.nxv32i1(<vscale x 32 x i1> %v)
512   ret i1 %red
515 declare i1 @llvm.vector.reduce.umax.nxv32i1(<vscale x 32 x i1>)
517 define zeroext i1 @vreduce_umax_nxv32i1(<vscale x 32 x i1> %v) {
518 ; CHECK-LABEL: vreduce_umax_nxv32i1:
519 ; CHECK:       # %bb.0:
520 ; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
521 ; CHECK-NEXT:    vcpop.m a0, v0
522 ; CHECK-NEXT:    snez a0, a0
523 ; CHECK-NEXT:    ret
524   %red = call i1 @llvm.vector.reduce.umax.nxv32i1(<vscale x 32 x i1> %v)
525   ret i1 %red
528 declare i1 @llvm.vector.reduce.smax.nxv32i1(<vscale x 32 x i1>)
530 define zeroext i1 @vreduce_smax_nxv32i1(<vscale x 32 x i1> %v) {
531 ; CHECK-LABEL: vreduce_smax_nxv32i1:
532 ; CHECK:       # %bb.0:
533 ; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
534 ; CHECK-NEXT:    vmnot.m v8, v0
535 ; CHECK-NEXT:    vcpop.m a0, v8
536 ; CHECK-NEXT:    seqz a0, a0
537 ; CHECK-NEXT:    ret
538   %red = call i1 @llvm.vector.reduce.smax.nxv32i1(<vscale x 32 x i1> %v)
539   ret i1 %red
542 declare i1 @llvm.vector.reduce.umin.nxv32i1(<vscale x 32 x i1>)
544 define zeroext i1 @vreduce_umin_nxv32i1(<vscale x 32 x i1> %v) {
545 ; CHECK-LABEL: vreduce_umin_nxv32i1:
546 ; CHECK:       # %bb.0:
547 ; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
548 ; CHECK-NEXT:    vmnot.m v8, v0
549 ; CHECK-NEXT:    vcpop.m a0, v8
550 ; CHECK-NEXT:    seqz a0, a0
551 ; CHECK-NEXT:    ret
552   %red = call i1 @llvm.vector.reduce.umin.nxv32i1(<vscale x 32 x i1> %v)
553   ret i1 %red
556 declare i1 @llvm.vector.reduce.smin.nxv32i1(<vscale x 32 x i1>)
558 define zeroext i1 @vreduce_smin_nxv32i1(<vscale x 32 x i1> %v) {
559 ; CHECK-LABEL: vreduce_smin_nxv32i1:
560 ; CHECK:       # %bb.0:
561 ; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
562 ; CHECK-NEXT:    vcpop.m a0, v0
563 ; CHECK-NEXT:    snez a0, a0
564 ; CHECK-NEXT:    ret
565   %red = call i1 @llvm.vector.reduce.smin.nxv32i1(<vscale x 32 x i1> %v)
566   ret i1 %red
569 declare i1 @llvm.vector.reduce.or.nxv64i1(<vscale x 64 x i1>)
571 define zeroext i1 @vreduce_or_nxv64i1(<vscale x 64 x i1> %v) {
572 ; CHECK-LABEL: vreduce_or_nxv64i1:
573 ; CHECK:       # %bb.0:
574 ; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
575 ; CHECK-NEXT:    vcpop.m a0, v0
576 ; CHECK-NEXT:    snez a0, a0
577 ; CHECK-NEXT:    ret
578   %red = call i1 @llvm.vector.reduce.or.nxv64i1(<vscale x 64 x i1> %v)
579   ret i1 %red
582 declare i1 @llvm.vector.reduce.xor.nxv64i1(<vscale x 64 x i1>)
584 define zeroext i1 @vreduce_xor_nxv64i1(<vscale x 64 x i1> %v) {
585 ; CHECK-LABEL: vreduce_xor_nxv64i1:
586 ; CHECK:       # %bb.0:
587 ; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
588 ; CHECK-NEXT:    vcpop.m a0, v0
589 ; CHECK-NEXT:    andi a0, a0, 1
590 ; CHECK-NEXT:    ret
591   %red = call i1 @llvm.vector.reduce.xor.nxv64i1(<vscale x 64 x i1> %v)
592   ret i1 %red
595 declare i1 @llvm.vector.reduce.and.nxv64i1(<vscale x 64 x i1>)
597 define zeroext i1 @vreduce_and_nxv64i1(<vscale x 64 x i1> %v) {
598 ; CHECK-LABEL: vreduce_and_nxv64i1:
599 ; CHECK:       # %bb.0:
600 ; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
601 ; CHECK-NEXT:    vmnot.m v8, v0
602 ; CHECK-NEXT:    vcpop.m a0, v8
603 ; CHECK-NEXT:    seqz a0, a0
604 ; CHECK-NEXT:    ret
605   %red = call i1 @llvm.vector.reduce.and.nxv64i1(<vscale x 64 x i1> %v)
606   ret i1 %red
609 declare i1 @llvm.vector.reduce.umax.nxv64i1(<vscale x 64 x i1>)
611 define zeroext i1 @vreduce_umax_nxv64i1(<vscale x 64 x i1> %v) {
612 ; CHECK-LABEL: vreduce_umax_nxv64i1:
613 ; CHECK:       # %bb.0:
614 ; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
615 ; CHECK-NEXT:    vcpop.m a0, v0
616 ; CHECK-NEXT:    snez a0, a0
617 ; CHECK-NEXT:    ret
618   %red = call i1 @llvm.vector.reduce.umax.nxv64i1(<vscale x 64 x i1> %v)
619   ret i1 %red
622 declare i1 @llvm.vector.reduce.smax.nxv64i1(<vscale x 64 x i1>)
624 define zeroext i1 @vreduce_smax_nxv64i1(<vscale x 64 x i1> %v) {
625 ; CHECK-LABEL: vreduce_smax_nxv64i1:
626 ; CHECK:       # %bb.0:
627 ; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
628 ; CHECK-NEXT:    vmnot.m v8, v0
629 ; CHECK-NEXT:    vcpop.m a0, v8
630 ; CHECK-NEXT:    seqz a0, a0
631 ; CHECK-NEXT:    ret
632   %red = call i1 @llvm.vector.reduce.smax.nxv64i1(<vscale x 64 x i1> %v)
633   ret i1 %red
636 declare i1 @llvm.vector.reduce.umin.nxv64i1(<vscale x 64 x i1>)
638 define zeroext i1 @vreduce_umin_nxv64i1(<vscale x 64 x i1> %v) {
639 ; CHECK-LABEL: vreduce_umin_nxv64i1:
640 ; CHECK:       # %bb.0:
641 ; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
642 ; CHECK-NEXT:    vmnot.m v8, v0
643 ; CHECK-NEXT:    vcpop.m a0, v8
644 ; CHECK-NEXT:    seqz a0, a0
645 ; CHECK-NEXT:    ret
646   %red = call i1 @llvm.vector.reduce.umin.nxv64i1(<vscale x 64 x i1> %v)
647   ret i1 %red
650 declare i1 @llvm.vector.reduce.smin.nxv64i1(<vscale x 64 x i1>)
652 define zeroext i1 @vreduce_smin_nxv64i1(<vscale x 64 x i1> %v) {
653 ; CHECK-LABEL: vreduce_smin_nxv64i1:
654 ; CHECK:       # %bb.0:
655 ; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
656 ; CHECK-NEXT:    vcpop.m a0, v0
657 ; CHECK-NEXT:    snez a0, a0
658 ; CHECK-NEXT:    ret
659   %red = call i1 @llvm.vector.reduce.smin.nxv64i1(<vscale x 64 x i1> %v)
660   ret i1 %red
663 declare i1 @llvm.vector.reduce.add.nxv1i1(<vscale x 1 x i1>)
665 define zeroext i1 @vreduce_add_nxv1i1(<vscale x 1 x i1> %v) {
666 ; CHECK-LABEL: vreduce_add_nxv1i1:
667 ; CHECK:       # %bb.0:
668 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
669 ; CHECK-NEXT:    vcpop.m a0, v0
670 ; CHECK-NEXT:    andi a0, a0, 1
671 ; CHECK-NEXT:    ret
672   %red = call i1 @llvm.vector.reduce.add.nxv1i1(<vscale x 1 x i1> %v)
673   ret i1 %red
676 declare i1 @llvm.vector.reduce.add.nxv2i1(<vscale x 2 x i1>)
678 define zeroext i1 @vreduce_add_nxv2i1(<vscale x 2 x i1> %v) {
679 ; CHECK-LABEL: vreduce_add_nxv2i1:
680 ; CHECK:       # %bb.0:
681 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
682 ; CHECK-NEXT:    vcpop.m a0, v0
683 ; CHECK-NEXT:    andi a0, a0, 1
684 ; CHECK-NEXT:    ret
685   %red = call i1 @llvm.vector.reduce.add.nxv2i1(<vscale x 2 x i1> %v)
686   ret i1 %red
689 declare i1 @llvm.vector.reduce.add.nxv4i1(<vscale x 4 x i1>)
691 define zeroext i1 @vreduce_add_nxv4i1(<vscale x 4 x i1> %v) {
692 ; CHECK-LABEL: vreduce_add_nxv4i1:
693 ; CHECK:       # %bb.0:
694 ; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
695 ; CHECK-NEXT:    vcpop.m a0, v0
696 ; CHECK-NEXT:    andi a0, a0, 1
697 ; CHECK-NEXT:    ret
698   %red = call i1 @llvm.vector.reduce.add.nxv4i1(<vscale x 4 x i1> %v)
699   ret i1 %red
702 declare i1 @llvm.vector.reduce.add.nxv8i1(<vscale x 8 x i1>)
704 define zeroext i1 @vreduce_add_nxv8i1(<vscale x 8 x i1> %v) {
705 ; CHECK-LABEL: vreduce_add_nxv8i1:
706 ; CHECK:       # %bb.0:
707 ; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
708 ; CHECK-NEXT:    vcpop.m a0, v0
709 ; CHECK-NEXT:    andi a0, a0, 1
710 ; CHECK-NEXT:    ret
711   %red = call i1 @llvm.vector.reduce.add.nxv8i1(<vscale x 8 x i1> %v)
712   ret i1 %red
715 declare i1 @llvm.vector.reduce.add.nxv16i1(<vscale x 16 x i1>)
717 define zeroext i1 @vreduce_add_nxv16i1(<vscale x 16 x i1> %v) {
718 ; CHECK-LABEL: vreduce_add_nxv16i1:
719 ; CHECK:       # %bb.0:
720 ; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
721 ; CHECK-NEXT:    vcpop.m a0, v0
722 ; CHECK-NEXT:    andi a0, a0, 1
723 ; CHECK-NEXT:    ret
724   %red = call i1 @llvm.vector.reduce.add.nxv16i1(<vscale x 16 x i1> %v)
725   ret i1 %red
728 declare i1 @llvm.vector.reduce.add.nxv32i1(<vscale x 32 x i1>)
730 define zeroext i1 @vreduce_add_nxv32i1(<vscale x 32 x i1> %v) {
731 ; CHECK-LABEL: vreduce_add_nxv32i1:
732 ; CHECK:       # %bb.0:
733 ; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
734 ; CHECK-NEXT:    vcpop.m a0, v0
735 ; CHECK-NEXT:    andi a0, a0, 1
736 ; CHECK-NEXT:    ret
737   %red = call i1 @llvm.vector.reduce.add.nxv32i1(<vscale x 32 x i1> %v)
738   ret i1 %red
741 declare i1 @llvm.vector.reduce.add.nxv64i1(<vscale x 64 x i1>)
743 define zeroext i1 @vreduce_add_nxv64i1(<vscale x 64 x i1> %v) {
744 ; CHECK-LABEL: vreduce_add_nxv64i1:
745 ; CHECK:       # %bb.0:
746 ; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
747 ; CHECK-NEXT:    vcpop.m a0, v0
748 ; CHECK-NEXT:    andi a0, a0, 1
749 ; CHECK-NEXT:    ret
750   %red = call i1 @llvm.vector.reduce.add.nxv64i1(<vscale x 64 x i1> %v)
751   ret i1 %red