diff --git a/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-masked-vops.ll b/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-masked-vops.ll --- a/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-masked-vops.ll +++ b/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-masked-vops.ll @@ -93,3 +93,62 @@ } declare @llvm.riscv.vle.mask.nxv2i32(, *, , i64, i64) +declare @llvm.riscv.vslideup.mask.nxv2i32(, , i64, , i64, i64) +define @vpmerge_vslideup( %passthru, %v, i64 %x, %m, i64 %vl) { +; CHECK-LABEL: vpmerge_vslideup: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a1, e32, m1, tu, mu +; CHECK-NEXT: vmv1r.v v10, v8 +; CHECK-NEXT: vslideup.vx v10, v9, a0, v0.t +; CHECK-NEXT: vmv.v.v v8, v10 +; CHECK-NEXT: ret + %a = call @llvm.riscv.vslideup.mask.nxv2i32( %passthru, %v, i64 %x, %m, i64 %vl, i64 0) + %splat = insertelement poison, i1 -1, i32 0 + %mask = shufflevector %splat, poison, zeroinitializer + %b = call @llvm.riscv.vmerge.nxv2i32.nxv2i32( %passthru, %passthru, %a, %mask, i64 %vl) + ret %b +} + +declare @llvm.riscv.vslidedown.mask.nxv2i32(, , i64, , i64, i64) +define @vpmerge_vslidedown( %passthru, %v, i64 %x, %m, i64 %vl) { +; CHECK-LABEL: vpmerge_vslidedown: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a1, e32, m1, tu, mu +; CHECK-NEXT: vmv1r.v v10, v8 +; CHECK-NEXT: vslidedown.vx v10, v9, a0, v0.t +; CHECK-NEXT: vmv.v.v v8, v10 +; CHECK-NEXT: ret + %a = call @llvm.riscv.vslidedown.mask.nxv2i32( %passthru, %v, i64 %x, %m, i64 %vl, i64 0) + %splat = insertelement poison, i1 -1, i32 0 + %mask = shufflevector %splat, poison, zeroinitializer + %b = call @llvm.riscv.vmerge.nxv2i32.nxv2i32( %passthru, %passthru, %a, %mask, i64 %vl) + ret %b +} + +declare @llvm.riscv.vslide1up.mask.nxv2i32(, , i32, , i64, i64) +define @vpmerge_vslide1up( %passthru, %v, i32 %x, %m, i64 %vl) { +; CHECK-LABEL: vpmerge_vslide1up: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a1, e32, m1, tu, mu +; CHECK-NEXT: vslide1up.vx v8, v9, a0, v0.t +; CHECK-NEXT: ret + %a = call @llvm.riscv.vslide1up.mask.nxv2i32( %passthru, %v, i32 %x, %m, i64 %vl, i64 0) + %splat = insertelement poison, i1 -1, i32 0 + %mask = shufflevector %splat, poison, zeroinitializer + %b = call @llvm.riscv.vmerge.nxv2i32.nxv2i32( %passthru, %passthru, %a, %mask, i64 %vl) + ret %b +} + +declare @llvm.riscv.vslide1down.mask.nxv2i32(, , i32, , i64, i64) +define @vpmerge_vslide1down( %passthru, %v, i32 %x, %m, i64 %vl) { +; CHECK-LABEL: vpmerge_vslide1down: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a1, e32, m1, tu, mu +; CHECK-NEXT: vslide1down.vx v8, v9, a0, v0.t +; CHECK-NEXT: ret + %a = call @llvm.riscv.vslide1down.mask.nxv2i32( %passthru, %v, i32 %x, %m, i64 %vl, i64 0) + %splat = insertelement poison, i1 -1, i32 0 + %mask = shufflevector %splat, poison, zeroinitializer + %b = call @llvm.riscv.vmerge.nxv2i32.nxv2i32( %passthru, %passthru, %a, %mask, i64 %vl) + ret %b +} diff --git a/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-vops.ll b/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-vops.ll --- a/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-vops.ll +++ b/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-vops.ll @@ -746,6 +746,61 @@ ret %b } +; Test slides +declare @llvm.riscv.vslideup.nxv2i32(, , i64, i64, i64) +define @vpselect_vslideup( %passthru, %v, i64 %x, %m, i32 zeroext %vl) { +; CHECK-LABEL: vpselect_vslideup: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma +; CHECK-NEXT: vslideup.vx v10, v9, a0 +; CHECK-NEXT: vmerge.vvm v8, v8, v10, v0 +; CHECK-NEXT: ret + %1 = zext i32 %vl to i64 + %a = call @llvm.riscv.vslideup.nxv2i32( undef, %v, i64 %x, i64 %1, i64 0) + %b = call @llvm.vp.select.nxv2i32( %m, %a, %passthru, i32 %vl) + ret %b +} + +declare @llvm.riscv.vslidedown.nxv2i32(, , i64, i64, i64) +define @vpselect_vslidedown( %passthru, %v, i64 %x, %m, i32 zeroext %vl) { +; CHECK-LABEL: vpselect_vslidedown: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma +; CHECK-NEXT: vslidedown.vx v9, v9, a0 +; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0 +; CHECK-NEXT: ret + %1 = zext i32 %vl to i64 + %a = call @llvm.riscv.vslidedown.nxv2i32( undef, %v, i64 %x, i64 %1, i64 0) + %b = call @llvm.vp.select.nxv2i32( %m, %a, %passthru, i32 %vl) + ret %b +} + +declare @llvm.riscv.vslide1up.nxv2i32.i32(, , i32, i64) +define @vpselect_vslide1up( %passthru, %v, i32 %x, %m, i32 zeroext %vl) { +; CHECK-LABEL: vpselect_vslide1up: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, mu +; CHECK-NEXT: vslide1up.vx v8, v9, a0, v0.t +; CHECK-NEXT: ret + %1 = zext i32 %vl to i64 + %a = call @llvm.riscv.vslide1up.nxv2i32.i32( undef, %v, i32 %x, i64 %1) + %b = call @llvm.vp.select.nxv2i32( %m, %a, %passthru, i32 %vl) + ret %b +} + +declare @llvm.riscv.vslide1down.nxv2i32.i32(, , i32, i64) +define @vpselect_vslide1down( %passthru, %v, i32 %x, %m, i32 zeroext %vl) { +; CHECK-LABEL: vpselect_vslide1down: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, mu +; CHECK-NEXT: vslide1down.vx v8, v9, a0, v0.t +; CHECK-NEXT: ret + %1 = zext i32 %vl to i64 + %a = call @llvm.riscv.vslide1down.nxv2i32.i32( undef, %v, i32 %x, i64 %1) + %b = call @llvm.vp.select.nxv2i32( %m, %a, %passthru, i32 %vl) + ret %b +} + ; Test vector operations with VLMAX vector length. ; Test binary operator with vp.select and add.