Skip to content

Commit 76cb984

Browse files
wangpc-pplukel97
andauthored
[RISCV] Sources of vmerge shouldn't overlap V0 (#170070)
According to the spec: > A vector register cannot be used to provide source operands with more > than one EEW for a single instruction. A mask register source is > considered to have EEW=1 for this constraint. There must be a mask `V0` in `vmerge` variants so the sources should use register classes without `V0`. This fixes #169905. Co-authored-by: Luke Lau <[email protected]>
1 parent 242077a commit 76cb984

18 files changed

+1011
-1049
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2982,21 +2982,21 @@ multiclass VPseudoVFWALU_WV_WF_RM {
29822982
multiclass VPseudoVMRG_VM_XM_IM {
29832983
foreach m = MxList in {
29842984
defvar mx = m.MX;
2985-
def "_VVM" # "_" # m.MX:
2986-
VPseudoTiedBinaryCarryIn<GetVRegNoV0<m.vrclass>.R,
2987-
m.vrclass, m.vrclass, m>,
2988-
SchedBinary<"WriteVIMergeV", "ReadVIMergeV", "ReadVIMergeV", mx,
2989-
forcePassthruRead=true>;
2990-
def "_VXM" # "_" # m.MX:
2991-
VPseudoTiedBinaryCarryIn<GetVRegNoV0<m.vrclass>.R,
2992-
m.vrclass, GPR, m>,
2993-
SchedBinary<"WriteVIMergeX", "ReadVIMergeV", "ReadVIMergeX", mx,
2994-
forcePassthruRead=true>;
2995-
def "_VIM" # "_" # m.MX:
2996-
VPseudoTiedBinaryCarryIn<GetVRegNoV0<m.vrclass>.R,
2997-
m.vrclass, simm5, m>,
2998-
SchedUnary<"WriteVIMergeI", "ReadVIMergeV", mx,
2999-
forcePassthruRead=true>;
2985+
def "_VVM"#"_"#m.MX : VPseudoTiedBinaryCarryIn<GetVRegNoV0<m.vrclass>.R,
2986+
GetVRegNoV0<m.vrclass>.R,
2987+
GetVRegNoV0<m.vrclass>.R, m>,
2988+
SchedBinary<"WriteVIMergeV", "ReadVIMergeV", "ReadVIMergeV", mx,
2989+
forcePassthruRead = true>;
2990+
def "_VXM"#"_"#m.MX
2991+
: VPseudoTiedBinaryCarryIn<GetVRegNoV0<m.vrclass>.R,
2992+
GetVRegNoV0<m.vrclass>.R, GPR, m>,
2993+
SchedBinary<"WriteVIMergeX", "ReadVIMergeV", "ReadVIMergeX", mx,
2994+
forcePassthruRead = true>;
2995+
def "_VIM"#"_"#m.MX
2996+
: VPseudoTiedBinaryCarryIn<GetVRegNoV0<m.vrclass>.R,
2997+
GetVRegNoV0<m.vrclass>.R, simm5, m>,
2998+
SchedUnary<"WriteVIMergeI", "ReadVIMergeV", mx,
2999+
forcePassthruRead = true>;
30003000
}
30013001
}
30023002

llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class RISCVVectorPeephole : public MachineFunctionPass {
7373
bool isAllOnesMask(const MachineInstr *MaskDef) const;
7474
std::optional<unsigned> getConstant(const MachineOperand &VL) const;
7575
bool ensureDominates(const MachineOperand &Use, MachineInstr &Src) const;
76-
bool isKnownSameDefs(Register A, Register B) const;
76+
Register lookThruCopies(Register Reg) const;
7777
};
7878

7979
} // namespace
@@ -387,23 +387,18 @@ bool RISCVVectorPeephole::convertAllOnesVMergeToVMv(MachineInstr &MI) const {
387387
return true;
388388
}
389389

390-
bool RISCVVectorPeephole::isKnownSameDefs(Register A, Register B) const {
391-
if (A.isPhysical() || B.isPhysical())
392-
return false;
393-
394-
auto LookThruVirtRegCopies = [this](Register Reg) {
395-
while (MachineInstr *Def = MRI->getUniqueVRegDef(Reg)) {
396-
if (!Def->isFullCopy())
397-
break;
398-
Register Src = Def->getOperand(1).getReg();
399-
if (!Src.isVirtual())
400-
break;
401-
Reg = Src;
402-
}
403-
return Reg;
404-
};
405-
406-
return LookThruVirtRegCopies(A) == LookThruVirtRegCopies(B);
390+
// If \p Reg is defined by one or more COPYs of virtual registers, traverses
391+
// the chain and returns the root non-COPY source.
392+
Register RISCVVectorPeephole::lookThruCopies(Register Reg) const {
393+
while (MachineInstr *Def = MRI->getUniqueVRegDef(Reg)) {
394+
if (!Def->isFullCopy())
395+
break;
396+
Register Src = Def->getOperand(1).getReg();
397+
if (!Src.isVirtual())
398+
break;
399+
Reg = Src;
400+
}
401+
return Reg;
407402
}
408403

409404
/// If a PseudoVMERGE_VVM's true operand is a masked pseudo and both have the
@@ -428,10 +423,11 @@ bool RISCVVectorPeephole::convertSameMaskVMergeToVMv(MachineInstr &MI) {
428423
if (!TrueMaskedInfo || !hasSameEEW(MI, *True))
429424
return false;
430425

431-
const MachineOperand &TrueMask =
432-
True->getOperand(TrueMaskedInfo->MaskOpIdx + True->getNumExplicitDefs());
433-
const MachineOperand &MIMask = MI.getOperand(4);
434-
if (!isKnownSameDefs(TrueMask.getReg(), MIMask.getReg()))
426+
Register TrueMaskReg = lookThruCopies(
427+
True->getOperand(TrueMaskedInfo->MaskOpIdx + True->getNumExplicitDefs())
428+
.getReg());
429+
Register MIMaskReg = lookThruCopies(MI.getOperand(4).getReg());
430+
if (!TrueMaskReg.isVirtual() || TrueMaskReg != MIMaskReg)
435431
return false;
436432

437433
// Masked off lanes past TrueVL will come from False, and converting to vmv
@@ -717,9 +713,9 @@ bool RISCVVectorPeephole::foldVMergeToMask(MachineInstr &MI) const {
717713
if (RISCV::getRVVMCOpcode(MI.getOpcode()) != RISCV::VMERGE_VVM)
718714
return false;
719715

720-
Register PassthruReg = MI.getOperand(1).getReg();
721-
Register FalseReg = MI.getOperand(2).getReg();
722-
Register TrueReg = MI.getOperand(3).getReg();
716+
Register PassthruReg = lookThruCopies(MI.getOperand(1).getReg());
717+
Register FalseReg = lookThruCopies(MI.getOperand(2).getReg());
718+
Register TrueReg = lookThruCopies(MI.getOperand(3).getReg());
723719
if (!TrueReg.isVirtual() || !MRI->hasOneUse(TrueReg))
724720
return false;
725721
MachineInstr &True = *MRI->getUniqueVRegDef(TrueReg);
@@ -740,16 +736,17 @@ bool RISCVVectorPeephole::foldVMergeToMask(MachineInstr &MI) const {
740736

741737
// We require that either passthru and false are the same, or that passthru
742738
// is undefined.
743-
if (PassthruReg && !isKnownSameDefs(PassthruReg, FalseReg))
739+
if (PassthruReg && !(PassthruReg.isVirtual() && PassthruReg == FalseReg))
744740
return false;
745741

746742
std::optional<std::pair<unsigned, unsigned>> NeedsCommute;
747743

748744
// If True has a passthru operand then it needs to be the same as vmerge's
749745
// False, since False will be used for the result's passthru operand.
750-
Register TruePassthru = True.getOperand(True.getNumExplicitDefs()).getReg();
746+
Register TruePassthru =
747+
lookThruCopies(True.getOperand(True.getNumExplicitDefs()).getReg());
751748
if (RISCVII::isFirstDefTiedToFirstUse(True.getDesc()) && TruePassthru &&
752-
!isKnownSameDefs(TruePassthru, FalseReg)) {
749+
!(TruePassthru.isVirtual() && TruePassthru == FalseReg)) {
753750
// If True's passthru != False, check if it uses False in another operand
754751
// and try to commute it.
755752
int OtherIdx = True.findRegisterUseOperandIdx(FalseReg, TRI);

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/rvv/select.mir

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ body: |
1111
bb.0.entry:
1212
; RV32I-LABEL: name: select_nxv1i8
1313
; RV32I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
14-
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vr = IMPLICIT_DEF
14+
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
1515
; RV32I-NEXT: [[DEF2:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
1616
; RV32I-NEXT: [[PseudoVMERGE_VVM_MF4_:%[0-9]+]]:vrnov0 = PseudoVMERGE_VVM_MF4 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 3 /* e8 */
1717
; RV32I-NEXT: $v8 = COPY [[PseudoVMERGE_VVM_MF4_]]
1818
; RV32I-NEXT: PseudoRET implicit $v8
1919
;
2020
; RV64I-LABEL: name: select_nxv1i8
2121
; RV64I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
22-
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vr = IMPLICIT_DEF
22+
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
2323
; RV64I-NEXT: [[DEF2:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
2424
; RV64I-NEXT: [[PseudoVMERGE_VVM_MF4_:%[0-9]+]]:vrnov0 = PseudoVMERGE_VVM_MF4 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 3 /* e8 */
2525
; RV64I-NEXT: $v8 = COPY [[PseudoVMERGE_VVM_MF4_]]
@@ -40,15 +40,15 @@ body: |
4040
bb.0.entry:
4141
; RV32I-LABEL: name: select_nxv4i8
4242
; RV32I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
43-
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vr = IMPLICIT_DEF
43+
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
4444
; RV32I-NEXT: [[DEF2:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
4545
; RV32I-NEXT: [[PseudoVMERGE_VVM_M1_:%[0-9]+]]:vrnov0 = PseudoVMERGE_VVM_M1 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 3 /* e8 */
4646
; RV32I-NEXT: $v8 = COPY [[PseudoVMERGE_VVM_M1_]]
4747
; RV32I-NEXT: PseudoRET implicit $v8
4848
;
4949
; RV64I-LABEL: name: select_nxv4i8
5050
; RV64I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
51-
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vr = IMPLICIT_DEF
51+
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
5252
; RV64I-NEXT: [[DEF2:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
5353
; RV64I-NEXT: [[PseudoVMERGE_VVM_M1_:%[0-9]+]]:vrnov0 = PseudoVMERGE_VVM_M1 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 3 /* e8 */
5454
; RV64I-NEXT: $v8 = COPY [[PseudoVMERGE_VVM_M1_]]
@@ -69,15 +69,15 @@ body: |
6969
bb.0.entry:
7070
; RV32I-LABEL: name: select_nxv16i8
7171
; RV32I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
72-
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrm4 = IMPLICIT_DEF
72+
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrm4nov0 = IMPLICIT_DEF
7373
; RV32I-NEXT: [[DEF2:%[0-9]+]]:vrm4nov0 = IMPLICIT_DEF
7474
; RV32I-NEXT: [[PseudoVMERGE_VVM_M4_:%[0-9]+]]:vrm4nov0 = PseudoVMERGE_VVM_M4 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 3 /* e8 */
7575
; RV32I-NEXT: $v8m4 = COPY [[PseudoVMERGE_VVM_M4_]]
7676
; RV32I-NEXT: PseudoRET implicit $v8m4
7777
;
7878
; RV64I-LABEL: name: select_nxv16i8
7979
; RV64I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
80-
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrm4 = IMPLICIT_DEF
80+
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrm4nov0 = IMPLICIT_DEF
8181
; RV64I-NEXT: [[DEF2:%[0-9]+]]:vrm4nov0 = IMPLICIT_DEF
8282
; RV64I-NEXT: [[PseudoVMERGE_VVM_M4_:%[0-9]+]]:vrm4nov0 = PseudoVMERGE_VVM_M4 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 3 /* e8 */
8383
; RV64I-NEXT: $v8m4 = COPY [[PseudoVMERGE_VVM_M4_]]
@@ -98,15 +98,15 @@ body: |
9898
bb.0.entry:
9999
; RV32I-LABEL: name: select_nxv64i8
100100
; RV32I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
101-
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vr = IMPLICIT_DEF
101+
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
102102
; RV32I-NEXT: [[DEF2:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
103103
; RV32I-NEXT: [[PseudoVMERGE_VVM_MF4_:%[0-9]+]]:vrnov0 = PseudoVMERGE_VVM_MF4 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 4 /* e16 */
104104
; RV32I-NEXT: $v8 = COPY [[PseudoVMERGE_VVM_MF4_]]
105105
; RV32I-NEXT: PseudoRET implicit $v8
106106
;
107107
; RV64I-LABEL: name: select_nxv64i8
108108
; RV64I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
109-
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vr = IMPLICIT_DEF
109+
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
110110
; RV64I-NEXT: [[DEF2:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
111111
; RV64I-NEXT: [[PseudoVMERGE_VVM_MF4_:%[0-9]+]]:vrnov0 = PseudoVMERGE_VVM_MF4 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 4 /* e16 */
112112
; RV64I-NEXT: $v8 = COPY [[PseudoVMERGE_VVM_MF4_]]
@@ -127,15 +127,15 @@ body: |
127127
bb.0.entry:
128128
; RV32I-LABEL: name: select_nxv2i16
129129
; RV32I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
130-
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vr = IMPLICIT_DEF
130+
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
131131
; RV32I-NEXT: [[DEF2:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
132132
; RV32I-NEXT: [[PseudoVMERGE_VVM_M1_:%[0-9]+]]:vrnov0 = PseudoVMERGE_VVM_M1 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 4 /* e16 */
133133
; RV32I-NEXT: $v8 = COPY [[PseudoVMERGE_VVM_M1_]]
134134
; RV32I-NEXT: PseudoRET implicit $v8
135135
;
136136
; RV64I-LABEL: name: select_nxv2i16
137137
; RV64I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
138-
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vr = IMPLICIT_DEF
138+
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
139139
; RV64I-NEXT: [[DEF2:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
140140
; RV64I-NEXT: [[PseudoVMERGE_VVM_M1_:%[0-9]+]]:vrnov0 = PseudoVMERGE_VVM_M1 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 4 /* e16 */
141141
; RV64I-NEXT: $v8 = COPY [[PseudoVMERGE_VVM_M1_]]
@@ -156,15 +156,15 @@ body: |
156156
bb.0.entry:
157157
; RV32I-LABEL: name: select_nxv8i16
158158
; RV32I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
159-
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrm4 = IMPLICIT_DEF
159+
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrm4nov0 = IMPLICIT_DEF
160160
; RV32I-NEXT: [[DEF2:%[0-9]+]]:vrm4nov0 = IMPLICIT_DEF
161161
; RV32I-NEXT: [[PseudoVMERGE_VVM_M4_:%[0-9]+]]:vrm4nov0 = PseudoVMERGE_VVM_M4 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 4 /* e16 */
162162
; RV32I-NEXT: $v8m4 = COPY [[PseudoVMERGE_VVM_M4_]]
163163
; RV32I-NEXT: PseudoRET implicit $v8m4
164164
;
165165
; RV64I-LABEL: name: select_nxv8i16
166166
; RV64I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
167-
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrm4 = IMPLICIT_DEF
167+
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrm4nov0 = IMPLICIT_DEF
168168
; RV64I-NEXT: [[DEF2:%[0-9]+]]:vrm4nov0 = IMPLICIT_DEF
169169
; RV64I-NEXT: [[PseudoVMERGE_VVM_M4_:%[0-9]+]]:vrm4nov0 = PseudoVMERGE_VVM_M4 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 4 /* e16 */
170170
; RV64I-NEXT: $v8m4 = COPY [[PseudoVMERGE_VVM_M4_]]
@@ -185,15 +185,15 @@ body: |
185185
bb.0.entry:
186186
; RV32I-LABEL: name: select_nxv32i16
187187
; RV32I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
188-
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vr = IMPLICIT_DEF
188+
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
189189
; RV32I-NEXT: [[DEF2:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
190190
; RV32I-NEXT: [[PseudoVMERGE_VVM_MF2_:%[0-9]+]]:vrnov0 = PseudoVMERGE_VVM_MF2 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 5 /* e32 */
191191
; RV32I-NEXT: $v8 = COPY [[PseudoVMERGE_VVM_MF2_]]
192192
; RV32I-NEXT: PseudoRET implicit $v8
193193
;
194194
; RV64I-LABEL: name: select_nxv32i16
195195
; RV64I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
196-
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vr = IMPLICIT_DEF
196+
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
197197
; RV64I-NEXT: [[DEF2:%[0-9]+]]:vrnov0 = IMPLICIT_DEF
198198
; RV64I-NEXT: [[PseudoVMERGE_VVM_MF2_:%[0-9]+]]:vrnov0 = PseudoVMERGE_VVM_MF2 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 5 /* e32 */
199199
; RV64I-NEXT: $v8 = COPY [[PseudoVMERGE_VVM_MF2_]]
@@ -214,15 +214,15 @@ body: |
214214
bb.0.entry:
215215
; RV32I-LABEL: name: select_nxv2i32
216216
; RV32I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
217-
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrm2 = IMPLICIT_DEF
217+
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrm2nov0 = IMPLICIT_DEF
218218
; RV32I-NEXT: [[DEF2:%[0-9]+]]:vrm2nov0 = IMPLICIT_DEF
219219
; RV32I-NEXT: [[PseudoVMERGE_VVM_M2_:%[0-9]+]]:vrm2nov0 = PseudoVMERGE_VVM_M2 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 5 /* e32 */
220220
; RV32I-NEXT: $v8m2 = COPY [[PseudoVMERGE_VVM_M2_]]
221221
; RV32I-NEXT: PseudoRET implicit $v8m2
222222
;
223223
; RV64I-LABEL: name: select_nxv2i32
224224
; RV64I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
225-
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrm2 = IMPLICIT_DEF
225+
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrm2nov0 = IMPLICIT_DEF
226226
; RV64I-NEXT: [[DEF2:%[0-9]+]]:vrm2nov0 = IMPLICIT_DEF
227227
; RV64I-NEXT: [[PseudoVMERGE_VVM_M2_:%[0-9]+]]:vrm2nov0 = PseudoVMERGE_VVM_M2 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 5 /* e32 */
228228
; RV64I-NEXT: $v8m2 = COPY [[PseudoVMERGE_VVM_M2_]]
@@ -243,15 +243,15 @@ body: |
243243
bb.0.entry:
244244
; RV32I-LABEL: name: select_nxv8i32
245245
; RV32I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
246-
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrm8 = IMPLICIT_DEF
246+
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrm8nov0 = IMPLICIT_DEF
247247
; RV32I-NEXT: [[DEF2:%[0-9]+]]:vrm8nov0 = IMPLICIT_DEF
248248
; RV32I-NEXT: [[PseudoVMERGE_VVM_M8_:%[0-9]+]]:vrm8nov0 = PseudoVMERGE_VVM_M8 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 5 /* e32 */
249249
; RV32I-NEXT: $v8m8 = COPY [[PseudoVMERGE_VVM_M8_]]
250250
; RV32I-NEXT: PseudoRET implicit $v8m8
251251
;
252252
; RV64I-LABEL: name: select_nxv8i32
253253
; RV64I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
254-
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrm8 = IMPLICIT_DEF
254+
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrm8nov0 = IMPLICIT_DEF
255255
; RV64I-NEXT: [[DEF2:%[0-9]+]]:vrm8nov0 = IMPLICIT_DEF
256256
; RV64I-NEXT: [[PseudoVMERGE_VVM_M8_:%[0-9]+]]:vrm8nov0 = PseudoVMERGE_VVM_M8 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 5 /* e32 */
257257
; RV64I-NEXT: $v8m8 = COPY [[PseudoVMERGE_VVM_M8_]]
@@ -272,15 +272,15 @@ body: |
272272
bb.0.entry:
273273
; RV32I-LABEL: name: select_nxv1i64
274274
; RV32I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
275-
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrm2 = IMPLICIT_DEF
275+
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrm2nov0 = IMPLICIT_DEF
276276
; RV32I-NEXT: [[DEF2:%[0-9]+]]:vrm2nov0 = IMPLICIT_DEF
277277
; RV32I-NEXT: [[PseudoVMERGE_VVM_M2_:%[0-9]+]]:vrm2nov0 = PseudoVMERGE_VVM_M2 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 6 /* e64 */
278278
; RV32I-NEXT: $v8m2 = COPY [[PseudoVMERGE_VVM_M2_]]
279279
; RV32I-NEXT: PseudoRET implicit $v8m2
280280
;
281281
; RV64I-LABEL: name: select_nxv1i64
282282
; RV64I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
283-
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrm2 = IMPLICIT_DEF
283+
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrm2nov0 = IMPLICIT_DEF
284284
; RV64I-NEXT: [[DEF2:%[0-9]+]]:vrm2nov0 = IMPLICIT_DEF
285285
; RV64I-NEXT: [[PseudoVMERGE_VVM_M2_:%[0-9]+]]:vrm2nov0 = PseudoVMERGE_VVM_M2 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 6 /* e64 */
286286
; RV64I-NEXT: $v8m2 = COPY [[PseudoVMERGE_VVM_M2_]]
@@ -301,15 +301,15 @@ body: |
301301
bb.0.entry:
302302
; RV32I-LABEL: name: select_nxv4i64
303303
; RV32I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
304-
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrm8 = IMPLICIT_DEF
304+
; RV32I-NEXT: [[DEF1:%[0-9]+]]:vrm8nov0 = IMPLICIT_DEF
305305
; RV32I-NEXT: [[DEF2:%[0-9]+]]:vrm8nov0 = IMPLICIT_DEF
306306
; RV32I-NEXT: [[PseudoVMERGE_VVM_M8_:%[0-9]+]]:vrm8nov0 = PseudoVMERGE_VVM_M8 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 6 /* e64 */
307307
; RV32I-NEXT: $v8m8 = COPY [[PseudoVMERGE_VVM_M8_]]
308308
; RV32I-NEXT: PseudoRET implicit $v8m8
309309
;
310310
; RV64I-LABEL: name: select_nxv4i64
311311
; RV64I: [[DEF:%[0-9]+]]:vmv0 = IMPLICIT_DEF
312-
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrm8 = IMPLICIT_DEF
312+
; RV64I-NEXT: [[DEF1:%[0-9]+]]:vrm8nov0 = IMPLICIT_DEF
313313
; RV64I-NEXT: [[DEF2:%[0-9]+]]:vrm8nov0 = IMPLICIT_DEF
314314
; RV64I-NEXT: [[PseudoVMERGE_VVM_M8_:%[0-9]+]]:vrm8nov0 = PseudoVMERGE_VVM_M8 [[DEF2]], [[DEF1]], [[DEF1]], [[DEF]], -1, 6 /* e64 */
315315
; RV64I-NEXT: $v8m8 = COPY [[PseudoVMERGE_VVM_M8_]]

llvm/test/CodeGen/RISCV/rvv/combine-reduce-add-to-vcpop.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,10 +311,10 @@ define i32 @test_nxv128i1(<vscale x 128 x i1> %x) {
311311
; CHECK-NEXT: vmerge.vim v16, v16, 1, v0
312312
; CHECK-NEXT: vsetvli a2, zero, e8, mf2, ta, ma
313313
; CHECK-NEXT: vslidedown.vx v0, v6, a0
314+
; CHECK-NEXT: vsetvli a2, zero, e32, m8, ta, ma
315+
; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
314316
; CHECK-NEXT: vsetvli a2, zero, e8, m1, ta, ma
315317
; CHECK-NEXT: vslidedown.vx v6, v7, a1
316-
; CHECK-NEXT: vsetvli a1, zero, e32, m8, ta, ma
317-
; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
318318
; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma
319319
; CHECK-NEXT: vslidedown.vx v0, v7, a0
320320
; CHECK-NEXT: vslidedown.vx v5, v6, a0

llvm/test/CodeGen/RISCV/rvv/copyprop.mir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ body: |
4343
%2:gpr = COPY $x11
4444
%1:gpr = COPY $x10
4545
%3:vr = COPY $v8
46-
%17:vr = PseudoVSLL_VI_M1 undef $noreg, %3, 5, 1, 6 /* e64 */, 0
46+
%17:vrnov0 = PseudoVSLL_VI_M1 undef $noreg, %3, 5, 1, 6 /* e64 */, 0
4747
%22:vr = PseudoVMSNE_VI_M1 %3, 0, 1, 6 /* e64 */
4848
%23:vmv0 = COPY %22
4949
%25:vrnov0 = PseudoVMERGE_VIM_M1 undef $noreg, %17, -1, %23, 1, 6 /* e64 */

0 commit comments

Comments
 (0)