Skip to content

Commit d72c5de

Browse files
author
git apple-llvm automerger
committed
Merge commit '5e31d4cdf2f5' from llvm.org/main into next
2 parents 354f1f2 + 5e31d4c commit d72c5de

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)