Skip to content

Commit 596640a

Browse files
authored
[RISCV] Fold vmv.v.v into vmerge (#151341)
We support folding vmv.v.v into its source via the foldVMV_V_V peephole, but currently it requires that the source has a policy operand. PseudoVMERGEs (as well as add-with-carry/subtract-with-borrow pseudos) don't have a policy operand, and instead just seem to derive TA/TU from whether or not the passthru is undef, since the mask policy doesn't affect them. This patch allows pseudos without policy operands, given that if there's no policy operand then it will default to TU when the passthru is undefined which should be conservatively correct. I previously tried adding a policy operand to vmerge/vadc etc., but this ended up being a lot of churn. This removes a bunch of redundant vmv.v.vs that I noticed with EVL tail folding on llvm-test-suite.
1 parent 19f3aca commit 596640a

File tree

4 files changed

+38
-12
lines changed

4 files changed

+38
-12
lines changed

llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -646,8 +646,7 @@ bool RISCVVectorPeephole::foldVMV_V_V(MachineInstr &MI) {
646646
if (!Src || Src->hasUnmodeledSideEffects() ||
647647
Src->getParent() != MI.getParent() ||
648648
!RISCVII::isFirstDefTiedToFirstUse(Src->getDesc()) ||
649-
!RISCVII::hasVLOp(Src->getDesc().TSFlags) ||
650-
!RISCVII::hasVecPolicyOp(Src->getDesc().TSFlags))
649+
!RISCVII::hasVLOp(Src->getDesc().TSFlags))
651650
return false;
652651

653652
// Src's dest needs to have the same EEW as MI's input.
@@ -681,12 +680,14 @@ bool RISCVVectorPeephole::foldVMV_V_V(MachineInstr &MI) {
681680
*Src->getParent()->getParent()));
682681
}
683682

684-
// If MI was tail agnostic and the VL didn't increase, preserve it.
685-
int64_t Policy = RISCVVType::TAIL_UNDISTURBED_MASK_UNDISTURBED;
686-
if ((MI.getOperand(5).getImm() & RISCVVType::TAIL_AGNOSTIC) &&
687-
RISCV::isVLKnownLE(MI.getOperand(3), SrcVL))
688-
Policy |= RISCVVType::TAIL_AGNOSTIC;
689-
Src->getOperand(RISCVII::getVecPolicyOpNum(Src->getDesc())).setImm(Policy);
683+
if (RISCVII::hasVecPolicyOp(Src->getDesc().TSFlags)) {
684+
// If MI was tail agnostic and the VL didn't increase, preserve it.
685+
int64_t Policy = RISCVVType::TAIL_UNDISTURBED_MASK_UNDISTURBED;
686+
if ((MI.getOperand(5).getImm() & RISCVVType::TAIL_AGNOSTIC) &&
687+
RISCV::isVLKnownLE(MI.getOperand(3), SrcVL))
688+
Policy |= RISCVVType::TAIL_AGNOSTIC;
689+
Src->getOperand(RISCVII::getVecPolicyOpNum(Src->getDesc())).setImm(Policy);
690+
}
690691

691692
MRI->constrainRegClass(Src->getOperand(0).getReg(),
692693
MRI->getRegClass(MI.getOperand(0).getReg()));

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-insert-subvector.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -554,9 +554,8 @@ define <vscale x 2 x i1> @insert_nxv2i1_v4i1_0(<vscale x 2 x i1> %v, ptr %svp) {
554554
; VLA-NEXT: vsetivli zero, 4, e8, mf4, ta, ma
555555
; VLA-NEXT: vmv.v.i v10, 0
556556
; VLA-NEXT: vmv1r.v v0, v8
557-
; VLA-NEXT: vmerge.vim v8, v10, 1, v0
558557
; VLA-NEXT: vsetvli zero, zero, e8, mf4, tu, ma
559-
; VLA-NEXT: vmv.v.v v9, v8
558+
; VLA-NEXT: vmerge.vim v9, v10, 1, v0
560559
; VLA-NEXT: vsetvli a0, zero, e8, mf4, ta, ma
561560
; VLA-NEXT: vmsne.vi v0, v9, 0
562561
; VLA-NEXT: ret
@@ -568,9 +567,8 @@ define <vscale x 2 x i1> @insert_nxv2i1_v4i1_0(<vscale x 2 x i1> %v, ptr %svp) {
568567
; VLS-NEXT: vmv.v.i v9, 0
569568
; VLS-NEXT: vmerge.vim v10, v9, 1, v0
570569
; VLS-NEXT: vmv1r.v v0, v8
571-
; VLS-NEXT: vmerge.vim v8, v9, 1, v0
572570
; VLS-NEXT: vsetvli zero, zero, e8, mf4, tu, ma
573-
; VLS-NEXT: vmv.v.v v10, v8
571+
; VLS-NEXT: vmerge.vim v10, v9, 1, v0
574572
; VLS-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
575573
; VLS-NEXT: vmsne.vi v0, v10, 0
576574
; VLS-NEXT: ret

llvm/test/CodeGen/RISCV/rvv/vmv.v.v-peephole.ll

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,14 @@ define <vscale x 1 x i64> @vleff_move_past_passthru(ptr %p, ptr %q, iXLen %avl)
222222
%b = call <vscale x 1 x i64> @llvm.riscv.vmv.v.v.nxv1i64(<vscale x 1 x i64> %passthru, <vscale x 1 x i64> %vec, iXLen %avl)
223223
ret <vscale x 1 x i64> %b
224224
}
225+
226+
define <vscale x 1 x i64> @vmerge(<vscale x 1 x i64> %passthru, <vscale x 1 x i64> %x, <vscale x 1 x i64> %y, <vscale x 1 x i1> %m, iXLen %avl) {
227+
; CHECK-LABEL: vmerge:
228+
; CHECK: # %bb.0:
229+
; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma
230+
; CHECK-NEXT: vmerge.vvm v8, v9, v10, v0
231+
; CHECK-NEXT: ret
232+
%a = call <vscale x 1 x i64> @llvm.riscv.vmerge.nxv1i64.nxv1i64(<vscale x 1 x i64> %passthru, <vscale x 1 x i64> %x, <vscale x 1 x i64> %y, <vscale x 1 x i1> %m, iXLen %avl)
233+
%b = call <vscale x 1 x i64> @llvm.riscv.vmv.v.v.nxv1i64(<vscale x 1 x i64> %passthru, <vscale x 1 x i64> %a, iXLen %avl)
234+
ret <vscale x 1 x i64> %b
235+
}

llvm/test/CodeGen/RISCV/rvv/vmv.v.v-peephole.mir

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,19 @@ body: |
152152
%y:gpr = ADDI $x0, 1
153153
%z:vr = PseudoVMV_V_V_M1 %passthru, %x, 4, 5 /* e32 */, 0 /* tu, mu */
154154
...
155+
---
156+
name: vmerge_vvm
157+
body: |
158+
bb.0:
159+
liveins: $v8, $v0
160+
; CHECK-LABEL: name: vmerge_vvm
161+
; CHECK: liveins: $v8, $v0
162+
; CHECK-NEXT: {{ $}}
163+
; CHECK-NEXT: %passthru:vrnov0 = COPY $v8
164+
; CHECK-NEXT: %mask:vmv0 = COPY $v0
165+
; CHECK-NEXT: %x:vrnov0 = PseudoVMERGE_VVM_M1 %passthru, %passthru, $noreg, %mask, 4, 5 /* e32 */
166+
%passthru:vr = COPY $v8
167+
%mask:vmv0 = COPY $v0
168+
%x:vrnov0 = PseudoVMERGE_VVM_M1 $noreg, %passthru, $noreg, %mask, 4, 5 /* e32 */
169+
%z:vr = PseudoVMV_V_V_M1 %passthru, %x, 4, 5 /* e32 */, 0 /* tu, mu */
170+
...

0 commit comments

Comments
 (0)