Skip to content

Commit b4c5590

Browse files
committed
[RISCV][Peephole] Checking regclass compatibility in VMV
1 parent fbf99ce commit b4c5590

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,11 @@ bool RISCVVectorPeephole::foldUndefPassthruVMV_V_V(MachineInstr &MI) {
565565
if (MI.getOperand(1).getReg() != RISCV::NoRegister)
566566
return false;
567567

568+
const TargetRegisterClass *RC1 = MRI->getRegClass(MI.getOperand(0).getReg());
569+
const TargetRegisterClass *RC2 = MRI->getRegClass(MI.getOperand(2).getReg());
570+
if (!RC1->hasSubClassEq(RC2))
571+
return false;
572+
568573
// If the input was a pseudo with a policy operand, we can give it a tail
569574
// agnostic policy if MI's undef tail subsumes the input's.
570575
MachineInstr *Src = MRI->getVRegDef(MI.getOperand(2).getReg());
@@ -608,6 +613,11 @@ bool RISCVVectorPeephole::foldVMV_V_V(MachineInstr &MI) {
608613
if (!MRI->hasOneUse(MI.getOperand(2).getReg()))
609614
return false;
610615

616+
const TargetRegisterClass *RC1 = MRI->getRegClass(MI.getOperand(0).getReg());
617+
const TargetRegisterClass *RC2 = MRI->getRegClass(MI.getOperand(2).getReg());
618+
if (!RC1->hasSubClassEq(RC2))
619+
return false;
620+
611621
MachineInstr *Src = MRI->getVRegDef(MI.getOperand(2).getReg());
612622
if (!Src || Src->hasUnmodeledSideEffects() ||
613623
Src->getParent() != MI.getParent() || Src->getNumDefs() != 1 ||

llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmv-with-different-class.mir

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
22
# RUN: llc %s -o - -mtriple=riscv64 -mattr=+v -run-pass=riscv-vector-peephole \
3-
# RUN: | FileCheck %s
3+
# RUN: -verify-machineinstrs | FileCheck %s
44

55
--- |
66
source_filename = "reduced.ll"
@@ -107,9 +107,10 @@ body: |
107107
bb.0.entry:
108108
; CHECK-LABEL: name: main
109109
; CHECK: [[PseudoVMV_V_I_MF2_:%[0-9]+]]:vr = PseudoVMV_V_I_MF2 $noreg, 0, -1, 5 /* e32 */, 0 /* tu, mu */
110+
; CHECK-NEXT: [[PseudoVMV_V_V_MF2_:%[0-9]+]]:vrnov0 = PseudoVMV_V_V_MF2 $noreg, [[PseudoVMV_V_I_MF2_]], 0, 5 /* e32 */, 0 /* tu, mu */
110111
; CHECK-NEXT: [[PseudoVMCLR_M_B64_:%[0-9]+]]:vr = PseudoVMCLR_M_B64 -1, 0 /* e8 */
111112
; CHECK-NEXT: [[COPY:%[0-9]+]]:vmv0 = COPY [[PseudoVMCLR_M_B64_]]
112-
; CHECK-NEXT: [[PseudoVXOR_VV_MF2_MASK:%[0-9]+]]:vrnov0 = PseudoVXOR_VV_MF2_MASK [[PseudoVMV_V_I_MF2_]], [[PseudoVMV_V_I_MF2_]], [[PseudoVMV_V_I_MF2_]], [[COPY]], 0, 5 /* e32 */, 0 /* tu, mu */
113+
; CHECK-NEXT: [[PseudoVXOR_VV_MF2_MASK:%[0-9]+]]:vrnov0 = PseudoVXOR_VV_MF2_MASK [[PseudoVMV_V_V_MF2_]], [[PseudoVMV_V_I_MF2_]], [[PseudoVMV_V_I_MF2_]], [[COPY]], 0, 5 /* e32 */, 0 /* tu, mu */
113114
; CHECK-NEXT: [[PseudoVMV_V_I_M1_:%[0-9]+]]:vrnov0 = PseudoVMV_V_I_M1 $noreg, 0, -1, 6 /* e64 */, 0 /* tu, mu */
114115
; CHECK-NEXT: [[COPY1:%[0-9]+]]:vmv0 = COPY [[PseudoVMCLR_M_B64_]]
115116
; CHECK-NEXT: early-clobber %6:vrnov0 = PseudoVWMACC_VV_MF2_MASK [[PseudoVMV_V_I_M1_]], killed [[PseudoVXOR_VV_MF2_MASK]], [[PseudoVMV_V_I_MF2_]], [[COPY1]], 0, 5 /* e32 */, 0 /* tu, mu */

0 commit comments

Comments
 (0)