Skip to content

Commit 11f6cae

Browse files
committed
[RISCV] Handle undef passthrus in foldVMV_V_V
If a PseudoVMV_V_V's passthru is undef then we don't need the Src to have the same passthru, nor do we need to check its VL. The tail policy in these tests is still tu, llvm#105788 should fix this separately.
1 parent f4adb1d commit 11f6cae

File tree

3 files changed

+23
-24
lines changed

3 files changed

+23
-24
lines changed

llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -503,30 +503,32 @@ bool RISCVVectorPeephole::foldVMV_V_V(MachineInstr &MI) {
503503
if (getSEWLMULRatio(MI) != getSEWLMULRatio(*Src))
504504
return false;
505505

506-
// Src needs to have the same passthru as VMV_V_V
507-
MachineOperand &SrcPassthru = Src->getOperand(1);
508-
if (SrcPassthru.getReg() != RISCV::NoRegister &&
509-
SrcPassthru.getReg() != Passthru.getReg())
510-
return false;
506+
if (Passthru.getReg() != RISCV::NoRegister) {
507+
// Src needs to have the same passthru as VMV_V_V
508+
MachineOperand &SrcPassthru = Src->getOperand(1);
509+
if (SrcPassthru.getReg() != RISCV::NoRegister &&
510+
SrcPassthru.getReg() != Passthru.getReg())
511+
return false;
511512

512-
// Src VL will have already been reduced if legal (see tryToReduceVL),
513-
// so we don't need to handle a smaller source VL here. However, the
514-
// user's VL may be larger
515-
MachineOperand &SrcVL = Src->getOperand(RISCVII::getVLOpNum(Src->getDesc()));
516-
if (!isVLKnownLE(SrcVL, MI.getOperand(3)))
517-
return false;
513+
// Src VL will have already been reduced if legal (see tryToReduceVL),
514+
// so we don't need to handle a smaller source VL here. However, the
515+
// user's VL may be larger
516+
MachineOperand &SrcVL = Src->getOperand(RISCVII::getVLOpNum(Src->getDesc()));
517+
if (!isVLKnownLE(SrcVL, MI.getOperand(3)))
518+
return false;
518519

519-
// If the new passthru doesn't dominate Src, try to move Src so it does.
520-
if (!ensureDominates(Passthru, *Src))
521-
return false;
520+
// If the new passthru doesn't dominate Src, try to move Src so it does.
521+
if (!ensureDominates(Passthru, *Src))
522+
return false;
522523

523-
if (SrcPassthru.getReg() != Passthru.getReg()) {
524-
SrcPassthru.setReg(Passthru.getReg());
525-
// If Src is masked then its passthru needs to be in VRNoV0.
526-
if (Passthru.getReg() != RISCV::NoRegister)
527-
MRI->constrainRegClass(Passthru.getReg(),
528-
TII->getRegClass(Src->getDesc(), 1, TRI,
529-
*Src->getParent()->getParent()));
524+
if (SrcPassthru.getReg() != Passthru.getReg()) {
525+
SrcPassthru.setReg(Passthru.getReg());
526+
// If Src is masked then its passthru needs to be in VRNoV0.
527+
if (Passthru.getReg() != RISCV::NoRegister)
528+
MRI->constrainRegClass(Passthru.getReg(),
529+
TII->getRegClass(Src->getDesc(), 1, TRI,
530+
*Src->getParent()->getParent()));
531+
}
530532
}
531533

532534
// Use a conservative tu,mu policy, RISCVInsertVSETVLI will relax it if

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,6 @@ define <vscale x 1 x i64> @undef_passthru(<vscale x 1 x i64> %passthru, <vscale
200200
; CHECK: # %bb.0:
201201
; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma
202202
; CHECK-NEXT: vadd.vv v8, v9, v10
203-
; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma
204-
; CHECK-NEXT: vmv.v.v v8, v8
205203
; CHECK-NEXT: ret
206204
%a = call <vscale x 1 x i64> @llvm.riscv.vadd.nxv1i64.nxv1i64(<vscale x 1 x i64> %passthru, <vscale x 1 x i64> %x, <vscale x 1 x i64> %y, iXLen %avl)
207205
%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)

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ body: |
2828
; CHECK-NEXT: {{ $}}
2929
; CHECK-NEXT: %passthru:vr = COPY $v8
3030
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 %passthru, $noreg, $noreg, 4, 5 /* e32 */, 0 /* tu, mu */
31-
; CHECK-NEXT: %y:vr = PseudoVMV_V_V_M1 $noreg, %x, 4, 5 /* e32 */, 1 /* ta, mu */
3231
%passthru:vr = COPY $v8
3332
%x:vr = PseudoVADD_VV_M1 %passthru, $noreg, $noreg, 4, 5 /* e32 */, 0 /* tu, mu */
3433
%y:vr = PseudoVMV_V_V_M1 $noreg, %x, 4, 5 /* e32 */, 1 /* ta, mu */

0 commit comments

Comments
 (0)