Skip to content

File tree

2 files changed

+403
-25
lines changed

2 files changed

+403
-25
lines changed
 

‎llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

+21-5
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,26 @@ static bool isSupportedInstr(const MachineInstr &MI) {
499499
case RISCV::VSUB_VX:
500500
case RISCV::VRSUB_VI:
501501
case RISCV::VRSUB_VX:
502+
// Vector Bitwise Logical Instructions
503+
// Vector Single-Width Shift Instructions
504+
case RISCV::VAND_VI:
505+
case RISCV::VAND_VV:
506+
case RISCV::VAND_VX:
507+
case RISCV::VOR_VI:
508+
case RISCV::VOR_VV:
509+
case RISCV::VOR_VX:
510+
case RISCV::VXOR_VI:
511+
case RISCV::VXOR_VV:
512+
case RISCV::VXOR_VX:
513+
case RISCV::VSLL_VI:
514+
case RISCV::VSLL_VV:
515+
case RISCV::VSLL_VX:
516+
case RISCV::VSRL_VI:
517+
case RISCV::VSRL_VV:
518+
case RISCV::VSRL_VX:
519+
case RISCV::VSRA_VI:
520+
case RISCV::VSRA_VV:
521+
case RISCV::VSRA_VX:
502522
// Vector Widening Integer Add/Subtract
503523
case RISCV::VWADDU_VV:
504524
case RISCV::VWADDU_VX:
@@ -525,11 +545,6 @@ static bool isSupportedInstr(const MachineInstr &MI) {
525545
case RISCV::VSEXT_VF8:
526546
// Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions
527547
// FIXME: Add support
528-
// Vector Bitwise Logical Instructions
529-
// FIXME: Add support
530-
// Vector Single-Width Shift Instructions
531-
// FIXME: Add support
532-
case RISCV::VSLL_VI:
533548
// Vector Narrowing Integer Right Shift Instructions
534549
// FIXME: Add support
535550
case RISCV::VNSRL_WI:
@@ -592,6 +607,7 @@ static bool isSupportedInstr(const MachineInstr &MI) {
592607
// FIXME: Add support
593608
case RISCV::VMV_V_I:
594609
case RISCV::VMV_V_X:
610+
case RISCV::VMV_V_V:
595611

596612
// Vector Crypto
597613
case RISCV::VWSLL_VI:

‎llvm/test/CodeGen/RISCV/rvv/vl-opt-instrs.ll

+382-20
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,246 @@ define <vscale x 4 x i32> @vrsub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
146146
ret <vscale x 4 x i32> %2
147147
}
148148

149+
define <vscale x 4 x i32> @vand_vi(<vscale x 4 x i32> %a, iXLen %vl) {
150+
; NOVLOPT-LABEL: vand_vi:
151+
; NOVLOPT: # %bb.0:
152+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
153+
; NOVLOPT-NEXT: vand.vi v10, v8, 5
154+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
155+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
156+
; NOVLOPT-NEXT: ret
157+
;
158+
; VLOPT-LABEL: vand_vi:
159+
; VLOPT: # %bb.0:
160+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
161+
; VLOPT-NEXT: vand.vi v10, v8, 5
162+
; VLOPT-NEXT: vadd.vv v8, v10, v8
163+
; VLOPT-NEXT: ret
164+
%1 = call <vscale x 4 x i32> @llvm.riscv.vand.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1)
165+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
166+
ret <vscale x 4 x i32> %2
167+
}
168+
169+
define <vscale x 4 x i32> @vand_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
170+
; NOVLOPT-LABEL: vand_vv:
171+
; NOVLOPT: # %bb.0:
172+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
173+
; NOVLOPT-NEXT: vand.vv v8, v8, v10
174+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
175+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
176+
; NOVLOPT-NEXT: ret
177+
;
178+
; VLOPT-LABEL: vand_vv:
179+
; VLOPT: # %bb.0:
180+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
181+
; VLOPT-NEXT: vand.vv v8, v8, v10
182+
; VLOPT-NEXT: vadd.vv v8, v8, v10
183+
; VLOPT-NEXT: ret
184+
%1 = call <vscale x 4 x i32> @llvm.riscv.vand.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
185+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
186+
ret <vscale x 4 x i32> %2
187+
}
188+
189+
define <vscale x 4 x i32> @vand_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
190+
; NOVLOPT-LABEL: vand_vx:
191+
; NOVLOPT: # %bb.0:
192+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
193+
; NOVLOPT-NEXT: vand.vx v10, v8, a0
194+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
195+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
196+
; NOVLOPT-NEXT: ret
197+
;
198+
; VLOPT-LABEL: vand_vx:
199+
; VLOPT: # %bb.0:
200+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
201+
; VLOPT-NEXT: vand.vx v10, v8, a0
202+
; VLOPT-NEXT: vadd.vv v8, v10, v8
203+
; VLOPT-NEXT: ret
204+
%1 = call <vscale x 4 x i32> @llvm.riscv.vand.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
205+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
206+
ret <vscale x 4 x i32> %2
207+
}
208+
209+
define <vscale x 4 x i32> @vor_vi(<vscale x 4 x i32> %a, iXLen %vl) {
210+
; NOVLOPT-LABEL: vor_vi:
211+
; NOVLOPT: # %bb.0:
212+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
213+
; NOVLOPT-NEXT: vor.vi v10, v8, 5
214+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
215+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
216+
; NOVLOPT-NEXT: ret
217+
;
218+
; VLOPT-LABEL: vor_vi:
219+
; VLOPT: # %bb.0:
220+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
221+
; VLOPT-NEXT: vor.vi v10, v8, 5
222+
; VLOPT-NEXT: vadd.vv v8, v10, v8
223+
; VLOPT-NEXT: ret
224+
%1 = call <vscale x 4 x i32> @llvm.riscv.vor.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1)
225+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
226+
ret <vscale x 4 x i32> %2
227+
}
228+
229+
define <vscale x 4 x i32> @vor_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
230+
; NOVLOPT-LABEL: vor_vv:
231+
; NOVLOPT: # %bb.0:
232+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
233+
; NOVLOPT-NEXT: vor.vv v8, v8, v10
234+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
235+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
236+
; NOVLOPT-NEXT: ret
237+
;
238+
; VLOPT-LABEL: vor_vv:
239+
; VLOPT: # %bb.0:
240+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
241+
; VLOPT-NEXT: vor.vv v8, v8, v10
242+
; VLOPT-NEXT: vadd.vv v8, v8, v10
243+
; VLOPT-NEXT: ret
244+
%1 = call <vscale x 4 x i32> @llvm.riscv.vor.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
245+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
246+
ret <vscale x 4 x i32> %2
247+
}
248+
249+
define <vscale x 4 x i32> @vor_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
250+
; NOVLOPT-LABEL: vor_vx:
251+
; NOVLOPT: # %bb.0:
252+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
253+
; NOVLOPT-NEXT: vor.vx v10, v8, a0
254+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
255+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
256+
; NOVLOPT-NEXT: ret
257+
;
258+
; VLOPT-LABEL: vor_vx:
259+
; VLOPT: # %bb.0:
260+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
261+
; VLOPT-NEXT: vor.vx v10, v8, a0
262+
; VLOPT-NEXT: vadd.vv v8, v10, v8
263+
; VLOPT-NEXT: ret
264+
%1 = call <vscale x 4 x i32> @llvm.riscv.vor.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
265+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
266+
ret <vscale x 4 x i32> %2
267+
}
268+
269+
define <vscale x 4 x i32> @vxor_vi(<vscale x 4 x i32> %a, iXLen %vl) {
270+
; NOVLOPT-LABEL: vxor_vi:
271+
; NOVLOPT: # %bb.0:
272+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
273+
; NOVLOPT-NEXT: vxor.vi v10, v8, 5
274+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
275+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
276+
; NOVLOPT-NEXT: ret
277+
;
278+
; VLOPT-LABEL: vxor_vi:
279+
; VLOPT: # %bb.0:
280+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
281+
; VLOPT-NEXT: vxor.vi v10, v8, 5
282+
; VLOPT-NEXT: vadd.vv v8, v10, v8
283+
; VLOPT-NEXT: ret
284+
%1 = call <vscale x 4 x i32> @llvm.riscv.vxor.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1)
285+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
286+
ret <vscale x 4 x i32> %2
287+
}
288+
289+
define <vscale x 4 x i32> @vxor_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
290+
; NOVLOPT-LABEL: vxor_vv:
291+
; NOVLOPT: # %bb.0:
292+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
293+
; NOVLOPT-NEXT: vxor.vv v8, v8, v10
294+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
295+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
296+
; NOVLOPT-NEXT: ret
297+
;
298+
; VLOPT-LABEL: vxor_vv:
299+
; VLOPT: # %bb.0:
300+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
301+
; VLOPT-NEXT: vxor.vv v8, v8, v10
302+
; VLOPT-NEXT: vadd.vv v8, v8, v10
303+
; VLOPT-NEXT: ret
304+
%1 = call <vscale x 4 x i32> @llvm.riscv.vxor.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
305+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
306+
ret <vscale x 4 x i32> %2
307+
}
308+
309+
define <vscale x 4 x i32> @vxor_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
310+
; NOVLOPT-LABEL: vxor_vx:
311+
; NOVLOPT: # %bb.0:
312+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
313+
; NOVLOPT-NEXT: vxor.vx v10, v8, a0
314+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
315+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
316+
; NOVLOPT-NEXT: ret
317+
;
318+
; VLOPT-LABEL: vxor_vx:
319+
; VLOPT: # %bb.0:
320+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
321+
; VLOPT-NEXT: vxor.vx v10, v8, a0
322+
; VLOPT-NEXT: vadd.vv v8, v10, v8
323+
; VLOPT-NEXT: ret
324+
%1 = call <vscale x 4 x i32> @llvm.riscv.vxor.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
325+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
326+
ret <vscale x 4 x i32> %2
327+
}
328+
329+
define <vscale x 4 x i32> @vsll_vi(<vscale x 4 x i32> %a, iXLen %vl) {
330+
; NOVLOPT-LABEL: vsll_vi:
331+
; NOVLOPT: # %bb.0:
332+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
333+
; NOVLOPT-NEXT: vsll.vi v10, v8, 5
334+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
335+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
336+
; NOVLOPT-NEXT: ret
337+
;
338+
; VLOPT-LABEL: vsll_vi:
339+
; VLOPT: # %bb.0:
340+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
341+
; VLOPT-NEXT: vsll.vi v10, v8, 5
342+
; VLOPT-NEXT: vadd.vv v8, v10, v8
343+
; VLOPT-NEXT: ret
344+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
345+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
346+
ret <vscale x 4 x i32> %2
347+
}
348+
349+
define <vscale x 4 x i32> @vsll_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
350+
; NOVLOPT-LABEL: vsll_vv:
351+
; NOVLOPT: # %bb.0:
352+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
353+
; NOVLOPT-NEXT: vsll.vv v8, v8, v10
354+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
355+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
356+
; NOVLOPT-NEXT: ret
357+
;
358+
; VLOPT-LABEL: vsll_vv:
359+
; VLOPT: # %bb.0:
360+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
361+
; VLOPT-NEXT: vsll.vv v8, v8, v10
362+
; VLOPT-NEXT: vadd.vv v8, v8, v10
363+
; VLOPT-NEXT: ret
364+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
365+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
366+
ret <vscale x 4 x i32> %2
367+
}
368+
369+
define <vscale x 4 x i32> @vsll_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) {
370+
; NOVLOPT-LABEL: vsll_vx:
371+
; NOVLOPT: # %bb.0:
372+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
373+
; NOVLOPT-NEXT: vsll.vx v10, v8, a0
374+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
375+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
376+
; NOVLOPT-NEXT: ret
377+
;
378+
; VLOPT-LABEL: vsll_vx:
379+
; VLOPT: # %bb.0:
380+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
381+
; VLOPT-NEXT: vsll.vx v10, v8, a0
382+
; VLOPT-NEXT: vadd.vv v8, v10, v8
383+
; VLOPT-NEXT: ret
384+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1)
385+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
386+
ret <vscale x 4 x i32> %2
387+
}
388+
149389
define <vscale x 4 x i64> @vwaddu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
150390
; NOVLOPT-LABEL: vwaddu_vv:
151391
; NOVLOPT: # %bb.0:
@@ -167,6 +407,126 @@ define <vscale x 4 x i64> @vwaddu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %
167407
ret <vscale x 4 x i64> %2
168408
}
169409

410+
define <vscale x 4 x i32> @vsrl_vi(<vscale x 4 x i32> %a, iXLen %vl) {
411+
; NOVLOPT-LABEL: vsrl_vi:
412+
; NOVLOPT: # %bb.0:
413+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
414+
; NOVLOPT-NEXT: vsrl.vi v10, v8, 5
415+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
416+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
417+
; NOVLOPT-NEXT: ret
418+
;
419+
; VLOPT-LABEL: vsrl_vi:
420+
; VLOPT: # %bb.0:
421+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
422+
; VLOPT-NEXT: vsrl.vi v10, v8, 5
423+
; VLOPT-NEXT: vadd.vv v8, v10, v8
424+
; VLOPT-NEXT: ret
425+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsrl.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
426+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
427+
ret <vscale x 4 x i32> %2
428+
}
429+
430+
define <vscale x 4 x i32> @vsrl_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
431+
; NOVLOPT-LABEL: vsrl_vv:
432+
; NOVLOPT: # %bb.0:
433+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
434+
; NOVLOPT-NEXT: vsrl.vv v8, v8, v10
435+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
436+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
437+
; NOVLOPT-NEXT: ret
438+
;
439+
; VLOPT-LABEL: vsrl_vv:
440+
; VLOPT: # %bb.0:
441+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
442+
; VLOPT-NEXT: vsrl.vv v8, v8, v10
443+
; VLOPT-NEXT: vadd.vv v8, v8, v10
444+
; VLOPT-NEXT: ret
445+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsrl.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
446+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
447+
ret <vscale x 4 x i32> %2
448+
}
449+
450+
define <vscale x 4 x i32> @vsrl_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) {
451+
; NOVLOPT-LABEL: vsrl_vx:
452+
; NOVLOPT: # %bb.0:
453+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
454+
; NOVLOPT-NEXT: vsrl.vx v10, v8, a0
455+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
456+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
457+
; NOVLOPT-NEXT: ret
458+
;
459+
; VLOPT-LABEL: vsrl_vx:
460+
; VLOPT: # %bb.0:
461+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
462+
; VLOPT-NEXT: vsrl.vx v10, v8, a0
463+
; VLOPT-NEXT: vadd.vv v8, v10, v8
464+
; VLOPT-NEXT: ret
465+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsrl.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1)
466+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
467+
ret <vscale x 4 x i32> %2
468+
}
469+
470+
define <vscale x 4 x i32> @vsra_vi(<vscale x 4 x i32> %a, iXLen %vl) {
471+
; NOVLOPT-LABEL: vsra_vi:
472+
; NOVLOPT: # %bb.0:
473+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
474+
; NOVLOPT-NEXT: vsra.vi v10, v8, 5
475+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
476+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
477+
; NOVLOPT-NEXT: ret
478+
;
479+
; VLOPT-LABEL: vsra_vi:
480+
; VLOPT: # %bb.0:
481+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
482+
; VLOPT-NEXT: vsra.vi v10, v8, 5
483+
; VLOPT-NEXT: vadd.vv v8, v10, v8
484+
; VLOPT-NEXT: ret
485+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsra.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
486+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
487+
ret <vscale x 4 x i32> %2
488+
}
489+
490+
define <vscale x 4 x i32> @vsra_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
491+
; NOVLOPT-LABEL: vsra_vv:
492+
; NOVLOPT: # %bb.0:
493+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
494+
; NOVLOPT-NEXT: vsra.vv v8, v8, v10
495+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
496+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
497+
; NOVLOPT-NEXT: ret
498+
;
499+
; VLOPT-LABEL: vsra_vv:
500+
; VLOPT: # %bb.0:
501+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
502+
; VLOPT-NEXT: vsra.vv v8, v8, v10
503+
; VLOPT-NEXT: vadd.vv v8, v8, v10
504+
; VLOPT-NEXT: ret
505+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsra.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
506+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
507+
ret <vscale x 4 x i32> %2
508+
}
509+
510+
define <vscale x 4 x i32> @vsra_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) {
511+
; NOVLOPT-LABEL: vsra_vx:
512+
; NOVLOPT: # %bb.0:
513+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
514+
; NOVLOPT-NEXT: vsra.vx v10, v8, a0
515+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
516+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
517+
; NOVLOPT-NEXT: ret
518+
;
519+
; VLOPT-LABEL: vsra_vx:
520+
; VLOPT: # %bb.0:
521+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
522+
; VLOPT-NEXT: vsra.vx v10, v8, a0
523+
; VLOPT-NEXT: vadd.vv v8, v10, v8
524+
; VLOPT-NEXT: ret
525+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsra.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1)
526+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
527+
ret <vscale x 4 x i32> %2
528+
}
529+
170530
define <vscale x 4 x i64> @vwaddu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
171531
; NOVLOPT-LABEL: vwaddu_vx:
172532
; NOVLOPT: # %bb.0:
@@ -602,26 +962,6 @@ define <vscale x 4 x i64> @vzext_vf8(<vscale x 4 x i8> %a, <vscale x 4 x i64> %b
602962
ret <vscale x 4 x i64> %2
603963
}
604964

605-
define <vscale x 4 x i32> @vsll_vi(<vscale x 4 x i32> %a, iXLen %vl) {
606-
; NOVLOPT-LABEL: vsll_vi:
607-
; NOVLOPT: # %bb.0:
608-
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
609-
; NOVLOPT-NEXT: vsll.vi v10, v8, 5
610-
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
611-
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
612-
; NOVLOPT-NEXT: ret
613-
;
614-
; VLOPT-LABEL: vsll_vi:
615-
; VLOPT: # %bb.0:
616-
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
617-
; VLOPT-NEXT: vsll.vi v10, v8, 5
618-
; VLOPT-NEXT: vadd.vv v8, v10, v8
619-
; VLOPT-NEXT: ret
620-
%1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
621-
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
622-
ret <vscale x 4 x i32> %2
623-
}
624-
625965
define <vscale x 4 x i16> @vnsrl_wi(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %vl) {
626966
; NOVLOPT-LABEL: vnsrl_wi:
627967
; NOVLOPT: # %bb.0:
@@ -1611,6 +1951,28 @@ define <vscale x 4 x i32> @vmv_v_x(<vscale x 4 x i32> %a, i32 %x, iXLen %vl) {
16111951
ret <vscale x 4 x i32> %2
16121952
}
16131953

1954+
; The vmv.v.v is optimized away if we use a vadd as the user.
1955+
define <vscale x 1 x i8> @vmv_v_v(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, iXLen %vl) {
1956+
; NOVLOPT-LABEL: vmv_v_v:
1957+
; NOVLOPT: # %bb.0:
1958+
; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, tu, ma
1959+
; NOVLOPT-NEXT: vmv.v.v v8, v9
1960+
; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
1961+
; NOVLOPT-NEXT: vmerge.vvm v8, v8, v10, v0
1962+
; NOVLOPT-NEXT: ret
1963+
;
1964+
; VLOPT-LABEL: vmv_v_v:
1965+
; VLOPT: # %bb.0:
1966+
; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, tu, ma
1967+
; VLOPT-NEXT: vmv.v.v v8, v9
1968+
; VLOPT-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
1969+
; VLOPT-NEXT: vmerge.vvm v8, v8, v10, v0
1970+
; VLOPT-NEXT: ret
1971+
%2 = call <vscale x 1 x i8> @llvm.riscv.vmv.v.v.nxv1i8.nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, iXLen -1)
1972+
%3 = call <vscale x 1 x i8> @llvm.riscv.vmerge.nxv1i8.nxv1i8(<vscale x 1 x i8> undef, <vscale x 1 x i8> %2, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, iXLen %vl)
1973+
ret <vscale x 1 x i8> %3
1974+
}
1975+
16141976
define <vscale x 4 x i32> @vwsll_vi(<vscale x 4 x i16> %a, <vscale x 4 x i32> %b, iXLen %vl) {
16151977
; NOVLOPT-LABEL: vwsll_vi:
16161978
; NOVLOPT: # %bb.0:

0 commit comments

Comments
 (0)
Please sign in to comment.