Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / narrow-shift-extend.ll
blobb966aea720a9263dc6783551566e60fe0571172a
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
4 declare <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
5   <vscale x 4 x i32>,
6   <vscale x 4 x i32>*,
7   <vscale x 4 x i64>,
8   i64);
10 define <vscale x 4 x i32> @test_vloxei(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
11 ; CHECK-LABEL: test_vloxei:
12 ; CHECK:       # %bb.0: # %entry
13 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
14 ; CHECK-NEXT:    vzext.vf8 v12, v8
15 ; CHECK-NEXT:    vsll.vi v12, v12, 4
16 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
17 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12
18 ; CHECK-NEXT:    ret
19 entry:
20   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
21   %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
22   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
23   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
24   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
25     <vscale x 4 x i32> undef,
26     <vscale x 4 x i32>* %ptr,
27     <vscale x 4 x i64> %shl,
28     i64 %vl)
29   ret <vscale x 4 x i32> %res
32 define <vscale x 4 x i32> @test_vloxei2(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
33 ; CHECK-LABEL: test_vloxei2:
34 ; CHECK:       # %bb.0: # %entry
35 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
36 ; CHECK-NEXT:    vzext.vf8 v12, v8
37 ; CHECK-NEXT:    vsll.vi v12, v12, 14
38 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
39 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12
40 ; CHECK-NEXT:    ret
41 entry:
42   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
43   %shamt = insertelement <vscale x 4 x i64> undef, i64 14, i32 0
44   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
45   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
46   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
47     <vscale x 4 x i32> undef,
48     <vscale x 4 x i32>* %ptr,
49     <vscale x 4 x i64> %shl,
50     i64 %vl)
51   ret <vscale x 4 x i32> %res
54 define <vscale x 4 x i32> @test_vloxei3(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
55 ; CHECK-LABEL: test_vloxei3:
56 ; CHECK:       # %bb.0: # %entry
57 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
58 ; CHECK-NEXT:    vzext.vf8 v12, v8
59 ; CHECK-NEXT:    vsll.vi v12, v12, 26
60 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
61 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12
62 ; CHECK-NEXT:    ret
63 entry:
64   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
65   %shamt = insertelement <vscale x 4 x i64> undef, i64 26, i32 0
66   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
67   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
68   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
69     <vscale x 4 x i32> undef,
70     <vscale x 4 x i32>* %ptr,
71     <vscale x 4 x i64> %shl,
72     i64 %vl)
73   ret <vscale x 4 x i32> %res
76 ; Test use vp.zext to extend.
77 declare <vscale x 4 x i64> @llvm.vp.zext.nxvi64.nxv1i8(<vscale x 4 x i8>, <vscale x 4 x i1>, i32)
78 define <vscale x 4 x i32> @test_vloxei4(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i32 zeroext %vl) {
79 ; CHECK-LABEL: test_vloxei4:
80 ; CHECK:       # %bb.0: # %entry
81 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
82 ; CHECK-NEXT:    vzext.vf8 v12, v8, v0.t
83 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
84 ; CHECK-NEXT:    vsll.vi v12, v12, 4
85 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
86 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12
87 ; CHECK-NEXT:    ret
88 entry:
89   %offset.ext = call <vscale x 4 x i64> @llvm.vp.zext.nxvi64.nxv1i8(<vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i32 %vl)
90   %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
91   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
92   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
93   %vl.i64 = zext i32 %vl to i64
94   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
95     <vscale x 4 x i32> undef,
96     <vscale x 4 x i32>* %ptr,
97     <vscale x 4 x i64> %shl,
98     i64 %vl.i64)
99   ret <vscale x 4 x i32> %res
102 ; Test orignal extnened type is enough narrow.
103 declare <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i16(
104   <vscale x 4 x i32>,
105   <vscale x 4 x i32>*,
106   <vscale x 4 x i16>,
107   i64);
108 define <vscale x 4 x i32> @test_vloxei5(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
109 ; CHECK-LABEL: test_vloxei5:
110 ; CHECK:       # %bb.0: # %entry
111 ; CHECK-NEXT:    vsetvli a2, zero, e16, m1, ta, ma
112 ; CHECK-NEXT:    vzext.vf2 v9, v8
113 ; CHECK-NEXT:    vsll.vi v10, v9, 12
114 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
115 ; CHECK-NEXT:    vloxei16.v v8, (a0), v10
116 ; CHECK-NEXT:    ret
117 entry:
118   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i16>
119   %shamt = insertelement <vscale x 4 x i16> undef, i16 12, i32 0
120   %shamt.vec = shufflevector <vscale x 4 x i16> %shamt, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
121   %shl = shl <vscale x 4 x i16> %offset.ext, %shamt.vec
122   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i16(
123     <vscale x 4 x i32> undef,
124     <vscale x 4 x i32>* %ptr,
125     <vscale x 4 x i16> %shl,
126     i64 %vl)
127   ret <vscale x 4 x i32> %res
130 define <vscale x 4 x i32> @test_vloxei6(<vscale x 4 x i32>* %ptr, <vscale x 4 x i7> %offset, i64 %vl) {
131 ; CHECK-LABEL: test_vloxei6:
132 ; CHECK:       # %bb.0: # %entry
133 ; CHECK-NEXT:    li a2, 127
134 ; CHECK-NEXT:    vsetvli a3, zero, e8, mf2, ta, ma
135 ; CHECK-NEXT:    vand.vx v8, v8, a2
136 ; CHECK-NEXT:    vsetvli zero, zero, e64, m4, ta, ma
137 ; CHECK-NEXT:    vzext.vf8 v12, v8
138 ; CHECK-NEXT:    vsll.vi v12, v12, 4
139 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
140 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12
141 ; CHECK-NEXT:    ret
142 entry:
143   %offset.ext = zext <vscale x 4 x i7> %offset to <vscale x 4 x i64>
144   %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
145   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
146   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
147   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
148     <vscale x 4 x i32> undef,
149     <vscale x 4 x i32>* %ptr,
150     <vscale x 4 x i64> %shl,
151     i64 %vl)
152   ret <vscale x 4 x i32> %res
155 define <vscale x 4 x i32> @test_vloxei7(<vscale x 4 x i32>* %ptr, <vscale x 4 x i1> %offset, i64 %vl) {
156 ; CHECK-LABEL: test_vloxei7:
157 ; CHECK:       # %bb.0: # %entry
158 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
159 ; CHECK-NEXT:    vmv.v.i v8, 0
160 ; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
161 ; CHECK-NEXT:    vsll.vi v12, v8, 2
162 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
163 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12
164 ; CHECK-NEXT:    ret
165 entry:
166   %offset.ext = zext <vscale x 4 x i1> %offset to <vscale x 4 x i64>
167   %shamt = insertelement <vscale x 4 x i64> undef, i64 2, i32 0
168   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
169   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
170   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
171     <vscale x 4 x i32> undef,
172     <vscale x 4 x i32>* %ptr,
173     <vscale x 4 x i64> %shl,
174     i64 %vl)
175   ret <vscale x 4 x i32> %res
178 declare <vscale x 4 x i32> @llvm.riscv.vloxei.mask.nxv4i32.nxv4i64(
179   <vscale x 4 x i32>,
180   <vscale x 4 x i32>*,
181   <vscale x 4 x i64>,
182   <vscale x 4 x i1>,
183   i64,
184   i64);
186 define <vscale x 4 x i32> @test_vloxei_mask(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i64 %vl) {
187 ; CHECK-LABEL: test_vloxei_mask:
188 ; CHECK:       # %bb.0: # %entry
189 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
190 ; CHECK-NEXT:    vzext.vf8 v12, v8
191 ; CHECK-NEXT:    vsll.vi v12, v12, 4
192 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
193 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12, v0.t
194 ; CHECK-NEXT:    ret
195 entry:
196   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
197   %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
198   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
199   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
200   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.mask.nxv4i32.nxv4i64(
201     <vscale x 4 x i32> undef,
202     <vscale x 4 x i32>* %ptr,
203     <vscale x 4 x i64> %shl,
204     <vscale x 4 x i1> %m,
205     i64 %vl, i64 1)
206   ret <vscale x 4 x i32> %res
209 declare <vscale x 4 x i32> @llvm.riscv.vluxei.nxv4i32.nxv4i64(
210   <vscale x 4 x i32>,
211   <vscale x 4 x i32>*,
212   <vscale x 4 x i64>,
213   i64);
215 define <vscale x 4 x i32> @test_vluxei(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
216 ; CHECK-LABEL: test_vluxei:
217 ; CHECK:       # %bb.0: # %entry
218 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
219 ; CHECK-NEXT:    vzext.vf8 v12, v8
220 ; CHECK-NEXT:    vsll.vi v12, v12, 4
221 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
222 ; CHECK-NEXT:    vluxei64.v v8, (a0), v12
223 ; CHECK-NEXT:    ret
224 entry:
225   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
226   %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
227   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
228   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
229   %res = call <vscale x 4 x i32> @llvm.riscv.vluxei.nxv4i32.nxv4i64(
230     <vscale x 4 x i32> undef,
231     <vscale x 4 x i32>* %ptr,
232     <vscale x 4 x i64> %shl,
233     i64 %vl)
234   ret <vscale x 4 x i32> %res
237 declare <vscale x 4 x i32> @llvm.riscv.vluxei.mask.nxv4i32.nxv4i64(
238   <vscale x 4 x i32>,
239   <vscale x 4 x i32>*,
240   <vscale x 4 x i64>,
241   <vscale x 4 x i1>,
242   i64,
243   i64);
245 define <vscale x 4 x i32> @test_vluxei_mask(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i64 %vl) {
246 ; CHECK-LABEL: test_vluxei_mask:
247 ; CHECK:       # %bb.0: # %entry
248 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
249 ; CHECK-NEXT:    vzext.vf8 v12, v8
250 ; CHECK-NEXT:    vsll.vi v12, v12, 4
251 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
252 ; CHECK-NEXT:    vluxei64.v v8, (a0), v12, v0.t
253 ; CHECK-NEXT:    ret
254 entry:
255   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
256   %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
257   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
258   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
259   %res = call <vscale x 4 x i32> @llvm.riscv.vluxei.mask.nxv4i32.nxv4i64(
260     <vscale x 4 x i32> undef,
261     <vscale x 4 x i32>* %ptr,
262     <vscale x 4 x i64> %shl,
263     <vscale x 4 x i1> %m,
264     i64 %vl, i64 1)
265   ret <vscale x 4 x i32> %res
268 declare void @llvm.riscv.vsoxei.nxv4i32.nxv4i64(
269   <vscale x 4 x i32>,
270   <vscale x 4 x i32>*,
271   <vscale x 4 x i64>,
272   i64);
274 define void @test_vsoxei(<vscale x 4 x i32> %val, <vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
275 ; CHECK-LABEL: test_vsoxei:
276 ; CHECK:       # %bb.0: # %entry
277 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
278 ; CHECK-NEXT:    vzext.vf8 v12, v10
279 ; CHECK-NEXT:    vsll.vi v12, v12, 4
280 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
281 ; CHECK-NEXT:    vsoxei64.v v8, (a0), v12
282 ; CHECK-NEXT:    ret
283 entry:
284   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
285   %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
286   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
287   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
288   call void @llvm.riscv.vsoxei.nxv4i32.nxv4i64(
289     <vscale x 4 x i32> %val,
290     <vscale x 4 x i32>* %ptr,
291     <vscale x 4 x i64> %shl,
292     i64 %vl)
293   ret void
296 declare void @llvm.riscv.vsoxei.mask.nxv4i32.nxv4i64(
297   <vscale x 4 x i32>,
298   <vscale x 4 x i32>*,
299   <vscale x 4 x i64>,
300   <vscale x 4 x i1>,
301   i64);
303 define void @test_vsoxei_mask(<vscale x 4 x i32> %val, <vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i64 %vl) {
304 ; CHECK-LABEL: test_vsoxei_mask:
305 ; CHECK:       # %bb.0: # %entry
306 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
307 ; CHECK-NEXT:    vzext.vf8 v12, v10
308 ; CHECK-NEXT:    vsll.vi v12, v12, 4
309 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
310 ; CHECK-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
311 ; CHECK-NEXT:    ret
312 entry:
313   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
314   %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
315   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
316   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
317   call void @llvm.riscv.vsoxei.mask.nxv4i32.nxv4i64(
318     <vscale x 4 x i32> %val,
319     <vscale x 4 x i32>* %ptr,
320     <vscale x 4 x i64> %shl,
321     <vscale x 4 x i1> %m,
322     i64 %vl)
323   ret void
326 declare void @llvm.riscv.vsuxei.nxv4i32.nxv4i64(
327   <vscale x 4 x i32>,
328   <vscale x 4 x i32>*,
329   <vscale x 4 x i64>,
330   i64);
332 define void @test_vsuxei(<vscale x 4 x i32> %val, <vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
333 ; CHECK-LABEL: test_vsuxei:
334 ; CHECK:       # %bb.0: # %entry
335 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
336 ; CHECK-NEXT:    vzext.vf8 v12, v10
337 ; CHECK-NEXT:    vsll.vi v12, v12, 4
338 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
339 ; CHECK-NEXT:    vsuxei64.v v8, (a0), v12
340 ; CHECK-NEXT:    ret
341 entry:
342   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
343   %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
344   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
345   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
346   call void @llvm.riscv.vsuxei.nxv4i32.nxv4i64(
347     <vscale x 4 x i32> %val,
348     <vscale x 4 x i32>* %ptr,
349     <vscale x 4 x i64> %shl,
350     i64 %vl)
351   ret void
354 declare void @llvm.riscv.vsuxei.mask.nxv4i32.nxv4i64(
355   <vscale x 4 x i32>,
356   <vscale x 4 x i32>*,
357   <vscale x 4 x i64>,
358   <vscale x 4 x i1>,
359   i64);
361 define void @test_vsuxei_mask(<vscale x 4 x i32> %val, <vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i64 %vl) {
362 ; CHECK-LABEL: test_vsuxei_mask:
363 ; CHECK:       # %bb.0: # %entry
364 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
365 ; CHECK-NEXT:    vzext.vf8 v12, v10
366 ; CHECK-NEXT:    vsll.vi v12, v12, 4
367 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
368 ; CHECK-NEXT:    vsuxei64.v v8, (a0), v12, v0.t
369 ; CHECK-NEXT:    ret
370 entry:
371   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
372   %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
373   %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
374   %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
375   call void @llvm.riscv.vsuxei.mask.nxv4i32.nxv4i64(
376     <vscale x 4 x i32> %val,
377     <vscale x 4 x i32>* %ptr,
378     <vscale x 4 x i64> %shl,
379     <vscale x 4 x i1> %m,
380     i64 %vl)
381   ret void