Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-subvector.ll
blob75bae88fc4798ea78a84fdcbbaec17db72783db6
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve -force-streaming-compatible-sve < %s | FileCheck %s
3 ; RUN: llc -mattr=+sme -force-streaming-compatible-sve < %s | FileCheck %s
6 ; Test we can code generater patterns of the form:
7 ;   fixed_length_vector = ISD::EXTRACT_SUBVECTOR scalable_vector, 0
8 ;   scalable_vector = ISD::INSERT_SUBVECTOR scalable_vector, fixed_length_vector, 0
10 ; NOTE: Currently shufflevector does not support scalable vectors so it cannot
11 ; be used to model the above operations.  Instead these tests rely on knowing
12 ; how fixed length operation are lowered to scalable ones, with multiple blocks
13 ; ensuring insert/extract sequences are not folded away.
15 target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
16 target triple = "aarch64-unknown-linux-gnu"
18 ; i8
19 define void @subvector_v4i8(ptr %in, ptr %out) {
20 ; CHECK-LABEL: subvector_v4i8:
21 ; CHECK:       // %bb.0: // %bb1
22 ; CHECK-NEXT:    ptrue p0.h, vl4
23 ; CHECK-NEXT:    ld1b { z0.h }, p0/z, [x0]
24 ; CHECK-NEXT:    st1b { z0.h }, p0, [x1]
25 ; CHECK-NEXT:    ret
26   %a = load <4 x i8>, ptr %in
27   br label %bb1
29 bb1:
30   store <4 x i8> %a, ptr %out
31   ret void
34 define void @subvector_v8i8(ptr %in, ptr %out) {
35 ; CHECK-LABEL: subvector_v8i8:
36 ; CHECK:       // %bb.0: // %bb1
37 ; CHECK-NEXT:    ldr d0, [x0]
38 ; CHECK-NEXT:    str d0, [x1]
39 ; CHECK-NEXT:    ret
40   %a = load <8 x i8>, ptr %in
41   br label %bb1
43 bb1:
44   store <8 x i8> %a, ptr %out
45   ret void
48 define void @subvector_v16i8(ptr %in, ptr %out) {
49 ; CHECK-LABEL: subvector_v16i8:
50 ; CHECK:       // %bb.0: // %bb1
51 ; CHECK-NEXT:    ldr q0, [x0]
52 ; CHECK-NEXT:    str q0, [x1]
53 ; CHECK-NEXT:    ret
54   %a = load <16 x i8>, ptr %in
55   br label %bb1
57 bb1:
58   store <16 x i8> %a, ptr %out
59   ret void
62 define void @subvector_v32i8(ptr %in, ptr %out) {
63 ; CHECK-LABEL: subvector_v32i8:
64 ; CHECK:       // %bb.0: // %bb1
65 ; CHECK-NEXT:    ldp q0, q1, [x0]
66 ; CHECK-NEXT:    stp q0, q1, [x1]
67 ; CHECK-NEXT:    ret
68   %a = load <32 x i8>, ptr %in
69   br label %bb1
71 bb1:
72   store <32 x i8> %a, ptr %out
73   ret void
76 ; i16
77 define void @subvector_v2i16(ptr %in, ptr %out) {
78 ; CHECK-LABEL: subvector_v2i16:
79 ; CHECK:       // %bb.0: // %bb1
80 ; CHECK-NEXT:    sub sp, sp, #16
81 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
82 ; CHECK-NEXT:    ldrh w8, [x0, #2]
83 ; CHECK-NEXT:    ptrue p0.s, vl2
84 ; CHECK-NEXT:    str w8, [sp, #12]
85 ; CHECK-NEXT:    ldrh w8, [x0]
86 ; CHECK-NEXT:    str w8, [sp, #8]
87 ; CHECK-NEXT:    ldr d0, [sp, #8]
88 ; CHECK-NEXT:    st1h { z0.s }, p0, [x1]
89 ; CHECK-NEXT:    add sp, sp, #16
90 ; CHECK-NEXT:    ret
91   %a = load <2 x i16>, ptr %in
92   br label %bb1
94 bb1:
95   store <2 x i16> %a, ptr %out
96   ret void
99 define void @subvector_v4i16(ptr %in, ptr %out) {
100 ; CHECK-LABEL: subvector_v4i16:
101 ; CHECK:       // %bb.0: // %bb1
102 ; CHECK-NEXT:    ldr d0, [x0]
103 ; CHECK-NEXT:    str d0, [x1]
104 ; CHECK-NEXT:    ret
105   %a = load <4 x i16>, ptr %in
106   br label %bb1
108 bb1:
109   store <4 x i16> %a, ptr %out
110   ret void
113 define void @subvector_v8i16(ptr %in, ptr %out) {
114 ; CHECK-LABEL: subvector_v8i16:
115 ; CHECK:       // %bb.0: // %bb1
116 ; CHECK-NEXT:    ldr q0, [x0]
117 ; CHECK-NEXT:    str q0, [x1]
118 ; CHECK-NEXT:    ret
119   %a = load <8 x i16>, ptr %in
120   br label %bb1
122 bb1:
123   store <8 x i16> %a, ptr %out
124   ret void
127 define void @subvector_v16i16(ptr %in, ptr %out) {
128 ; CHECK-LABEL: subvector_v16i16:
129 ; CHECK:       // %bb.0: // %bb1
130 ; CHECK-NEXT:    ldp q0, q1, [x0]
131 ; CHECK-NEXT:    stp q0, q1, [x1]
132 ; CHECK-NEXT:    ret
133   %a = load <16 x i16>, ptr %in
134   br label %bb1
136 bb1:
137   store <16 x i16> %a, ptr %out
138   ret void
141 ; i32
142 define void @subvector_v2i32(ptr %in, ptr %out) {
143 ; CHECK-LABEL: subvector_v2i32:
144 ; CHECK:       // %bb.0: // %bb1
145 ; CHECK-NEXT:    ldr d0, [x0]
146 ; CHECK-NEXT:    str d0, [x1]
147 ; CHECK-NEXT:    ret
148   %a = load <2 x i32>, ptr %in
149   br label %bb1
151 bb1:
152   store <2 x i32> %a, ptr %out
153   ret void
156 define void @subvector_v4i32(ptr %in, ptr %out) {
157 ; CHECK-LABEL: subvector_v4i32:
158 ; CHECK:       // %bb.0: // %bb1
159 ; CHECK-NEXT:    ldr q0, [x0]
160 ; CHECK-NEXT:    str q0, [x1]
161 ; CHECK-NEXT:    ret
162   %a = load <4 x i32>, ptr %in
163   br label %bb1
165 bb1:
166   store <4 x i32> %a, ptr %out
167   ret void
170 define void @subvector_v8i32(ptr %in, ptr %out) {
171 ; CHECK-LABEL: subvector_v8i32:
172 ; CHECK:       // %bb.0: // %bb1
173 ; CHECK-NEXT:    ldp q0, q1, [x0]
174 ; CHECK-NEXT:    stp q0, q1, [x1]
175 ; CHECK-NEXT:    ret
176   %a = load <8 x i32>, ptr %in
177   br label %bb1
179 bb1:
180   store <8 x i32> %a, ptr %out
181   ret void
184 ; i64
185 define void @subvector_v2i64(ptr %in, ptr %out) {
186 ; CHECK-LABEL: subvector_v2i64:
187 ; CHECK:       // %bb.0: // %bb1
188 ; CHECK-NEXT:    ldr q0, [x0]
189 ; CHECK-NEXT:    str q0, [x1]
190 ; CHECK-NEXT:    ret
191   %a = load <2 x i64>, ptr %in
192   br label %bb1
194 bb1:
195   store <2 x i64> %a, ptr %out
196   ret void
199 define void @subvector_v4i64(ptr %in, ptr %out) {
200 ; CHECK-LABEL: subvector_v4i64:
201 ; CHECK:       // %bb.0: // %bb1
202 ; CHECK-NEXT:    ldp q0, q1, [x0]
203 ; CHECK-NEXT:    stp q0, q1, [x1]
204 ; CHECK-NEXT:    ret
205   %a = load <4 x i64>, ptr %in
206   br label %bb1
208 bb1:
209   store <4 x i64> %a, ptr %out
210   ret void
213 ; f16
214 define void @subvector_v2f16(ptr %in, ptr %out) {
215 ; CHECK-LABEL: subvector_v2f16:
216 ; CHECK:       // %bb.0: // %bb1
217 ; CHECK-NEXT:    ldr w8, [x0]
218 ; CHECK-NEXT:    str w8, [x1]
219 ; CHECK-NEXT:    ret
220   %a = load <2 x half>, ptr %in
221   br label %bb1
223 bb1:
224   store <2 x half> %a, ptr %out
225   ret void
228 define void @subvector_v4f16(ptr %in, ptr %out) {
229 ; CHECK-LABEL: subvector_v4f16:
230 ; CHECK:       // %bb.0: // %bb1
231 ; CHECK-NEXT:    ldr d0, [x0]
232 ; CHECK-NEXT:    str d0, [x1]
233 ; CHECK-NEXT:    ret
234   %a = load <4 x half>, ptr %in
235   br label %bb1
237 bb1:
238   store <4 x half> %a, ptr %out
239   ret void
242 define void @subvector_v8f16(ptr %in, ptr %out) {
243 ; CHECK-LABEL: subvector_v8f16:
244 ; CHECK:       // %bb.0: // %bb1
245 ; CHECK-NEXT:    ldr q0, [x0]
246 ; CHECK-NEXT:    str q0, [x1]
247 ; CHECK-NEXT:    ret
248   %a = load <8 x half>, ptr %in
249   br label %bb1
251 bb1:
252   store <8 x half> %a, ptr %out
253   ret void
256 define void @subvector_v16f16(ptr %in, ptr %out) {
257 ; CHECK-LABEL: subvector_v16f16:
258 ; CHECK:       // %bb.0: // %bb1
259 ; CHECK-NEXT:    ldp q0, q1, [x0]
260 ; CHECK-NEXT:    stp q0, q1, [x1]
261 ; CHECK-NEXT:    ret
262   %a = load <16 x half>, ptr %in
263   br label %bb1
265 bb1:
266   store <16 x half> %a, ptr %out
267   ret void
270 ; f32
271 define void @subvector_v2f32(ptr %in, ptr %out) {
272 ; CHECK-LABEL: subvector_v2f32:
273 ; CHECK:       // %bb.0: // %bb1
274 ; CHECK-NEXT:    ldr d0, [x0]
275 ; CHECK-NEXT:    str d0, [x1]
276 ; CHECK-NEXT:    ret
277   %a = load <2 x float>, ptr %in
278   br label %bb1
280 bb1:
281   store <2 x float> %a, ptr %out
282   ret void
285 define void @subvector_v4f32(ptr %in, ptr %out) {
286 ; CHECK-LABEL: subvector_v4f32:
287 ; CHECK:       // %bb.0: // %bb1
288 ; CHECK-NEXT:    ldr q0, [x0]
289 ; CHECK-NEXT:    str q0, [x1]
290 ; CHECK-NEXT:    ret
291   %a = load <4 x float>, ptr %in
292   br label %bb1
294 bb1:
295   store <4 x float> %a, ptr %out
296   ret void
299 define void @subvector_v8f32(ptr %in, ptr %out) {
300 ; CHECK-LABEL: subvector_v8f32:
301 ; CHECK:       // %bb.0: // %bb1
302 ; CHECK-NEXT:    ldp q0, q1, [x0]
303 ; CHECK-NEXT:    stp q0, q1, [x1]
304 ; CHECK-NEXT:    ret
305   %a = load <8 x float>,ptr %in
306   br label %bb1
308 bb1:
309   store <8 x float> %a, ptr %out
310   ret void
313 ; f64
314 define void @subvector_v2f64(ptr %in, ptr %out) {
315 ; CHECK-LABEL: subvector_v2f64:
316 ; CHECK:       // %bb.0: // %bb1
317 ; CHECK-NEXT:    ldr q0, [x0]
318 ; CHECK-NEXT:    str q0, [x1]
319 ; CHECK-NEXT:    ret
320   %a = load <2 x double>, ptr %in
321   br label %bb1
323 bb1:
324   store <2 x double> %a, ptr %out
325   ret void
328 define void @subvector_v4f64(ptr %in, ptr %out) {
329 ; CHECK-LABEL: subvector_v4f64:
330 ; CHECK:       // %bb.0: // %bb1
331 ; CHECK-NEXT:    ldp q0, q1, [x0]
332 ; CHECK-NEXT:    stp q0, q1, [x1]
333 ; CHECK-NEXT:    ret
334   %a = load <4 x double>, ptr %in
335   br label %bb1
337 bb1:
338   store <4 x double> %a, ptr %out
339   ret void