Skip to content

Commit 5e31d4c

Browse files
authored
[RISCV][VLOPT] Support v[f]slide1up.v{x,f} (#146716)
Similarly to #146710, for vslide1ups vl only determines the destination elements written to so we can safely reduce their AVL. We cannot do this for vslide1downs as the vl determines which lane the new element is to be inserted in, so some negative tests have been added.
1 parent 717899c commit 5e31d4c

File tree

2 files changed

+88
-1
lines changed

2 files changed

+88
-1
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1045,7 +1045,8 @@ static bool isSupportedInstr(const MachineInstr &MI) {
10451045
case RISCV::VSLIDEUP_VI:
10461046
case RISCV::VSLIDEDOWN_VX:
10471047
case RISCV::VSLIDEDOWN_VI:
1048-
// TODO: Handle v[f]slide1up, but not v[f]slide1down.
1048+
case RISCV::VSLIDE1UP_VX:
1049+
case RISCV::VFSLIDE1UP_VF:
10491050
// Vector Single-Width Floating-Point Add/Subtract Instructions
10501051
case RISCV::VFADD_VF:
10511052
case RISCV::VFADD_VV:

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

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3514,6 +3514,92 @@ define <vscale x 4 x i32> @vslidedown_vi(<vscale x 4 x i32> %a, iXLen %vl) {
35143514
ret <vscale x 4 x i32> %2
35153515
}
35163516

3517+
define <vscale x 4 x i32> @vslide1up_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) {
3518+
; NOVLOPT-LABEL: vslide1up_vx:
3519+
; NOVLOPT: # %bb.0:
3520+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3521+
; NOVLOPT-NEXT: vslide1up.vx v10, v8, a0
3522+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3523+
; NOVLOPT-NEXT: vadd.vv v8, v10, v10
3524+
; NOVLOPT-NEXT: ret
3525+
;
3526+
; VLOPT-LABEL: vslide1up_vx:
3527+
; VLOPT: # %bb.0:
3528+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3529+
; VLOPT-NEXT: vslide1up.vx v10, v8, a0
3530+
; VLOPT-NEXT: vadd.vv v8, v10, v10
3531+
; VLOPT-NEXT: ret
3532+
%1 = call <vscale x 4 x i32> @llvm.riscv.vslide1up(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1)
3533+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl)
3534+
ret <vscale x 4 x i32> %2
3535+
}
3536+
3537+
define <vscale x 4 x float> @vfslide1up_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3538+
; NOVLOPT-LABEL: vfslide1up_vf:
3539+
; NOVLOPT: # %bb.0:
3540+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3541+
; NOVLOPT-NEXT: vfslide1up.vf v10, v8, fa0
3542+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3543+
; NOVLOPT-NEXT: vfadd.vv v8, v10, v10
3544+
; NOVLOPT-NEXT: ret
3545+
;
3546+
; VLOPT-LABEL: vfslide1up_vf:
3547+
; VLOPT: # %bb.0:
3548+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3549+
; VLOPT-NEXT: vfslide1up.vf v10, v8, fa0
3550+
; VLOPT-NEXT: vfadd.vv v8, v10, v10
3551+
; VLOPT-NEXT: ret
3552+
%1 = call <vscale x 4 x float> @llvm.riscv.vfslide1up(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen -1)
3553+
%2 = call <vscale x 4 x float> @llvm.riscv.vfadd(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %1, iXLen 7, iXLen %vl)
3554+
ret <vscale x 4 x float> %2
3555+
}
3556+
3557+
; Negative test – not safe to reduce vl
3558+
3559+
define <vscale x 4 x i32> @vslide1down_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) {
3560+
; NOVLOPT-LABEL: vslide1down_vx:
3561+
; NOVLOPT: # %bb.0:
3562+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3563+
; NOVLOPT-NEXT: vslide1down.vx v8, v8, a0
3564+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3565+
; NOVLOPT-NEXT: vadd.vv v8, v8, v8
3566+
; NOVLOPT-NEXT: ret
3567+
;
3568+
; VLOPT-LABEL: vslide1down_vx:
3569+
; VLOPT: # %bb.0:
3570+
; VLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3571+
; VLOPT-NEXT: vslide1down.vx v8, v8, a0
3572+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3573+
; VLOPT-NEXT: vadd.vv v8, v8, v8
3574+
; VLOPT-NEXT: ret
3575+
%1 = call <vscale x 4 x i32> @llvm.riscv.vslide1down(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1)
3576+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl)
3577+
ret <vscale x 4 x i32> %2
3578+
}
3579+
3580+
; Negative test – not safe to reduce vl
3581+
3582+
define <vscale x 4 x float> @vfslide1down_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3583+
; NOVLOPT-LABEL: vfslide1down_vf:
3584+
; NOVLOPT: # %bb.0:
3585+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3586+
; NOVLOPT-NEXT: vfslide1down.vf v8, v8, fa0
3587+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3588+
; NOVLOPT-NEXT: vfadd.vv v8, v8, v8
3589+
; NOVLOPT-NEXT: ret
3590+
;
3591+
; VLOPT-LABEL: vfslide1down_vf:
3592+
; VLOPT: # %bb.0:
3593+
; VLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3594+
; VLOPT-NEXT: vfslide1down.vf v8, v8, fa0
3595+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3596+
; VLOPT-NEXT: vfadd.vv v8, v8, v8
3597+
; VLOPT-NEXT: ret
3598+
%1 = call <vscale x 4 x float> @llvm.riscv.vfslide1down(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen -1)
3599+
%2 = call <vscale x 4 x float> @llvm.riscv.vfadd(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %1, iXLen 7, iXLen %vl)
3600+
ret <vscale x 4 x float> %2
3601+
}
3602+
35173603
define <vscale x 4 x float> @vfadd_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
35183604
; NOVLOPT-LABEL: vfadd_vv:
35193605
; NOVLOPT: # %bb.0:

0 commit comments

Comments
 (0)