Skip to content

Commit 199299d

Browse files
wangpc-pplukel97
andcommitted
[RISCV] Sources of vmerge shouldn't overlap V0 (llvm#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 llvm#169905. Co-authored-by: Luke Lau <[email protected]>
1 parent f68f64e commit 199299d

17 files changed

+914
-979
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3034,21 +3034,21 @@ multiclass VPseudoVFWALU_WV_WF_RM {
30343034
multiclass VPseudoVMRG_VM_XM_IM {
30353035
foreach m = MxList in {
30363036
defvar mx = m.MX;
3037-
def "_VVM" # "_" # m.MX:
3038-
VPseudoTiedBinaryCarryIn<GetVRegNoV0<m.vrclass>.R,
3039-
m.vrclass, m.vrclass, m>,
3040-
SchedBinary<"WriteVIMergeV", "ReadVIMergeV", "ReadVIMergeV", mx,
3041-
forcePassthruRead=true>;
3042-
def "_VXM" # "_" # m.MX:
3043-
VPseudoTiedBinaryCarryIn<GetVRegNoV0<m.vrclass>.R,
3044-
m.vrclass, GPR, m>,
3045-
SchedBinary<"WriteVIMergeX", "ReadVIMergeV", "ReadVIMergeX", mx,
3046-
forcePassthruRead=true>;
3047-
def "_VIM" # "_" # m.MX:
3048-
VPseudoTiedBinaryCarryIn<GetVRegNoV0<m.vrclass>.R,
3049-
m.vrclass, simm5, m>,
3050-
SchedUnary<"WriteVIMergeI", "ReadVIMergeV", mx,
3051-
forcePassthruRead=true>;
3037+
def "_VVM"#"_"#m.MX : VPseudoTiedBinaryCarryIn<GetVRegNoV0<m.vrclass>.R,
3038+
GetVRegNoV0<m.vrclass>.R,
3039+
GetVRegNoV0<m.vrclass>.R, m>,
3040+
SchedBinary<"WriteVIMergeV", "ReadVIMergeV", "ReadVIMergeV", mx,
3041+
forcePassthruRead = true>;
3042+
def "_VXM"#"_"#m.MX
3043+
: VPseudoTiedBinaryCarryIn<GetVRegNoV0<m.vrclass>.R,
3044+
GetVRegNoV0<m.vrclass>.R, GPR, m>,
3045+
SchedBinary<"WriteVIMergeX", "ReadVIMergeV", "ReadVIMergeX", mx,
3046+
forcePassthruRead = true>;
3047+
def "_VIM"#"_"#m.MX
3048+
: VPseudoTiedBinaryCarryIn<GetVRegNoV0<m.vrclass>.R,
3049+
GetVRegNoV0<m.vrclass>.R, simm5, m>,
3050+
SchedUnary<"WriteVIMergeI", "ReadVIMergeV", mx,
3051+
forcePassthruRead = true>;
30523052
}
30533053
}
30543054

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
@@ -718,9 +714,9 @@ bool RISCVVectorPeephole::foldVMergeToMask(MachineInstr &MI) const {
718714
if (RISCV::getRVVMCOpcode(MI.getOpcode()) != RISCV::VMERGE_VVM)
719715
return false;
720716

721-
Register PassthruReg = MI.getOperand(1).getReg();
722-
Register FalseReg = MI.getOperand(2).getReg();
723-
Register TrueReg = MI.getOperand(3).getReg();
717+
Register PassthruReg = lookThruCopies(MI.getOperand(1).getReg());
718+
Register FalseReg = lookThruCopies(MI.getOperand(2).getReg());
719+
Register TrueReg = lookThruCopies(MI.getOperand(3).getReg());
724720
if (!TrueReg.isVirtual() || !MRI->hasOneUse(TrueReg))
725721
return false;
726722
MachineInstr &True = *MRI->getUniqueVRegDef(TrueReg);
@@ -741,14 +737,15 @@ bool RISCVVectorPeephole::foldVMergeToMask(MachineInstr &MI) const {
741737

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

747743
// If True has a passthru operand then it needs to be the same as vmerge's
748744
// False, since False will be used for the result's passthru operand.
749-
Register TruePassthru = True.getOperand(True.getNumExplicitDefs()).getReg();
745+
Register TruePassthru =
746+
lookThruCopies(True.getOperand(True.getNumExplicitDefs()).getReg());
750747
if (RISCVII::isFirstDefTiedToFirstUse(True.getDesc()) && TruePassthru &&
751-
!isKnownSameDefs(TruePassthru, FalseReg))
748+
!(TruePassthru.isVirtual() && TruePassthru == FalseReg))
752749
return false;
753750

754751
// Make sure it doesn't raise any observable fp exceptions, since changing the

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: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -311,14 +311,14 @@ 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
316318
; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma
319+
; CHECK-NEXT: vslidedown.vx v0, v7, a0
317320
; CHECK-NEXT: vslidedown.vx v5, v6, a0
318-
; CHECK-NEXT: vslidedown.vx v4, v7, a0
319321
; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, mu
320-
; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
321-
; CHECK-NEXT: vmv1r.v v0, v4
322322
; CHECK-NEXT: vadd.vi v8, v8, 1, v0.t
323323
; CHECK-NEXT: vmv1r.v v0, v5
324324
; CHECK-NEXT: vadd.vi v16, v16, 1, v0.t
@@ -425,11 +425,12 @@ define i32 @test_nxv256i1(<vscale x 256 x i1> %x) {
425425
; CHECK-NEXT: vmerge.vim v16, v8, 1, v0
426426
; CHECK-NEXT: vsetvli a2, zero, e8, mf2, ta, ma
427427
; CHECK-NEXT: vslidedown.vx v0, v5, a1
428+
; CHECK-NEXT: vsetvli a2, zero, e32, m8, ta, ma
429+
; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
430+
; CHECK-NEXT: vsetvli a2, zero, e8, mf2, ta, ma
431+
; CHECK-NEXT: vslidedown.vx v0, v6, a1
428432
; CHECK-NEXT: vslidedown.vx v5, v7, a1
429-
; CHECK-NEXT: vslidedown.vx v4, v6, a1
430433
; CHECK-NEXT: vsetvli a2, zero, e32, m8, ta, mu
431-
; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
432-
; CHECK-NEXT: vmv1r.v v0, v4
433434
; CHECK-NEXT: vadd.vi v8, v8, 1, v0.t
434435
; CHECK-NEXT: vmv1r.v v0, v5
435436
; CHECK-NEXT: vadd.vi v16, v16, 1, v0.t

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)