Skip to content

Commit 82e89c0

Browse files
[RISCV][VLOPT] Add support for 11.9 min/max instructions (#112198)
This adds support for these instructions and also tests getOperandInfo for these instructions as well.
1 parent 36a4055 commit 82e89c0

File tree

2 files changed

+166
-1
lines changed

2 files changed

+166
-1
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,14 @@ static bool isSupportedInstr(const MachineInstr &MI) {
536536
// 11.8 Vector Integer Compare Instructions
537537
// FIXME: Add support for 11.8 instructions
538538
// 11.9. Vector Integer Min/Max Instructions
539-
// FIXME: Add support for 11.9 instructions
539+
case RISCV::VMINU_VV:
540+
case RISCV::VMINU_VX:
541+
case RISCV::VMIN_VV:
542+
case RISCV::VMIN_VX:
543+
case RISCV::VMAXU_VV:
544+
case RISCV::VMAXU_VX:
545+
case RISCV::VMAX_VV:
546+
case RISCV::VMAX_VX:
540547
// 11.10. Vector Single-Width Integer Multiply Instructions
541548
case RISCV::VMUL_VV:
542549
case RISCV::VMUL_VX:

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

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,165 @@ define <vscale x 4 x i16> @vnsrl_wi(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b
642642
ret <vscale x 4 x i16> %2
643643
}
644644

645+
define <vscale x 4 x i32> @vminu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
646+
; NOVLOPT-LABEL: vminu_vv:
647+
; NOVLOPT: # %bb.0:
648+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
649+
; NOVLOPT-NEXT: vminu.vv v8, v8, v10
650+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
651+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
652+
; NOVLOPT-NEXT: ret
653+
;
654+
; VLOPT-LABEL: vminu_vv:
655+
; VLOPT: # %bb.0:
656+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
657+
; VLOPT-NEXT: vminu.vv v8, v8, v10
658+
; VLOPT-NEXT: vadd.vv v8, v8, v10
659+
; VLOPT-NEXT: ret
660+
%1 = call <vscale x 4 x i32> @llvm.riscv.vminu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
661+
%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)
662+
ret <vscale x 4 x i32> %2
663+
}
664+
665+
define <vscale x 4 x i32> @vminu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
666+
; NOVLOPT-LABEL: vminu_vx:
667+
; NOVLOPT: # %bb.0:
668+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
669+
; NOVLOPT-NEXT: vminu.vx v10, v8, a0
670+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
671+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
672+
; NOVLOPT-NEXT: ret
673+
;
674+
; VLOPT-LABEL: vminu_vx:
675+
; VLOPT: # %bb.0:
676+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
677+
; VLOPT-NEXT: vminu.vx v10, v8, a0
678+
; VLOPT-NEXT: vadd.vv v8, v10, v8
679+
; VLOPT-NEXT: ret
680+
%1 = call <vscale x 4 x i32> @llvm.riscv.vminu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
681+
%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)
682+
ret <vscale x 4 x i32> %2
683+
}
684+
685+
define <vscale x 4 x i32> @vmin_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
686+
; NOVLOPT-LABEL: vmin_vv:
687+
; NOVLOPT: # %bb.0:
688+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
689+
; NOVLOPT-NEXT: vmin.vv v8, v8, v10
690+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
691+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
692+
; NOVLOPT-NEXT: ret
693+
;
694+
; VLOPT-LABEL: vmin_vv:
695+
; VLOPT: # %bb.0:
696+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
697+
; VLOPT-NEXT: vmin.vv v8, v8, v10
698+
; VLOPT-NEXT: vadd.vv v8, v8, v10
699+
; VLOPT-NEXT: ret
700+
%1 = call <vscale x 4 x i32> @llvm.riscv.vmin.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
701+
%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)
702+
ret <vscale x 4 x i32> %2
703+
}
704+
705+
define <vscale x 4 x i32> @vmin_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
706+
; NOVLOPT-LABEL: vmin_vx:
707+
; NOVLOPT: # %bb.0:
708+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
709+
; NOVLOPT-NEXT: vmin.vx v10, v8, a0
710+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
711+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
712+
; NOVLOPT-NEXT: ret
713+
;
714+
; VLOPT-LABEL: vmin_vx:
715+
; VLOPT: # %bb.0:
716+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
717+
; VLOPT-NEXT: vmin.vx v10, v8, a0
718+
; VLOPT-NEXT: vadd.vv v8, v10, v8
719+
; VLOPT-NEXT: ret
720+
%1 = call <vscale x 4 x i32> @llvm.riscv.vmin.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
721+
%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)
722+
ret <vscale x 4 x i32> %2
723+
}
645724

725+
define <vscale x 4 x i32> @vmaxu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
726+
; NOVLOPT-LABEL: vmaxu_vv:
727+
; NOVLOPT: # %bb.0:
728+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
729+
; NOVLOPT-NEXT: vmaxu.vv v8, v8, v10
730+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
731+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
732+
; NOVLOPT-NEXT: ret
733+
;
734+
; VLOPT-LABEL: vmaxu_vv:
735+
; VLOPT: # %bb.0:
736+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
737+
; VLOPT-NEXT: vmaxu.vv v8, v8, v10
738+
; VLOPT-NEXT: vadd.vv v8, v8, v10
739+
; VLOPT-NEXT: ret
740+
%1 = call <vscale x 4 x i32> @llvm.riscv.vmaxu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
741+
%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)
742+
ret <vscale x 4 x i32> %2
743+
}
744+
745+
define <vscale x 4 x i32> @vmaxu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
746+
; NOVLOPT-LABEL: vmaxu_vx:
747+
; NOVLOPT: # %bb.0:
748+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
749+
; NOVLOPT-NEXT: vmaxu.vx v10, v8, a0
750+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
751+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
752+
; NOVLOPT-NEXT: ret
753+
;
754+
; VLOPT-LABEL: vmaxu_vx:
755+
; VLOPT: # %bb.0:
756+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
757+
; VLOPT-NEXT: vmaxu.vx v10, v8, a0
758+
; VLOPT-NEXT: vadd.vv v8, v10, v8
759+
; VLOPT-NEXT: ret
760+
%1 = call <vscale x 4 x i32> @llvm.riscv.vmaxu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
761+
%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)
762+
ret <vscale x 4 x i32> %2
763+
}
764+
765+
define <vscale x 4 x i32> @vmax_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
766+
; NOVLOPT-LABEL: vmax_vv:
767+
; NOVLOPT: # %bb.0:
768+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
769+
; NOVLOPT-NEXT: vmax.vv v8, v8, v10
770+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
771+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
772+
; NOVLOPT-NEXT: ret
773+
;
774+
; VLOPT-LABEL: vmax_vv:
775+
; VLOPT: # %bb.0:
776+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
777+
; VLOPT-NEXT: vmax.vv v8, v8, v10
778+
; VLOPT-NEXT: vadd.vv v8, v8, v10
779+
; VLOPT-NEXT: ret
780+
%1 = call <vscale x 4 x i32> @llvm.riscv.vmax.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
781+
%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)
782+
ret <vscale x 4 x i32> %2
783+
}
784+
785+
define <vscale x 4 x i32> @vmax_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
786+
; NOVLOPT-LABEL: vmax_vx:
787+
; NOVLOPT: # %bb.0:
788+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
789+
; NOVLOPT-NEXT: vmax.vx v10, v8, a0
790+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
791+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
792+
; NOVLOPT-NEXT: ret
793+
;
794+
; VLOPT-LABEL: vmax_vx:
795+
; VLOPT: # %bb.0:
796+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
797+
; VLOPT-NEXT: vmax.vx v10, v8, a0
798+
; VLOPT-NEXT: vadd.vv v8, v10, v8
799+
; VLOPT-NEXT: ret
800+
%1 = call <vscale x 4 x i32> @llvm.riscv.vmax.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
801+
%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)
802+
ret <vscale x 4 x i32> %2
803+
}
646804

647805
define <vscale x 4 x i32> @vmul_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
648806
; NOVLOPT-LABEL: vmul_vv:

0 commit comments

Comments
 (0)