Skip to content

Commit 029f889

Browse files
authored
[RISCV] Fold vmv.v.v into vleNff.v (#143981)
We currently already fold vmerge.vvm into vleNff.v via RISCVDAGToDAGISel::performCombineVMergeAndVOps, so this teaches RISCVVectorPeephole::foldVMV_V_V to do the same.
1 parent 22f9b4a commit 029f889

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ bool RISCVVectorPeephole::foldVMV_V_V(MachineInstr &MI) {
611611

612612
MachineInstr *Src = MRI->getVRegDef(MI.getOperand(2).getReg());
613613
if (!Src || Src->hasUnmodeledSideEffects() ||
614-
Src->getParent() != MI.getParent() || Src->getNumDefs() != 1 ||
614+
Src->getParent() != MI.getParent() ||
615615
!RISCVII::isFirstDefTiedToFirstUse(Src->getDesc()) ||
616616
!RISCVII::hasVLOp(Src->getDesc().TSFlags) ||
617617
!RISCVII::hasVecPolicyOp(Src->getDesc().TSFlags))
@@ -622,7 +622,7 @@ bool RISCVVectorPeephole::foldVMV_V_V(MachineInstr &MI) {
622622
return false;
623623

624624
// Src needs to have the same passthru as VMV_V_V
625-
MachineOperand &SrcPassthru = Src->getOperand(1);
625+
MachineOperand &SrcPassthru = Src->getOperand(Src->getNumExplicitDefs());
626626
if (SrcPassthru.getReg() != RISCV::NoRegister &&
627627
SrcPassthru.getReg() != Passthru.getReg())
628628
return false;
@@ -643,7 +643,8 @@ bool RISCVVectorPeephole::foldVMV_V_V(MachineInstr &MI) {
643643
// If Src is masked then its passthru needs to be in VRNoV0.
644644
if (Passthru.getReg() != RISCV::NoRegister)
645645
MRI->constrainRegClass(Passthru.getReg(),
646-
TII->getRegClass(Src->getDesc(), 1, TRI,
646+
TII->getRegClass(Src->getDesc(),
647+
SrcPassthru.getOperandNo(), TRI,
647648
*Src->getParent()->getParent()));
648649
}
649650

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,3 +206,19 @@ define <vscale x 1 x i64> @undef_passthru(<vscale x 1 x i64> %passthru, <vscale
206206
%b = call <vscale x 1 x i64> @llvm.riscv.vmv.v.v.nxv1i64(<vscale x 1 x i64> undef, <vscale x 1 x i64> %a, iXLen %avl)
207207
ret <vscale x 1 x i64> %b
208208
}
209+
210+
; Check that we can fold into vle64ff.v even if we need to move it past the
211+
; passthru and it's safe.
212+
define <vscale x 1 x i64> @vleff_move_past_passthru(ptr %p, ptr %q, iXLen %avl) {
213+
; CHECK-LABEL: vleff_move_past_passthru:
214+
; CHECK: # %bb.0:
215+
; CHECK-NEXT: vl1re64.v v8, (a1)
216+
; CHECK-NEXT: vsetvli zero, a2, e64, m1, tu, ma
217+
; CHECK-NEXT: vle64ff.v v8, (a0)
218+
; CHECK-NEXT: ret
219+
%a = call { <vscale x 1 x i64>, iXLen } @llvm.riscv.vleff(<vscale x 1 x i64> poison, ptr %p, iXLen %avl)
220+
%vec = extractvalue { <vscale x 1 x i64>, iXLen } %a, 0
221+
%passthru = load <vscale x 1 x i64>, ptr %q
222+
%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)
223+
ret <vscale x 1 x i64> %b
224+
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,20 @@ body: |
135135
%3:vrnov0 = PseudoVMV_V_V_MF2 $noreg, %2, 0, 5 /* e32 */, 0 /* tu, mu */
136136
%7:vmv0 = COPY $v8
137137
%6:vrnov0 = PseudoVLSE32_V_MF2_MASK %3, $noreg, $noreg, %7, 0, 5 /* e32 */, 0 /* tu, mu */ :: (load unknown-size, align 4)
138+
...
139+
---
140+
name: move_vleff
141+
body: |
142+
bb.0:
143+
liveins: $v8
144+
; CHECK-LABEL: name: move_vleff
145+
; CHECK: liveins: $v8
146+
; CHECK-NEXT: {{ $}}
147+
; CHECK-NEXT: %passthru:vr = COPY $v8
148+
; CHECK-NEXT: %x:vr, %vl:gpr = PseudoVLE32FF_V_M1 %passthru, $noreg, 4, 5 /* e32 */, 0 /* tu, mu */ :: (load unknown-size, align 1)
149+
; CHECK-NEXT: %y:gpr = ADDI $x0, 1
150+
%x:vr, %vl:gpr = PseudoVLE32FF_V_M1 $noreg, $noreg, 4, 5 /* e32 */, 0 /* tu, mu */ :: (load unknown-size)
151+
%passthru:vr = COPY $v8
152+
%y:gpr = ADDI $x0, 1
153+
%z:vr = PseudoVMV_V_V_M1 %passthru, %x, 4, 5 /* e32 */, 0 /* tu, mu */
154+
...

0 commit comments

Comments
 (0)