[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-vector-compress.ll
blob84c15e4fbc33c7df458e06b043e9763d06e087c3
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2 ; RUN: llc -mtriple=aarch64 -mattr=+sve < %s | FileCheck %s
4 define <vscale x 2 x i8> @test_compress_nxv2i8(<vscale x 2 x i8> %vec, <vscale x 2 x i1> %mask) {
5 ; CHECK-LABEL: test_compress_nxv2i8:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    compact z0.d, p0, z0.d
8 ; CHECK-NEXT:    ret
9     %out = call <vscale x 2 x i8> @llvm.experimental.vector.compress(<vscale x 2 x i8> %vec, <vscale x 2 x i1> %mask, <vscale x 2 x i8> undef)
10     ret <vscale x 2 x i8> %out
13 define <vscale x 2 x i16> @test_compress_nxv2i16(<vscale x 2 x i16> %vec, <vscale x 2 x i1> %mask) {
14 ; CHECK-LABEL: test_compress_nxv2i16:
15 ; CHECK:       // %bb.0:
16 ; CHECK-NEXT:    compact z0.d, p0, z0.d
17 ; CHECK-NEXT:    ret
18     %out = call <vscale x 2 x i16> @llvm.experimental.vector.compress(<vscale x 2 x i16> %vec, <vscale x 2 x i1> %mask, <vscale x 2 x i16> undef)
19     ret <vscale x 2 x i16> %out
22 define <vscale x 2 x i32> @test_compress_nxv2i32(<vscale x 2 x i32> %vec, <vscale x 2 x i1> %mask) {
23 ; CHECK-LABEL: test_compress_nxv2i32:
24 ; CHECK:       // %bb.0:
25 ; CHECK-NEXT:    compact z0.d, p0, z0.d
26 ; CHECK-NEXT:    ret
27     %out = call <vscale x 2 x i32> @llvm.experimental.vector.compress(<vscale x 2 x i32> %vec, <vscale x 2 x i1> %mask, <vscale x 2 x i32> undef)
28     ret <vscale x 2 x i32> %out
31 define <vscale x 2 x i64> @test_compress_nxv2i64(<vscale x 2 x i64> %vec, <vscale x 2 x i1> %mask) {
32 ; CHECK-LABEL: test_compress_nxv2i64:
33 ; CHECK:       // %bb.0:
34 ; CHECK-NEXT:    compact z0.d, p0, z0.d
35 ; CHECK-NEXT:    ret
36     %out = call <vscale x 2 x i64> @llvm.experimental.vector.compress(<vscale x 2 x i64> %vec, <vscale x 2 x i1> %mask, <vscale x 2 x i64> undef)
37     ret <vscale x 2 x i64> %out
40 define <vscale x 2 x float> @test_compress_nxv2f32(<vscale x 2 x float> %vec, <vscale x 2 x i1> %mask) {
41 ; CHECK-LABEL: test_compress_nxv2f32:
42 ; CHECK:       // %bb.0:
43 ; CHECK-NEXT:    compact z0.d, p0, z0.d
44 ; CHECK-NEXT:    ret
45     %out = call <vscale x 2 x float> @llvm.experimental.vector.compress(<vscale x 2 x float> %vec, <vscale x 2 x i1> %mask, <vscale x 2 x float> undef)
46     ret <vscale x 2 x float> %out
49 define <vscale x 2 x double> @test_compress_nxv2f64(<vscale x 2 x double> %vec, <vscale x 2 x i1> %mask) {
50 ; CHECK-LABEL: test_compress_nxv2f64:
51 ; CHECK:       // %bb.0:
52 ; CHECK-NEXT:    compact z0.d, p0, z0.d
53 ; CHECK-NEXT:    ret
54     %out = call <vscale x 2 x double> @llvm.experimental.vector.compress(<vscale x 2 x double> %vec, <vscale x 2 x i1> %mask, <vscale x 2 x double> undef)
55     ret <vscale x 2 x double> %out
58 define <vscale x 4 x i8> @test_compress_nxv4i8(<vscale x 4 x i8> %vec, <vscale x 4 x i1> %mask) {
59 ; CHECK-LABEL: test_compress_nxv4i8:
60 ; CHECK:       // %bb.0:
61 ; CHECK-NEXT:    compact z0.s, p0, z0.s
62 ; CHECK-NEXT:    ret
63     %out = call <vscale x 4 x i8> @llvm.experimental.vector.compress(<vscale x 4 x i8> %vec, <vscale x 4 x i1> %mask, <vscale x 4 x i8> undef)
64     ret <vscale x 4 x i8> %out
67 define <vscale x 4 x i16> @test_compress_nxv4i16(<vscale x 4 x i16> %vec, <vscale x 4 x i1> %mask) {
68 ; CHECK-LABEL: test_compress_nxv4i16:
69 ; CHECK:       // %bb.0:
70 ; CHECK-NEXT:    compact z0.s, p0, z0.s
71 ; CHECK-NEXT:    ret
72     %out = call <vscale x 4 x i16> @llvm.experimental.vector.compress(<vscale x 4 x i16> %vec, <vscale x 4 x i1> %mask, <vscale x 4 x i16> undef)
73     ret <vscale x 4 x i16> %out
76 define <vscale x 4 x i32> @test_compress_nxv4i32(<vscale x 4 x i32> %vec, <vscale x 4 x i1> %mask) {
77 ; CHECK-LABEL: test_compress_nxv4i32:
78 ; CHECK:       // %bb.0:
79 ; CHECK-NEXT:    compact z0.s, p0, z0.s
80 ; CHECK-NEXT:    ret
81     %out = call <vscale x 4 x i32> @llvm.experimental.vector.compress(<vscale x 4 x i32> %vec, <vscale x 4 x i1> %mask, <vscale x 4 x i32> undef)
82     ret <vscale x 4 x i32> %out
85 define <vscale x 4 x float> @test_compress_nxv4f32(<vscale x 4 x float> %vec, <vscale x 4 x i1> %mask) {
86 ; CHECK-LABEL: test_compress_nxv4f32:
87 ; CHECK:       // %bb.0:
88 ; CHECK-NEXT:    compact z0.s, p0, z0.s
89 ; CHECK-NEXT:    ret
90     %out = call <vscale x 4 x float> @llvm.experimental.vector.compress(<vscale x 4 x float> %vec, <vscale x 4 x i1> %mask, <vscale x 4 x float> undef)
91     ret <vscale x 4 x float> %out
94 define <vscale x 4 x i4> @test_compress_illegal_element_type(<vscale x 4 x i4> %vec, <vscale x 4 x i1> %mask) {
95 ; CHECK-LABEL: test_compress_illegal_element_type:
96 ; CHECK:       // %bb.0:
97 ; CHECK-NEXT:    compact z0.s, p0, z0.s
98 ; CHECK-NEXT:    ret
99     %out = call <vscale x 4 x i4> @llvm.experimental.vector.compress(<vscale x 4 x i4> %vec, <vscale x 4 x i1> %mask, <vscale x 4 x i4> undef)
100     ret <vscale x 4 x i4> %out
103 define <vscale x 8 x i32> @test_compress_large(<vscale x 8 x i32> %vec, <vscale x 8 x i1> %mask) {
104 ; CHECK-LABEL: test_compress_large:
105 ; CHECK:       // %bb.0:
106 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
107 ; CHECK-NEXT:    addvl sp, sp, #-2
108 ; CHECK-NEXT:    .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 16 * VG
109 ; CHECK-NEXT:    .cfi_offset w29, -16
110 ; CHECK-NEXT:    punpklo p2.h, p0.b
111 ; CHECK-NEXT:    cnth x9
112 ; CHECK-NEXT:    ptrue p1.s
113 ; CHECK-NEXT:    sub x9, x9, #1
114 ; CHECK-NEXT:    punpkhi p0.h, p0.b
115 ; CHECK-NEXT:    compact z0.s, p2, z0.s
116 ; CHECK-NEXT:    cntp x8, p1, p2.s
117 ; CHECK-NEXT:    compact z1.s, p0, z1.s
118 ; CHECK-NEXT:    st1w { z0.s }, p1, [sp]
119 ; CHECK-NEXT:    mov w8, w8
120 ; CHECK-NEXT:    cmp x8, x9
121 ; CHECK-NEXT:    csel x8, x8, x9, lo
122 ; CHECK-NEXT:    mov x9, sp
123 ; CHECK-NEXT:    st1w { z1.s }, p1, [x9, x8, lsl #2]
124 ; CHECK-NEXT:    ld1w { z0.s }, p1/z, [sp]
125 ; CHECK-NEXT:    ld1w { z1.s }, p1/z, [sp, #1, mul vl]
126 ; CHECK-NEXT:    addvl sp, sp, #2
127 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
128 ; CHECK-NEXT:    ret
129     %out = call <vscale x 8 x i32> @llvm.experimental.vector.compress(<vscale x 8 x i32> %vec, <vscale x 8 x i1> %mask, <vscale x 8 x i32> undef)
130     ret <vscale x 8 x i32> %out
133 ; We pass a placeholder value for the const_mask* tests to check that they are converted to a no-op by simply copying
134 ; the second vector input register to the ret register or doing nothing.
135 define <vscale x 4 x i32> @test_compress_const_splat1_mask(<vscale x 4 x i32> %ignore, <vscale x 4 x i32> %vec) {
136 ; CHECK-LABEL: test_compress_const_splat1_mask:
137 ; CHECK:       // %bb.0:
138 ; CHECK-NEXT:    mov z0.d, z1.d
139 ; CHECK-NEXT:    ret
140     %out = call <vscale x 4 x i32> @llvm.experimental.vector.compress(<vscale x 4 x i32> %vec, <vscale x 4 x i1> splat (i1 -1), <vscale x 4 x i32> undef)
141     ret <vscale x 4 x i32> %out
143 define <vscale x 4 x i32> @test_compress_const_splat0_mask(<vscale x 4 x i32> %ignore, <vscale x 4 x i32> %vec) {
144 ; CHECK-LABEL: test_compress_const_splat0_mask:
145 ; CHECK:       // %bb.0:
146 ; CHECK-NEXT:    ret
147     %out = call <vscale x 4 x i32> @llvm.experimental.vector.compress(<vscale x 4 x i32> %vec, <vscale x 4 x i1> splat (i1 0), <vscale x 4 x i32> undef)
148     ret <vscale x 4 x i32> %out
150 define <vscale x 4 x i32> @test_compress_undef_mask(<vscale x 4 x i32> %ignore, <vscale x 4 x i32> %vec) {
151 ; CHECK-LABEL: test_compress_undef_mask:
152 ; CHECK:       // %bb.0:
153 ; CHECK-NEXT:    ret
154     %out = call <vscale x 4 x i32> @llvm.experimental.vector.compress(<vscale x 4 x i32> %vec, <vscale x 4 x i1> undef, <vscale x 4 x i32> undef)
155     ret <vscale x 4 x i32> %out
158 define <4 x i32> @test_compress_v4i32_with_sve(<4 x i32> %vec, <4 x i1> %mask) {
159 ; CHECK-LABEL: test_compress_v4i32_with_sve:
160 ; CHECK:       // %bb.0:
161 ; CHECK-NEXT:    ushll v1.4s, v1.4h, #0
162 ; CHECK-NEXT:    ptrue p0.s
163 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
164 ; CHECK-NEXT:    shl v1.4s, v1.4s, #31
165 ; CHECK-NEXT:    cmlt v1.4s, v1.4s, #0
166 ; CHECK-NEXT:    and z1.s, z1.s, #0x1
167 ; CHECK-NEXT:    cmpne p0.s, p0/z, z1.s, #0
168 ; CHECK-NEXT:    compact z0.s, p0, z0.s
169 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
170 ; CHECK-NEXT:    ret
171     %out = call <4 x i32> @llvm.experimental.vector.compress(<4 x i32> %vec, <4 x i1> %mask, <4 x i32> undef)
172     ret <4 x i32> %out
175 define <1 x i32> @test_compress_v1i32_with_sve(<1 x i32> %vec, <1 x i1> %mask) {
176 ; CHECK-LABEL: test_compress_v1i32_with_sve:
177 ; CHECK:       // %bb.0:
178 ; CHECK-NEXT:    movi v1.2d, #0000000000000000
179 ; CHECK-NEXT:    sbfx w8, w0, #0, #1
180 ; CHECK-NEXT:    ptrue p0.d
181 ; CHECK-NEXT:    ushll v0.2d, v0.2s, #0
182 ; CHECK-NEXT:    mov v1.s[0], w8
183 ; CHECK-NEXT:    ushll v1.2d, v1.2s, #0
184 ; CHECK-NEXT:    and z1.d, z1.d, #0x1
185 ; CHECK-NEXT:    cmpne p0.d, p0/z, z1.d, #0
186 ; CHECK-NEXT:    compact z0.d, p0, z0.d
187 ; CHECK-NEXT:    xtn v0.2s, v0.2d
188 ; CHECK-NEXT:    ret
189     %out = call <1 x i32> @llvm.experimental.vector.compress(<1 x i32> %vec, <1 x i1> %mask, <1 x i32> undef)
190     ret <1 x i32> %out
193 define <4 x double> @test_compress_v4f64_with_sve(<4 x double> %vec, <4 x i1> %mask) {
194 ; CHECK-LABEL: test_compress_v4f64_with_sve:
195 ; CHECK:       // %bb.0:
196 ; CHECK-NEXT:    sub sp, sp, #32
197 ; CHECK-NEXT:    .cfi_def_cfa_offset 32
198 ; CHECK-NEXT:    ushll v2.4s, v2.4h, #0
199 ; CHECK-NEXT:    ptrue p0.d
200 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
201 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
202 ; CHECK-NEXT:    ushll v3.2d, v2.2s, #0
203 ; CHECK-NEXT:    ushll2 v4.2d, v2.4s, #0
204 ; CHECK-NEXT:    fmov x8, d2
205 ; CHECK-NEXT:    shl v3.2d, v3.2d, #63
206 ; CHECK-NEXT:    shl v4.2d, v4.2d, #63
207 ; CHECK-NEXT:    lsr x9, x8, #32
208 ; CHECK-NEXT:    eor w8, w8, w9
209 ; CHECK-NEXT:    mov x9, sp
210 ; CHECK-NEXT:    cmlt v3.2d, v3.2d, #0
211 ; CHECK-NEXT:    cmlt v4.2d, v4.2d, #0
212 ; CHECK-NEXT:    and x8, x8, #0x3
213 ; CHECK-NEXT:    lsl x8, x8, #3
214 ; CHECK-NEXT:    and z3.d, z3.d, #0x1
215 ; CHECK-NEXT:    and z4.d, z4.d, #0x1
216 ; CHECK-NEXT:    cmpne p1.d, p0/z, z3.d, #0
217 ; CHECK-NEXT:    cmpne p0.d, p0/z, z4.d, #0
218 ; CHECK-NEXT:    compact z0.d, p1, z0.d
219 ; CHECK-NEXT:    compact z1.d, p0, z1.d
220 ; CHECK-NEXT:    str q0, [sp]
221 ; CHECK-NEXT:    str q1, [x9, x8]
222 ; CHECK-NEXT:    ldp q0, q1, [sp], #32
223 ; CHECK-NEXT:    ret
224     %out = call <4 x double> @llvm.experimental.vector.compress(<4 x double> %vec, <4 x i1> %mask, <4 x double> undef)
225     ret <4 x double> %out
228 define <2 x i16> @test_compress_v2i16_with_sve(<2 x i16> %vec, <2 x i1> %mask) {
229 ; CHECK-LABEL: test_compress_v2i16_with_sve:
230 ; CHECK:       // %bb.0:
231 ; CHECK-NEXT:    ushll v1.2d, v1.2s, #0
232 ; CHECK-NEXT:    ptrue p0.d
233 ; CHECK-NEXT:    ushll v0.2d, v0.2s, #0
234 ; CHECK-NEXT:    and z1.d, z1.d, #0x1
235 ; CHECK-NEXT:    cmpne p0.d, p0/z, z1.d, #0
236 ; CHECK-NEXT:    compact z0.d, p0, z0.d
237 ; CHECK-NEXT:    xtn v0.2s, v0.2d
238 ; CHECK-NEXT:    ret
239     %out = call <2 x i16> @llvm.experimental.vector.compress(<2 x i16> %vec, <2 x i1> %mask, <2 x i16> undef)
240     ret <2 x i16> %out
244 define <vscale x 4 x i32> @test_compress_nxv4i32_with_passthru(<vscale x 4 x i32> %vec, <vscale x 4 x i1> %mask, <vscale x 4 x i32> %passthru) {
245 ; CHECK-LABEL: test_compress_nxv4i32_with_passthru:
246 ; CHECK:       // %bb.0:
247 ; CHECK-NEXT:    cntp x8, p0, p0.s
248 ; CHECK-NEXT:    compact z0.s, p0, z0.s
249 ; CHECK-NEXT:    whilelo p0.s, xzr, x8
250 ; CHECK-NEXT:    sel z0.s, p0, z0.s, z1.s
251 ; CHECK-NEXT:    ret
252     %out = call <vscale x 4 x i32> @llvm.experimental.vector.compress(<vscale x 4 x i32> %vec, <vscale x 4 x i1> %mask, <vscale x 4 x i32> %passthru)
253     ret <vscale x 4 x i32> %out
256 define <vscale x 4 x i32> @test_compress_nxv4i32_with_zero_passthru(<vscale x 4 x i32> %vec, <vscale x 4 x i1> %mask) {
257 ; CHECK-LABEL: test_compress_nxv4i32_with_zero_passthru:
258 ; CHECK:       // %bb.0:
259 ; CHECK-NEXT:    compact z0.s, p0, z0.s
260 ; CHECK-NEXT:    ret
261     %out = call <vscale x 4 x i32> @llvm.experimental.vector.compress(<vscale x 4 x i32> %vec, <vscale x 4 x i1> %mask, <vscale x 4 x i32> splat(i32 0))
262     ret <vscale x 4 x i32> %out
265 define <vscale x 4 x i32> @test_compress_nxv4i32_with_const_passthru(<vscale x 4 x i32> %vec, <vscale x 4 x i1> %mask) {
266 ; CHECK-LABEL: test_compress_nxv4i32_with_const_passthru:
267 ; CHECK:       // %bb.0:
268 ; CHECK-NEXT:    cntp x8, p0, p0.s
269 ; CHECK-NEXT:    compact z0.s, p0, z0.s
270 ; CHECK-NEXT:    mov z1.s, #5 // =0x5
271 ; CHECK-NEXT:    whilelo p0.s, xzr, x8
272 ; CHECK-NEXT:    sel z0.s, p0, z0.s, z1.s
273 ; CHECK-NEXT:    ret
274     %out = call <vscale x 4 x i32> @llvm.experimental.vector.compress(<vscale x 4 x i32> %vec, <vscale x 4 x i1> %mask, <vscale x 4 x i32> splat(i32 5))
275     ret <vscale x 4 x i32> %out