@@ -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+
35173603define <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