[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / reduce-or.ll
blob4c30a32934964be26f4c8e10cf68e6e853c16055
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s
3 ; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -mattr=+neon -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=GISEL
6 define i1 @test_redor_v1i1(<1 x i1> %a) {
7 ; CHECK-LABEL: test_redor_v1i1:
8 ; CHECK:       // %bb.0:
9 ; CHECK-NEXT:    and w0, w0, #0x1
10 ; CHECK-NEXT:    ret
12 ; GISEL-LABEL: test_redor_v1i1:
13 ; GISEL:       // %bb.0:
14 ; GISEL-NEXT:    and w0, w0, #0x1
15 ; GISEL-NEXT:    ret
16   %or_result = call i1 @llvm.vector.reduce.or.v1i1(<1 x i1> %a)
17   ret i1 %or_result
20 define i1 @test_redor_v2i1(<2 x i1> %a) {
21 ; CHECK-LABEL: test_redor_v2i1:
22 ; CHECK:       // %bb.0:
23 ; CHECK-NEXT:    shl v0.2s, v0.2s, #31
24 ; CHECK-NEXT:    cmlt v0.2s, v0.2s, #0
25 ; CHECK-NEXT:    umaxp v0.2s, v0.2s, v0.2s
26 ; CHECK-NEXT:    fmov w8, s0
27 ; CHECK-NEXT:    and w0, w8, #0x1
28 ; CHECK-NEXT:    ret
30 ; GISEL-LABEL: test_redor_v2i1:
31 ; GISEL:       // %bb.0:
32 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
33 ; GISEL-NEXT:    mov s1, v0.s[1]
34 ; GISEL-NEXT:    fmov w8, s0
35 ; GISEL-NEXT:    fmov w9, s1
36 ; GISEL-NEXT:    orr w8, w8, w9
37 ; GISEL-NEXT:    and w0, w8, #0x1
38 ; GISEL-NEXT:    ret
39   %or_result = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %a)
40   ret i1 %or_result
43 define i1 @test_redor_v4i1(<4 x i1> %a) {
44 ; CHECK-LABEL: test_redor_v4i1:
45 ; CHECK:       // %bb.0:
46 ; CHECK-NEXT:    shl v0.4h, v0.4h, #15
47 ; CHECK-NEXT:    cmlt v0.4h, v0.4h, #0
48 ; CHECK-NEXT:    umaxv h0, v0.4h
49 ; CHECK-NEXT:    fmov w8, s0
50 ; CHECK-NEXT:    and w0, w8, #0x1
51 ; CHECK-NEXT:    ret
53 ; GISEL-LABEL: test_redor_v4i1:
54 ; GISEL:       // %bb.0:
55 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
56 ; GISEL-NEXT:    mov h1, v0.h[1]
57 ; GISEL-NEXT:    mov h2, v0.h[2]
58 ; GISEL-NEXT:    mov h3, v0.h[3]
59 ; GISEL-NEXT:    fmov w8, s0
60 ; GISEL-NEXT:    fmov w9, s1
61 ; GISEL-NEXT:    fmov w10, s2
62 ; GISEL-NEXT:    fmov w11, s3
63 ; GISEL-NEXT:    orr w8, w8, w9
64 ; GISEL-NEXT:    orr w9, w10, w11
65 ; GISEL-NEXT:    orr w8, w8, w9
66 ; GISEL-NEXT:    and w0, w8, #0x1
67 ; GISEL-NEXT:    ret
68   %or_result = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)
69   ret i1 %or_result
72 define i1 @test_redor_v8i1(<8 x i1> %a) {
73 ; CHECK-LABEL: test_redor_v8i1:
74 ; CHECK:       // %bb.0:
75 ; CHECK-NEXT:    shl v0.8b, v0.8b, #7
76 ; CHECK-NEXT:    cmlt v0.8b, v0.8b, #0
77 ; CHECK-NEXT:    umaxv b0, v0.8b
78 ; CHECK-NEXT:    fmov w8, s0
79 ; CHECK-NEXT:    and w0, w8, #0x1
80 ; CHECK-NEXT:    ret
82 ; GISEL-LABEL: test_redor_v8i1:
83 ; GISEL:       // %bb.0:
84 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
85 ; GISEL-NEXT:    mov b1, v0.b[1]
86 ; GISEL-NEXT:    mov b2, v0.b[2]
87 ; GISEL-NEXT:    mov b3, v0.b[3]
88 ; GISEL-NEXT:    mov b4, v0.b[4]
89 ; GISEL-NEXT:    mov b5, v0.b[5]
90 ; GISEL-NEXT:    mov b6, v0.b[6]
91 ; GISEL-NEXT:    mov b7, v0.b[7]
92 ; GISEL-NEXT:    fmov w8, s0
93 ; GISEL-NEXT:    fmov w9, s1
94 ; GISEL-NEXT:    fmov w10, s2
95 ; GISEL-NEXT:    fmov w11, s3
96 ; GISEL-NEXT:    fmov w12, s4
97 ; GISEL-NEXT:    fmov w13, s5
98 ; GISEL-NEXT:    fmov w14, s6
99 ; GISEL-NEXT:    orr w8, w8, w9
100 ; GISEL-NEXT:    fmov w9, s7
101 ; GISEL-NEXT:    orr w10, w10, w11
102 ; GISEL-NEXT:    orr w11, w12, w13
103 ; GISEL-NEXT:    orr w8, w8, w10
104 ; GISEL-NEXT:    orr w9, w14, w9
105 ; GISEL-NEXT:    orr w9, w11, w9
106 ; GISEL-NEXT:    orr w8, w8, w9
107 ; GISEL-NEXT:    and w0, w8, #0x1
108 ; GISEL-NEXT:    ret
109   %or_result = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)
110   ret i1 %or_result
113 define i1 @test_redor_v16i1(<16 x i1> %a) {
114 ; CHECK-LABEL: test_redor_v16i1:
115 ; CHECK:       // %bb.0:
116 ; CHECK-NEXT:    shl v0.16b, v0.16b, #7
117 ; CHECK-NEXT:    cmlt v0.16b, v0.16b, #0
118 ; CHECK-NEXT:    umaxv b0, v0.16b
119 ; CHECK-NEXT:    fmov w8, s0
120 ; CHECK-NEXT:    and w0, w8, #0x1
121 ; CHECK-NEXT:    ret
123 ; GISEL-LABEL: test_redor_v16i1:
124 ; GISEL:       // %bb.0:
125 ; GISEL-NEXT:    mov b1, v0.b[1]
126 ; GISEL-NEXT:    mov b2, v0.b[2]
127 ; GISEL-NEXT:    mov b3, v0.b[3]
128 ; GISEL-NEXT:    mov b4, v0.b[4]
129 ; GISEL-NEXT:    mov b5, v0.b[5]
130 ; GISEL-NEXT:    mov b6, v0.b[6]
131 ; GISEL-NEXT:    mov b7, v0.b[7]
132 ; GISEL-NEXT:    fmov w8, s0
133 ; GISEL-NEXT:    mov b16, v0.b[8]
134 ; GISEL-NEXT:    mov b17, v0.b[9]
135 ; GISEL-NEXT:    mov b18, v0.b[10]
136 ; GISEL-NEXT:    mov b19, v0.b[11]
137 ; GISEL-NEXT:    fmov w9, s1
138 ; GISEL-NEXT:    fmov w10, s2
139 ; GISEL-NEXT:    fmov w11, s3
140 ; GISEL-NEXT:    fmov w12, s6
141 ; GISEL-NEXT:    mov b20, v0.b[12]
142 ; GISEL-NEXT:    mov b21, v0.b[13]
143 ; GISEL-NEXT:    fmov w13, s7
144 ; GISEL-NEXT:    mov b22, v0.b[14]
145 ; GISEL-NEXT:    mov b23, v0.b[15]
146 ; GISEL-NEXT:    orr w8, w8, w9
147 ; GISEL-NEXT:    orr w9, w10, w11
148 ; GISEL-NEXT:    fmov w10, s4
149 ; GISEL-NEXT:    orr w8, w8, w9
150 ; GISEL-NEXT:    fmov w11, s5
151 ; GISEL-NEXT:    fmov w14, s18
152 ; GISEL-NEXT:    fmov w15, s19
153 ; GISEL-NEXT:    fmov w16, s22
154 ; GISEL-NEXT:    fmov w17, s23
155 ; GISEL-NEXT:    orr w10, w10, w11
156 ; GISEL-NEXT:    orr w11, w12, w13
157 ; GISEL-NEXT:    fmov w12, s16
158 ; GISEL-NEXT:    orr w9, w10, w11
159 ; GISEL-NEXT:    fmov w13, s17
160 ; GISEL-NEXT:    orr w8, w8, w9
161 ; GISEL-NEXT:    orr w12, w12, w13
162 ; GISEL-NEXT:    orr w13, w14, w15
163 ; GISEL-NEXT:    fmov w14, s20
164 ; GISEL-NEXT:    fmov w15, s21
165 ; GISEL-NEXT:    orr w10, w12, w13
166 ; GISEL-NEXT:    orr w14, w14, w15
167 ; GISEL-NEXT:    orr w15, w16, w17
168 ; GISEL-NEXT:    orr w11, w14, w15
169 ; GISEL-NEXT:    orr w9, w10, w11
170 ; GISEL-NEXT:    orr w8, w8, w9
171 ; GISEL-NEXT:    and w0, w8, #0x1
172 ; GISEL-NEXT:    ret
173   %or_result = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
174   ret i1 %or_result
177 define <16 x i1> @test_redor_ins_v16i1(<16 x i1> %a) {
178 ; CHECK-LABEL: test_redor_ins_v16i1:
179 ; CHECK:       // %bb.0:
180 ; CHECK-NEXT:    shl v0.16b, v0.16b, #7
181 ; CHECK-NEXT:    cmlt v0.16b, v0.16b, #0
182 ; CHECK-NEXT:    umaxv b0, v0.16b
183 ; CHECK-NEXT:    ret
185 ; GISEL-LABEL: test_redor_ins_v16i1:
186 ; GISEL:       // %bb.0:
187 ; GISEL-NEXT:    mov b1, v0.b[1]
188 ; GISEL-NEXT:    mov b2, v0.b[2]
189 ; GISEL-NEXT:    mov b3, v0.b[3]
190 ; GISEL-NEXT:    mov b4, v0.b[4]
191 ; GISEL-NEXT:    mov b5, v0.b[5]
192 ; GISEL-NEXT:    mov b6, v0.b[6]
193 ; GISEL-NEXT:    mov b7, v0.b[7]
194 ; GISEL-NEXT:    fmov w8, s0
195 ; GISEL-NEXT:    mov b16, v0.b[8]
196 ; GISEL-NEXT:    mov b17, v0.b[9]
197 ; GISEL-NEXT:    mov b18, v0.b[10]
198 ; GISEL-NEXT:    mov b19, v0.b[11]
199 ; GISEL-NEXT:    fmov w9, s1
200 ; GISEL-NEXT:    fmov w10, s2
201 ; GISEL-NEXT:    fmov w11, s3
202 ; GISEL-NEXT:    fmov w12, s6
203 ; GISEL-NEXT:    mov b20, v0.b[12]
204 ; GISEL-NEXT:    mov b21, v0.b[13]
205 ; GISEL-NEXT:    fmov w13, s7
206 ; GISEL-NEXT:    mov b22, v0.b[14]
207 ; GISEL-NEXT:    mov b23, v0.b[15]
208 ; GISEL-NEXT:    orr w8, w8, w9
209 ; GISEL-NEXT:    orr w9, w10, w11
210 ; GISEL-NEXT:    fmov w10, s4
211 ; GISEL-NEXT:    orr w8, w8, w9
212 ; GISEL-NEXT:    fmov w11, s5
213 ; GISEL-NEXT:    fmov w14, s18
214 ; GISEL-NEXT:    fmov w15, s19
215 ; GISEL-NEXT:    fmov w16, s22
216 ; GISEL-NEXT:    fmov w17, s23
217 ; GISEL-NEXT:    orr w10, w10, w11
218 ; GISEL-NEXT:    orr w11, w12, w13
219 ; GISEL-NEXT:    fmov w12, s16
220 ; GISEL-NEXT:    orr w9, w10, w11
221 ; GISEL-NEXT:    fmov w13, s17
222 ; GISEL-NEXT:    orr w8, w8, w9
223 ; GISEL-NEXT:    orr w12, w12, w13
224 ; GISEL-NEXT:    orr w13, w14, w15
225 ; GISEL-NEXT:    fmov w14, s20
226 ; GISEL-NEXT:    fmov w15, s21
227 ; GISEL-NEXT:    orr w10, w12, w13
228 ; GISEL-NEXT:    orr w14, w14, w15
229 ; GISEL-NEXT:    orr w15, w16, w17
230 ; GISEL-NEXT:    orr w11, w14, w15
231 ; GISEL-NEXT:    orr w9, w10, w11
232 ; GISEL-NEXT:    orr w8, w8, w9
233 ; GISEL-NEXT:    fmov s0, w8
234 ; GISEL-NEXT:    ret
235   %or_result = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
236   %ins = insertelement <16 x i1> poison, i1 %or_result, i64 0
237   ret <16 x i1> %ins
240 define i8 @test_redor_v1i8(<1 x i8> %a) {
241 ; CHECK-LABEL: test_redor_v1i8:
242 ; CHECK:       // %bb.0:
243 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
244 ; CHECK-NEXT:    umov w0, v0.b[0]
245 ; CHECK-NEXT:    ret
247 ; GISEL-LABEL: test_redor_v1i8:
248 ; GISEL:       // %bb.0:
249 ; GISEL-NEXT:    fmov x0, d0
250 ; GISEL-NEXT:    // kill: def $w0 killed $w0 killed $x0
251 ; GISEL-NEXT:    ret
252   %or_result = call i8 @llvm.vector.reduce.or.v1i8(<1 x i8> %a)
253   ret i8 %or_result
256 define i8 @test_redor_v3i8(<3 x i8> %a) {
257 ; CHECK-LABEL: test_redor_v3i8:
258 ; CHECK:       // %bb.0:
259 ; CHECK-NEXT:    movi v0.2d, #0000000000000000
260 ; CHECK-NEXT:    mov v0.h[0], w0
261 ; CHECK-NEXT:    mov v0.h[1], w1
262 ; CHECK-NEXT:    fmov x8, d0
263 ; CHECK-NEXT:    mov v0.h[2], w2
264 ; CHECK-NEXT:    fmov x9, d0
265 ; CHECK-NEXT:    lsr x10, x9, #32
266 ; CHECK-NEXT:    lsr x9, x9, #16
267 ; CHECK-NEXT:    orr w8, w8, w10
268 ; CHECK-NEXT:    orr w0, w8, w9
269 ; CHECK-NEXT:    ret
271 ; GISEL-LABEL: test_redor_v3i8:
272 ; GISEL:       // %bb.0:
273 ; GISEL-NEXT:    orr w8, w0, w1
274 ; GISEL-NEXT:    orr w0, w8, w2
275 ; GISEL-NEXT:    ret
276   %or_result = call i8 @llvm.vector.reduce.or.v3i8(<3 x i8> %a)
277   ret i8 %or_result
280 define i8 @test_redor_v4i8(<4 x i8> %a) {
281 ; CHECK-LABEL: test_redor_v4i8:
282 ; CHECK:       // %bb.0:
283 ; CHECK-NEXT:    fmov x8, d0
284 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
285 ; CHECK-NEXT:    lsr x9, x8, #16
286 ; CHECK-NEXT:    orr w0, w8, w9
287 ; CHECK-NEXT:    ret
289 ; GISEL-LABEL: test_redor_v4i8:
290 ; GISEL:       // %bb.0:
291 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
292 ; GISEL-NEXT:    mov h1, v0.h[1]
293 ; GISEL-NEXT:    mov h2, v0.h[2]
294 ; GISEL-NEXT:    mov h3, v0.h[3]
295 ; GISEL-NEXT:    fmov w8, s0
296 ; GISEL-NEXT:    fmov w9, s1
297 ; GISEL-NEXT:    fmov w10, s2
298 ; GISEL-NEXT:    fmov w11, s3
299 ; GISEL-NEXT:    orr w8, w8, w9
300 ; GISEL-NEXT:    orr w9, w10, w11
301 ; GISEL-NEXT:    orr w0, w8, w9
302 ; GISEL-NEXT:    ret
303   %or_result = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> %a)
304   ret i8 %or_result
307 define i8 @test_redor_v8i8(<8 x i8> %a) {
308 ; CHECK-LABEL: test_redor_v8i8:
309 ; CHECK:       // %bb.0:
310 ; CHECK-NEXT:    fmov x8, d0
311 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
312 ; CHECK-NEXT:    orr x8, x8, x8, lsr #16
313 ; CHECK-NEXT:    lsr x9, x8, #8
314 ; CHECK-NEXT:    orr w0, w8, w9
315 ; CHECK-NEXT:    ret
317 ; GISEL-LABEL: test_redor_v8i8:
318 ; GISEL:       // %bb.0:
319 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
320 ; GISEL-NEXT:    mov b1, v0.b[1]
321 ; GISEL-NEXT:    mov b2, v0.b[2]
322 ; GISEL-NEXT:    mov b3, v0.b[3]
323 ; GISEL-NEXT:    mov b4, v0.b[4]
324 ; GISEL-NEXT:    mov b5, v0.b[5]
325 ; GISEL-NEXT:    mov b6, v0.b[6]
326 ; GISEL-NEXT:    mov b7, v0.b[7]
327 ; GISEL-NEXT:    fmov w8, s0
328 ; GISEL-NEXT:    fmov w9, s1
329 ; GISEL-NEXT:    fmov w10, s2
330 ; GISEL-NEXT:    fmov w11, s3
331 ; GISEL-NEXT:    fmov w12, s4
332 ; GISEL-NEXT:    fmov w13, s5
333 ; GISEL-NEXT:    fmov w14, s6
334 ; GISEL-NEXT:    orr w8, w8, w9
335 ; GISEL-NEXT:    fmov w9, s7
336 ; GISEL-NEXT:    orr w10, w10, w11
337 ; GISEL-NEXT:    orr w11, w12, w13
338 ; GISEL-NEXT:    orr w8, w8, w10
339 ; GISEL-NEXT:    orr w9, w14, w9
340 ; GISEL-NEXT:    orr w9, w11, w9
341 ; GISEL-NEXT:    orr w0, w8, w9
342 ; GISEL-NEXT:    ret
343   %or_result = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> %a)
344   ret i8 %or_result
347 define i8 @test_redor_v16i8(<16 x i8> %a) {
348 ; CHECK-LABEL: test_redor_v16i8:
349 ; CHECK:       // %bb.0:
350 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
351 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
352 ; CHECK-NEXT:    fmov x8, d0
353 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
354 ; CHECK-NEXT:    orr x8, x8, x8, lsr #16
355 ; CHECK-NEXT:    lsr x9, x8, #8
356 ; CHECK-NEXT:    orr w0, w8, w9
357 ; CHECK-NEXT:    ret
359 ; GISEL-LABEL: test_redor_v16i8:
360 ; GISEL:       // %bb.0:
361 ; GISEL-NEXT:    mov d1, v0.d[1]
362 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
363 ; GISEL-NEXT:    mov b1, v0.b[1]
364 ; GISEL-NEXT:    mov b2, v0.b[2]
365 ; GISEL-NEXT:    mov b3, v0.b[3]
366 ; GISEL-NEXT:    mov b4, v0.b[4]
367 ; GISEL-NEXT:    mov b5, v0.b[5]
368 ; GISEL-NEXT:    mov b6, v0.b[6]
369 ; GISEL-NEXT:    mov b7, v0.b[7]
370 ; GISEL-NEXT:    fmov w8, s0
371 ; GISEL-NEXT:    fmov w9, s1
372 ; GISEL-NEXT:    fmov w10, s2
373 ; GISEL-NEXT:    fmov w11, s3
374 ; GISEL-NEXT:    fmov w12, s4
375 ; GISEL-NEXT:    fmov w13, s5
376 ; GISEL-NEXT:    fmov w14, s6
377 ; GISEL-NEXT:    orr w8, w8, w9
378 ; GISEL-NEXT:    fmov w9, s7
379 ; GISEL-NEXT:    orr w10, w10, w11
380 ; GISEL-NEXT:    orr w11, w12, w13
381 ; GISEL-NEXT:    orr w8, w8, w10
382 ; GISEL-NEXT:    orr w9, w14, w9
383 ; GISEL-NEXT:    orr w9, w11, w9
384 ; GISEL-NEXT:    orr w0, w8, w9
385 ; GISEL-NEXT:    ret
386   %or_result = call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %a)
387   ret i8 %or_result
390 define i8 @test_redor_v32i8(<32 x i8> %a) {
391 ; CHECK-LABEL: test_redor_v32i8:
392 ; CHECK:       // %bb.0:
393 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
394 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
395 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
396 ; CHECK-NEXT:    fmov x8, d0
397 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
398 ; CHECK-NEXT:    orr x8, x8, x8, lsr #16
399 ; CHECK-NEXT:    lsr x9, x8, #8
400 ; CHECK-NEXT:    orr w0, w8, w9
401 ; CHECK-NEXT:    ret
403 ; GISEL-LABEL: test_redor_v32i8:
404 ; GISEL:       // %bb.0:
405 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
406 ; GISEL-NEXT:    mov d1, v0.d[1]
407 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
408 ; GISEL-NEXT:    mov b1, v0.b[1]
409 ; GISEL-NEXT:    mov b2, v0.b[2]
410 ; GISEL-NEXT:    mov b3, v0.b[3]
411 ; GISEL-NEXT:    mov b4, v0.b[4]
412 ; GISEL-NEXT:    mov b5, v0.b[5]
413 ; GISEL-NEXT:    mov b6, v0.b[6]
414 ; GISEL-NEXT:    mov b7, v0.b[7]
415 ; GISEL-NEXT:    fmov w8, s0
416 ; GISEL-NEXT:    fmov w9, s1
417 ; GISEL-NEXT:    fmov w10, s2
418 ; GISEL-NEXT:    fmov w11, s3
419 ; GISEL-NEXT:    fmov w12, s4
420 ; GISEL-NEXT:    fmov w13, s5
421 ; GISEL-NEXT:    fmov w14, s6
422 ; GISEL-NEXT:    orr w8, w8, w9
423 ; GISEL-NEXT:    fmov w9, s7
424 ; GISEL-NEXT:    orr w10, w10, w11
425 ; GISEL-NEXT:    orr w11, w12, w13
426 ; GISEL-NEXT:    orr w8, w8, w10
427 ; GISEL-NEXT:    orr w9, w14, w9
428 ; GISEL-NEXT:    orr w9, w11, w9
429 ; GISEL-NEXT:    orr w0, w8, w9
430 ; GISEL-NEXT:    ret
431   %or_result = call i8 @llvm.vector.reduce.or.v32i8(<32 x i8> %a)
432   ret i8 %or_result
435 define i16 @test_redor_v4i16(<4 x i16> %a) {
436 ; CHECK-LABEL: test_redor_v4i16:
437 ; CHECK:       // %bb.0:
438 ; CHECK-NEXT:    fmov x8, d0
439 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
440 ; CHECK-NEXT:    lsr x9, x8, #16
441 ; CHECK-NEXT:    orr w0, w8, w9
442 ; CHECK-NEXT:    ret
444 ; GISEL-LABEL: test_redor_v4i16:
445 ; GISEL:       // %bb.0:
446 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
447 ; GISEL-NEXT:    mov h1, v0.h[1]
448 ; GISEL-NEXT:    mov h2, v0.h[2]
449 ; GISEL-NEXT:    mov h3, v0.h[3]
450 ; GISEL-NEXT:    fmov w8, s0
451 ; GISEL-NEXT:    fmov w9, s1
452 ; GISEL-NEXT:    fmov w10, s2
453 ; GISEL-NEXT:    fmov w11, s3
454 ; GISEL-NEXT:    orr w8, w8, w9
455 ; GISEL-NEXT:    orr w9, w10, w11
456 ; GISEL-NEXT:    orr w0, w8, w9
457 ; GISEL-NEXT:    ret
458   %or_result = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %a)
459   ret i16 %or_result
462 define i16 @test_redor_v8i16(<8 x i16> %a) {
463 ; CHECK-LABEL: test_redor_v8i16:
464 ; CHECK:       // %bb.0:
465 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
466 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
467 ; CHECK-NEXT:    fmov x8, d0
468 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
469 ; CHECK-NEXT:    lsr x9, x8, #16
470 ; CHECK-NEXT:    orr w0, w8, w9
471 ; CHECK-NEXT:    ret
473 ; GISEL-LABEL: test_redor_v8i16:
474 ; GISEL:       // %bb.0:
475 ; GISEL-NEXT:    mov d1, v0.d[1]
476 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
477 ; GISEL-NEXT:    mov h1, v0.h[1]
478 ; GISEL-NEXT:    mov h2, v0.h[2]
479 ; GISEL-NEXT:    mov h3, v0.h[3]
480 ; GISEL-NEXT:    fmov w8, s0
481 ; GISEL-NEXT:    fmov w9, s1
482 ; GISEL-NEXT:    fmov w10, s2
483 ; GISEL-NEXT:    fmov w11, s3
484 ; GISEL-NEXT:    orr w8, w8, w9
485 ; GISEL-NEXT:    orr w9, w10, w11
486 ; GISEL-NEXT:    orr w0, w8, w9
487 ; GISEL-NEXT:    ret
488   %or_result = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %a)
489   ret i16 %or_result
492 define i16 @test_redor_v16i16(<16 x i16> %a) {
493 ; CHECK-LABEL: test_redor_v16i16:
494 ; CHECK:       // %bb.0:
495 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
496 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
497 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
498 ; CHECK-NEXT:    fmov x8, d0
499 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
500 ; CHECK-NEXT:    lsr x9, x8, #16
501 ; CHECK-NEXT:    orr w0, w8, w9
502 ; CHECK-NEXT:    ret
504 ; GISEL-LABEL: test_redor_v16i16:
505 ; GISEL:       // %bb.0:
506 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
507 ; GISEL-NEXT:    mov d1, v0.d[1]
508 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
509 ; GISEL-NEXT:    mov h1, v0.h[1]
510 ; GISEL-NEXT:    mov h2, v0.h[2]
511 ; GISEL-NEXT:    mov h3, v0.h[3]
512 ; GISEL-NEXT:    fmov w8, s0
513 ; GISEL-NEXT:    fmov w9, s1
514 ; GISEL-NEXT:    fmov w10, s2
515 ; GISEL-NEXT:    fmov w11, s3
516 ; GISEL-NEXT:    orr w8, w8, w9
517 ; GISEL-NEXT:    orr w9, w10, w11
518 ; GISEL-NEXT:    orr w0, w8, w9
519 ; GISEL-NEXT:    ret
520   %or_result = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a)
521   ret i16 %or_result
524 define i32 @test_redor_v2i32(<2 x i32> %a) {
525 ; CHECK-LABEL: test_redor_v2i32:
526 ; CHECK:       // %bb.0:
527 ; CHECK-NEXT:    fmov x8, d0
528 ; CHECK-NEXT:    lsr x9, x8, #32
529 ; CHECK-NEXT:    orr w0, w8, w9
530 ; CHECK-NEXT:    ret
532 ; GISEL-LABEL: test_redor_v2i32:
533 ; GISEL:       // %bb.0:
534 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
535 ; GISEL-NEXT:    mov s1, v0.s[1]
536 ; GISEL-NEXT:    fmov w8, s0
537 ; GISEL-NEXT:    fmov w9, s1
538 ; GISEL-NEXT:    orr w0, w8, w9
539 ; GISEL-NEXT:    ret
540   %or_result = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %a)
541   ret i32 %or_result
544 define i32 @test_redor_v4i32(<4 x i32> %a) {
545 ; CHECK-LABEL: test_redor_v4i32:
546 ; CHECK:       // %bb.0:
547 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
548 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
549 ; CHECK-NEXT:    fmov x8, d0
550 ; CHECK-NEXT:    lsr x9, x8, #32
551 ; CHECK-NEXT:    orr w0, w8, w9
552 ; CHECK-NEXT:    ret
554 ; GISEL-LABEL: test_redor_v4i32:
555 ; GISEL:       // %bb.0:
556 ; GISEL-NEXT:    mov d1, v0.d[1]
557 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
558 ; GISEL-NEXT:    mov s1, v0.s[1]
559 ; GISEL-NEXT:    fmov w8, s0
560 ; GISEL-NEXT:    fmov w9, s1
561 ; GISEL-NEXT:    orr w0, w8, w9
562 ; GISEL-NEXT:    ret
563   %or_result = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %a)
564   ret i32 %or_result
567 define i32 @test_redor_v8i32(<8 x i32> %a) {
568 ; CHECK-LABEL: test_redor_v8i32:
569 ; CHECK:       // %bb.0:
570 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
571 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
572 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
573 ; CHECK-NEXT:    fmov x8, d0
574 ; CHECK-NEXT:    lsr x9, x8, #32
575 ; CHECK-NEXT:    orr w0, w8, w9
576 ; CHECK-NEXT:    ret
578 ; GISEL-LABEL: test_redor_v8i32:
579 ; GISEL:       // %bb.0:
580 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
581 ; GISEL-NEXT:    mov d1, v0.d[1]
582 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
583 ; GISEL-NEXT:    mov s1, v0.s[1]
584 ; GISEL-NEXT:    fmov w8, s0
585 ; GISEL-NEXT:    fmov w9, s1
586 ; GISEL-NEXT:    orr w0, w8, w9
587 ; GISEL-NEXT:    ret
588   %or_result = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a)
589   ret i32 %or_result
592 define i64 @test_redor_v2i64(<2 x i64> %a) {
593 ; CHECK-LABEL: test_redor_v2i64:
594 ; CHECK:       // %bb.0:
595 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
596 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
597 ; CHECK-NEXT:    fmov x0, d0
598 ; CHECK-NEXT:    ret
600 ; GISEL-LABEL: test_redor_v2i64:
601 ; GISEL:       // %bb.0:
602 ; GISEL-NEXT:    mov d1, v0.d[1]
603 ; GISEL-NEXT:    fmov x8, d0
604 ; GISEL-NEXT:    fmov x9, d1
605 ; GISEL-NEXT:    orr x0, x8, x9
606 ; GISEL-NEXT:    ret
607   %or_result = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a)
608   ret i64 %or_result
611 define i64 @test_redor_v4i64(<4 x i64> %a) {
612 ; CHECK-LABEL: test_redor_v4i64:
613 ; CHECK:       // %bb.0:
614 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
615 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
616 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
617 ; CHECK-NEXT:    fmov x0, d0
618 ; CHECK-NEXT:    ret
620 ; GISEL-LABEL: test_redor_v4i64:
621 ; GISEL:       // %bb.0:
622 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
623 ; GISEL-NEXT:    mov d1, v0.d[1]
624 ; GISEL-NEXT:    fmov x8, d0
625 ; GISEL-NEXT:    fmov x9, d1
626 ; GISEL-NEXT:    orr x0, x8, x9
627 ; GISEL-NEXT:    ret
628   %or_result = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %a)
629   ret i64 %or_result
632 declare i1 @llvm.vector.reduce.or.v1i1(<1 x i1>)
633 declare i1 @llvm.vector.reduce.or.v2i1(<2 x i1>)
634 declare i1 @llvm.vector.reduce.or.v4i1(<4 x i1>)
635 declare i1 @llvm.vector.reduce.or.v8i1(<8 x i1>)
636 declare i1 @llvm.vector.reduce.or.v16i1(<16 x i1>)
637 declare i64 @llvm.vector.reduce.or.v2i64(<2 x i64>)
638 declare i64 @llvm.vector.reduce.or.v4i64(<4 x i64>)
639 declare i32 @llvm.vector.reduce.or.v2i32(<2 x i32>)
640 declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>)
641 declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>)
642 declare i16 @llvm.vector.reduce.or.v4i16(<4 x i16>)
643 declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>)
644 declare i16 @llvm.vector.reduce.or.v16i16(<16 x i16>)
645 declare i8 @llvm.vector.reduce.or.v1i8(<1 x i8>)
646 declare i8 @llvm.vector.reduce.or.v3i8(<3 x i8>)
647 declare i8 @llvm.vector.reduce.or.v4i8(<4 x i8>)
648 declare i8 @llvm.vector.reduce.or.v8i8(<8 x i8>)
649 declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>)
650 declare i8 @llvm.vector.reduce.or.v32i8(<32 x i8>)