Skip to content

Commit 04e54cc

Browse files
[RISCV][VLOPT] Add Vector Single-Width Averaging Add and Subtract to isSupportedInstr (#122351)
1 parent 24bf0e4 commit 04e54cc

File tree

2 files changed

+185
-0
lines changed

2 files changed

+185
-0
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -963,6 +963,15 @@ static bool isSupportedInstr(const MachineInstr &MI) {
963963
case RISCV::VMV_V_I:
964964
case RISCV::VMV_V_X:
965965
case RISCV::VMV_V_V:
966+
// Vector Single-Width Averaging Add and Subtract
967+
case RISCV::VAADDU_VV:
968+
case RISCV::VAADDU_VX:
969+
case RISCV::VAADD_VV:
970+
case RISCV::VAADD_VX:
971+
case RISCV::VASUBU_VV:
972+
case RISCV::VASUBU_VX:
973+
case RISCV::VASUB_VV:
974+
case RISCV::VASUB_VX:
966975

967976
// Vector Crypto
968977
case RISCV::VWSLL_VI:

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

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3595,3 +3595,179 @@ define <vscale x 4 x i32> @vmerge_vim(<vscale x 4 x i32> %a, <vscale x 4 x i1> %
35953595
%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> %1, iXLen %vl)
35963596
ret <vscale x 4 x i32> %2
35973597
}
3598+
3599+
define <vscale x 4 x i32> @vaadd_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
3600+
; NOVLOPT-LABEL: vaadd_vv:
3601+
; NOVLOPT: # %bb.0:
3602+
; NOVLOPT-NEXT: csrwi vxrm, 0
3603+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3604+
; NOVLOPT-NEXT: vaadd.vv v8, v8, v10
3605+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3606+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
3607+
; NOVLOPT-NEXT: ret
3608+
;
3609+
; VLOPT-LABEL: vaadd_vv:
3610+
; VLOPT: # %bb.0:
3611+
; VLOPT-NEXT: csrwi vxrm, 0
3612+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3613+
; VLOPT-NEXT: vaadd.vv v8, v8, v10
3614+
; VLOPT-NEXT: vadd.vv v8, v8, v10
3615+
; VLOPT-NEXT: ret
3616+
%1 = call <vscale x 4 x i32> @llvm.riscv.vaadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 0, iXLen -1)
3617+
%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)
3618+
ret <vscale x 4 x i32> %2
3619+
}
3620+
3621+
define <vscale x 4 x i32> @vaadd_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
3622+
; NOVLOPT-LABEL: vaadd_vx:
3623+
; NOVLOPT: # %bb.0:
3624+
; NOVLOPT-NEXT: csrwi vxrm, 0
3625+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3626+
; NOVLOPT-NEXT: vaadd.vx v10, v8, a0
3627+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3628+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
3629+
; NOVLOPT-NEXT: ret
3630+
;
3631+
; VLOPT-LABEL: vaadd_vx:
3632+
; VLOPT: # %bb.0:
3633+
; VLOPT-NEXT: csrwi vxrm, 0
3634+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3635+
; VLOPT-NEXT: vaadd.vx v10, v8, a0
3636+
; VLOPT-NEXT: vadd.vv v8, v10, v8
3637+
; VLOPT-NEXT: ret
3638+
%1 = call <vscale x 4 x i32> @llvm.riscv.vaadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen 0, iXLen -1)
3639+
%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)
3640+
ret <vscale x 4 x i32> %2
3641+
}
3642+
3643+
define <vscale x 4 x i32> @vasub_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
3644+
; NOVLOPT-LABEL: vasub_vv:
3645+
; NOVLOPT: # %bb.0:
3646+
; NOVLOPT-NEXT: csrwi vxrm, 0
3647+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3648+
; NOVLOPT-NEXT: vasub.vv v8, v8, v10
3649+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3650+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
3651+
; NOVLOPT-NEXT: ret
3652+
;
3653+
; VLOPT-LABEL: vasub_vv:
3654+
; VLOPT: # %bb.0:
3655+
; VLOPT-NEXT: csrwi vxrm, 0
3656+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3657+
; VLOPT-NEXT: vasub.vv v8, v8, v10
3658+
; VLOPT-NEXT: vadd.vv v8, v8, v10
3659+
; VLOPT-NEXT: ret
3660+
%1 = call <vscale x 4 x i32> @llvm.riscv.vasub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 0, iXLen -1)
3661+
%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)
3662+
ret <vscale x 4 x i32> %2
3663+
}
3664+
3665+
define <vscale x 4 x i32> @vasub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
3666+
; NOVLOPT-LABEL: vasub_vx:
3667+
; NOVLOPT: # %bb.0:
3668+
; NOVLOPT-NEXT: csrwi vxrm, 0
3669+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3670+
; NOVLOPT-NEXT: vasub.vx v10, v8, a0
3671+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3672+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
3673+
; NOVLOPT-NEXT: ret
3674+
;
3675+
; VLOPT-LABEL: vasub_vx:
3676+
; VLOPT: # %bb.0:
3677+
; VLOPT-NEXT: csrwi vxrm, 0
3678+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3679+
; VLOPT-NEXT: vasub.vx v10, v8, a0
3680+
; VLOPT-NEXT: vadd.vv v8, v10, v8
3681+
; VLOPT-NEXT: ret
3682+
%1 = call <vscale x 4 x i32> @llvm.riscv.vasub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen 0, iXLen -1)
3683+
%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)
3684+
ret <vscale x 4 x i32> %2
3685+
}
3686+
3687+
define <vscale x 4 x i32> @vaaddu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
3688+
; NOVLOPT-LABEL: vaaddu_vv:
3689+
; NOVLOPT: # %bb.0:
3690+
; NOVLOPT-NEXT: csrwi vxrm, 0
3691+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3692+
; NOVLOPT-NEXT: vaaddu.vv v8, v8, v10
3693+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3694+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
3695+
; NOVLOPT-NEXT: ret
3696+
;
3697+
; VLOPT-LABEL: vaaddu_vv:
3698+
; VLOPT: # %bb.0:
3699+
; VLOPT-NEXT: csrwi vxrm, 0
3700+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3701+
; VLOPT-NEXT: vaaddu.vv v8, v8, v10
3702+
; VLOPT-NEXT: vadd.vv v8, v8, v10
3703+
; VLOPT-NEXT: ret
3704+
%1 = call <vscale x 4 x i32> @llvm.riscv.vaaddu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 0, iXLen -1)
3705+
%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)
3706+
ret <vscale x 4 x i32> %2
3707+
}
3708+
3709+
define <vscale x 4 x i32> @vaaddu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
3710+
; NOVLOPT-LABEL: vaaddu_vx:
3711+
; NOVLOPT: # %bb.0:
3712+
; NOVLOPT-NEXT: csrwi vxrm, 0
3713+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3714+
; NOVLOPT-NEXT: vaaddu.vx v10, v8, a0
3715+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3716+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
3717+
; NOVLOPT-NEXT: ret
3718+
;
3719+
; VLOPT-LABEL: vaaddu_vx:
3720+
; VLOPT: # %bb.0:
3721+
; VLOPT-NEXT: csrwi vxrm, 0
3722+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3723+
; VLOPT-NEXT: vaaddu.vx v10, v8, a0
3724+
; VLOPT-NEXT: vadd.vv v8, v10, v8
3725+
; VLOPT-NEXT: ret
3726+
%1 = call <vscale x 4 x i32> @llvm.riscv.vaaddu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen 0, iXLen -1)
3727+
%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)
3728+
ret <vscale x 4 x i32> %2
3729+
}
3730+
3731+
define <vscale x 4 x i32> @vasubu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
3732+
; NOVLOPT-LABEL: vasubu_vv:
3733+
; NOVLOPT: # %bb.0:
3734+
; NOVLOPT-NEXT: csrwi vxrm, 0
3735+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3736+
; NOVLOPT-NEXT: vasubu.vv v8, v8, v10
3737+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3738+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
3739+
; NOVLOPT-NEXT: ret
3740+
;
3741+
; VLOPT-LABEL: vasubu_vv:
3742+
; VLOPT: # %bb.0:
3743+
; VLOPT-NEXT: csrwi vxrm, 0
3744+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3745+
; VLOPT-NEXT: vasubu.vv v8, v8, v10
3746+
; VLOPT-NEXT: vadd.vv v8, v8, v10
3747+
; VLOPT-NEXT: ret
3748+
%1 = call <vscale x 4 x i32> @llvm.riscv.vasubu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 0, iXLen -1)
3749+
%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)
3750+
ret <vscale x 4 x i32> %2
3751+
}
3752+
3753+
define <vscale x 4 x i32> @vasubu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
3754+
; NOVLOPT-LABEL: vasubu_vx:
3755+
; NOVLOPT: # %bb.0:
3756+
; NOVLOPT-NEXT: csrwi vxrm, 0
3757+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3758+
; NOVLOPT-NEXT: vasubu.vx v10, v8, a0
3759+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3760+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
3761+
; NOVLOPT-NEXT: ret
3762+
;
3763+
; VLOPT-LABEL: vasubu_vx:
3764+
; VLOPT: # %bb.0:
3765+
; VLOPT-NEXT: csrwi vxrm, 0
3766+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3767+
; VLOPT-NEXT: vasubu.vx v10, v8, a0
3768+
; VLOPT-NEXT: vadd.vv v8, v10, v8
3769+
; VLOPT-NEXT: ret
3770+
%1 = call <vscale x 4 x i32> @llvm.riscv.vasubu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen 0, iXLen -1)
3771+
%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)
3772+
ret <vscale x 4 x i32> %2
3773+
}

0 commit comments

Comments
 (0)