Skip to content

Commit 5b91756

Browse files
BeMglukel97
andauthored
[RISCV][Peephole] Checking regclass compatibility in VMV (llvm#138844)
Without checking the regclass compatibility, this pass may generate bad machine code. ``` *** Bad machine code: Illegal virtual register for instruction *** - function: main - basic block: %bb.0 entry (0x9209848) - instruction: %3:vrnov0 = PseudoVXOR_VV_MF2_MASK %0:vr(tied-def 0), %0:vr, %0:vr, %4:vmv0, 0, 5, 0 - operand 1: %0:vr(tied-def 0) Expected a VRNoV0 register, but got a VR register ``` --------- Co-authored-by: Luke Lau <luke_lau@icloud.com>
1 parent 4c9ffb7 commit 5b91756

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,8 @@ bool RISCVVectorPeephole::foldUndefPassthruVMV_V_V(MachineInstr &MI) {
583583
SrcPolicy.setImm(SrcPolicy.getImm() | RISCVVType::TAIL_AGNOSTIC);
584584
}
585585

586+
MRI->constrainRegClass(MI.getOperand(2).getReg(),
587+
MRI->getRegClass(MI.getOperand(0).getReg()));
586588
MRI->replaceRegWith(MI.getOperand(0).getReg(), MI.getOperand(2).getReg());
587589
MRI->clearKillFlags(MI.getOperand(2).getReg());
588590
MI.eraseFromParent();
@@ -653,6 +655,8 @@ bool RISCVVectorPeephole::foldVMV_V_V(MachineInstr &MI) {
653655
Policy |= RISCVVType::TAIL_AGNOSTIC;
654656
Src->getOperand(RISCVII::getVecPolicyOpNum(Src->getDesc())).setImm(Policy);
655657

658+
MRI->constrainRegClass(Src->getOperand(0).getReg(),
659+
MRI->getRegClass(MI.getOperand(0).getReg()));
656660
MRI->replaceRegWith(MI.getOperand(0).getReg(), Src->getOperand(0).getReg());
657661
MI.eraseFromParent();
658662

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,33 @@ body: |
105105
%3:vr = COPY %0
106106
...
107107
---
108+
name: diff_regclass
109+
body: |
110+
bb.0.entry:
111+
liveins: $v8
112+
; CHECK-LABEL: name: diff_regclass
113+
; CHECK: liveins: $v8
114+
; CHECK-NEXT: {{ $}}
115+
; CHECK-NEXT: [[PseudoVMV_V_I_MF2_:%[0-9]+]]:vrnov0 = PseudoVMV_V_I_MF2 $noreg, 0, 0, 5 /* e32 */, 1 /* ta, mu */
116+
; CHECK-NEXT: [[COPY:%[0-9]+]]:vmv0 = COPY $v8
117+
; CHECK-NEXT: [[PseudoVADD_VV_M1_MASK:%[0-9]+]]:vrnov0 = PseudoVADD_VV_M1_MASK [[PseudoVMV_V_I_MF2_]], $noreg, $noreg, [[COPY]], 0, 5 /* e32 */, 0 /* tu, mu */
118+
%0:vr = PseudoVMV_V_I_MF2 $noreg, 0, -1, 5 /* e32 */, 0 /* tu, mu */
119+
%1:vrnov0 = PseudoVMV_V_V_MF2 $noreg, %0, 0, 5 /* e32 */, 0 /* tu, mu */
120+
%2:vmv0 = COPY $v8
121+
%3:vrnov0 = PseudoVADD_VV_M1_MASK %1, $noreg, $noreg, %2, 0, 5 /* e32 */, 0 /* tu, mu */
122+
...
123+
---
124+
name: diff_regclass_passthru
125+
body: |
126+
bb.0.entry:
127+
liveins: $v8
128+
; CHECK-LABEL: name: diff_regclass_passthru
129+
; CHECK: liveins: $v8
130+
; CHECK-NEXT: {{ $}}
131+
; CHECK-NEXT: [[PseudoVMV_V_I_MF2_:%[0-9]+]]:vrnov0 = PseudoVMV_V_I_MF2 $noreg, 0, 0, 5 /* e32 */, 1 /* ta, mu */
132+
; CHECK-NEXT: [[COPY:%[0-9]+]]:vmv0 = COPY $v8
133+
; CHECK-NEXT: [[PseudoVLSE32_V_MF2_MASK:%[0-9]+]]:vrnov0 = PseudoVLSE32_V_MF2_MASK [[PseudoVMV_V_I_MF2_]], $noreg, $noreg, [[COPY]], 0, 5 /* e32 */, 0 /* tu, mu */ :: (load unknown-size, align 4)
134+
%2:vr = PseudoVMV_V_I_MF2 $noreg, 0, -1, 5 /* e32 */, 0 /* tu, mu */
135+
%3:vrnov0 = PseudoVMV_V_V_MF2 $noreg, %2, 0, 5 /* e32 */, 0 /* tu, mu */
136+
%7:vmv0 = COPY $v8
137+
%6:vrnov0 = PseudoVLSE32_V_MF2_MASK %3, $noreg, $noreg, %7, 0, 5 /* e32 */, 0 /* tu, mu */ :: (load unknown-size, align 4)

0 commit comments

Comments
 (0)