Skip to content

Commit 124613c

Browse files
authored
[RISCV] Separate FPR and VR copyPhysReg implementation. (#70492)
This duplicates the BuildMI from the 3 FP copy types, but separates them from the VR code and gets rid of the IsScalableVector flag. I need to add FPR<->GPR copies for GISel which needs another variation of BuildMI. So it seems cleaner to start enumerating each case as its own if.
1 parent 2463a0e commit 124613c

File tree

1 file changed

+96
-90
lines changed

1 file changed

+96
-90
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

Lines changed: 96 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -330,13 +330,8 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
330330
return;
331331
}
332332

333-
// FPR->FPR copies and VR->VR copies.
334-
unsigned Opc;
335-
bool IsScalableVector = true;
336-
unsigned NF = 1;
337-
RISCVII::VLMUL LMul = RISCVII::LMUL_1;
338-
unsigned SubRegIdx = RISCV::sub_vrm1_0;
339333
if (RISCV::FPR16RegClass.contains(DstReg, SrcReg)) {
334+
unsigned Opc;
340335
if (STI.hasStdExtZfh()) {
341336
Opc = RISCV::FSGNJ_H;
342337
} else {
@@ -350,14 +345,32 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
350345
&RISCV::FPR32RegClass);
351346
Opc = RISCV::FSGNJ_S;
352347
}
353-
IsScalableVector = false;
354-
} else if (RISCV::FPR32RegClass.contains(DstReg, SrcReg)) {
355-
Opc = RISCV::FSGNJ_S;
356-
IsScalableVector = false;
357-
} else if (RISCV::FPR64RegClass.contains(DstReg, SrcReg)) {
358-
Opc = RISCV::FSGNJ_D;
359-
IsScalableVector = false;
360-
} else if (RISCV::VRRegClass.contains(DstReg, SrcReg)) {
348+
BuildMI(MBB, MBBI, DL, get(Opc), DstReg)
349+
.addReg(SrcReg, getKillRegState(KillSrc))
350+
.addReg(SrcReg, getKillRegState(KillSrc));
351+
return;
352+
}
353+
354+
if (RISCV::FPR32RegClass.contains(DstReg, SrcReg)) {
355+
BuildMI(MBB, MBBI, DL, get(RISCV::FSGNJ_S), DstReg)
356+
.addReg(SrcReg, getKillRegState(KillSrc))
357+
.addReg(SrcReg, getKillRegState(KillSrc));
358+
return;
359+
}
360+
361+
if (RISCV::FPR64RegClass.contains(DstReg, SrcReg)) {
362+
BuildMI(MBB, MBBI, DL, get(RISCV::FSGNJ_D), DstReg)
363+
.addReg(SrcReg, getKillRegState(KillSrc))
364+
.addReg(SrcReg, getKillRegState(KillSrc));
365+
return;
366+
}
367+
368+
// VR->VR copies.
369+
unsigned Opc;
370+
unsigned NF = 1;
371+
RISCVII::VLMUL LMul = RISCVII::LMUL_1;
372+
unsigned SubRegIdx = RISCV::sub_vrm1_0;
373+
if (RISCV::VRRegClass.contains(DstReg, SrcReg)) {
361374
Opc = RISCV::VMV1R_V;
362375
LMul = RISCVII::LMUL_1;
363376
} else if (RISCV::VRM2RegClass.contains(DstReg, SrcReg)) {
@@ -428,97 +441,90 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
428441
llvm_unreachable("Impossible reg-to-reg copy");
429442
}
430443

431-
if (IsScalableVector) {
432-
bool UseVMV_V_V = false;
433-
bool UseVMV_V_I = false;
434-
MachineBasicBlock::const_iterator DefMBBI;
435-
if (isConvertibleToVMV_V_V(STI, MBB, MBBI, DefMBBI, LMul)) {
436-
UseVMV_V_V = true;
437-
// We only need to handle LMUL = 1/2/4/8 here because we only define
438-
// vector register classes for LMUL = 1/2/4/8.
439-
unsigned VIOpc;
440-
switch (LMul) {
441-
default:
442-
llvm_unreachable("Impossible LMUL for vector register copy.");
443-
case RISCVII::LMUL_1:
444-
Opc = RISCV::PseudoVMV_V_V_M1;
445-
VIOpc = RISCV::PseudoVMV_V_I_M1;
446-
break;
447-
case RISCVII::LMUL_2:
448-
Opc = RISCV::PseudoVMV_V_V_M2;
449-
VIOpc = RISCV::PseudoVMV_V_I_M2;
450-
break;
451-
case RISCVII::LMUL_4:
452-
Opc = RISCV::PseudoVMV_V_V_M4;
453-
VIOpc = RISCV::PseudoVMV_V_I_M4;
454-
break;
455-
case RISCVII::LMUL_8:
456-
Opc = RISCV::PseudoVMV_V_V_M8;
457-
VIOpc = RISCV::PseudoVMV_V_I_M8;
458-
break;
459-
}
444+
bool UseVMV_V_V = false;
445+
bool UseVMV_V_I = false;
446+
MachineBasicBlock::const_iterator DefMBBI;
447+
if (isConvertibleToVMV_V_V(STI, MBB, MBBI, DefMBBI, LMul)) {
448+
UseVMV_V_V = true;
449+
// We only need to handle LMUL = 1/2/4/8 here because we only define
450+
// vector register classes for LMUL = 1/2/4/8.
451+
unsigned VIOpc;
452+
switch (LMul) {
453+
default:
454+
llvm_unreachable("Impossible LMUL for vector register copy.");
455+
case RISCVII::LMUL_1:
456+
Opc = RISCV::PseudoVMV_V_V_M1;
457+
VIOpc = RISCV::PseudoVMV_V_I_M1;
458+
break;
459+
case RISCVII::LMUL_2:
460+
Opc = RISCV::PseudoVMV_V_V_M2;
461+
VIOpc = RISCV::PseudoVMV_V_I_M2;
462+
break;
463+
case RISCVII::LMUL_4:
464+
Opc = RISCV::PseudoVMV_V_V_M4;
465+
VIOpc = RISCV::PseudoVMV_V_I_M4;
466+
break;
467+
case RISCVII::LMUL_8:
468+
Opc = RISCV::PseudoVMV_V_V_M8;
469+
VIOpc = RISCV::PseudoVMV_V_I_M8;
470+
break;
471+
}
460472

461-
if (DefMBBI->getOpcode() == VIOpc) {
462-
UseVMV_V_I = true;
463-
Opc = VIOpc;
464-
}
473+
if (DefMBBI->getOpcode() == VIOpc) {
474+
UseVMV_V_I = true;
475+
Opc = VIOpc;
465476
}
477+
}
466478

467-
if (NF == 1) {
468-
auto MIB = BuildMI(MBB, MBBI, DL, get(Opc), DstReg);
479+
if (NF == 1) {
480+
auto MIB = BuildMI(MBB, MBBI, DL, get(Opc), DstReg);
481+
if (UseVMV_V_V)
482+
MIB.addReg(DstReg, RegState::Undef);
483+
if (UseVMV_V_I)
484+
MIB = MIB.add(DefMBBI->getOperand(2));
485+
else
486+
MIB = MIB.addReg(SrcReg, getKillRegState(KillSrc));
487+
if (UseVMV_V_V) {
488+
const MCInstrDesc &Desc = DefMBBI->getDesc();
489+
MIB.add(DefMBBI->getOperand(RISCVII::getVLOpNum(Desc))); // AVL
490+
MIB.add(DefMBBI->getOperand(RISCVII::getSEWOpNum(Desc))); // SEW
491+
MIB.addImm(0); // tu, mu
492+
MIB.addReg(RISCV::VL, RegState::Implicit);
493+
MIB.addReg(RISCV::VTYPE, RegState::Implicit);
494+
}
495+
} else {
496+
int I = 0, End = NF, Incr = 1;
497+
unsigned SrcEncoding = TRI->getEncodingValue(SrcReg);
498+
unsigned DstEncoding = TRI->getEncodingValue(DstReg);
499+
unsigned LMulVal;
500+
bool Fractional;
501+
std::tie(LMulVal, Fractional) = RISCVVType::decodeVLMUL(LMul);
502+
assert(!Fractional && "It is impossible be fractional lmul here.");
503+
if (forwardCopyWillClobberTuple(DstEncoding, SrcEncoding, NF * LMulVal)) {
504+
I = NF - 1;
505+
End = -1;
506+
Incr = -1;
507+
}
508+
509+
for (; I != End; I += Incr) {
510+
auto MIB = BuildMI(MBB, MBBI, DL, get(Opc),
511+
TRI->getSubReg(DstReg, SubRegIdx + I));
469512
if (UseVMV_V_V)
470-
MIB.addReg(DstReg, RegState::Undef);
513+
MIB.addReg(TRI->getSubReg(DstReg, SubRegIdx + I), RegState::Undef);
471514
if (UseVMV_V_I)
472515
MIB = MIB.add(DefMBBI->getOperand(2));
473516
else
474-
MIB = MIB.addReg(SrcReg, getKillRegState(KillSrc));
517+
MIB = MIB.addReg(TRI->getSubReg(SrcReg, SubRegIdx + I),
518+
getKillRegState(KillSrc));
475519
if (UseVMV_V_V) {
476520
const MCInstrDesc &Desc = DefMBBI->getDesc();
477521
MIB.add(DefMBBI->getOperand(RISCVII::getVLOpNum(Desc))); // AVL
478522
MIB.add(DefMBBI->getOperand(RISCVII::getSEWOpNum(Desc))); // SEW
479-
MIB.addImm(0); // tu, mu
523+
MIB.addImm(0); // tu, mu
480524
MIB.addReg(RISCV::VL, RegState::Implicit);
481525
MIB.addReg(RISCV::VTYPE, RegState::Implicit);
482526
}
483-
} else {
484-
int I = 0, End = NF, Incr = 1;
485-
unsigned SrcEncoding = TRI->getEncodingValue(SrcReg);
486-
unsigned DstEncoding = TRI->getEncodingValue(DstReg);
487-
unsigned LMulVal;
488-
bool Fractional;
489-
std::tie(LMulVal, Fractional) = RISCVVType::decodeVLMUL(LMul);
490-
assert(!Fractional && "It is impossible be fractional lmul here.");
491-
if (forwardCopyWillClobberTuple(DstEncoding, SrcEncoding, NF * LMulVal)) {
492-
I = NF - 1;
493-
End = -1;
494-
Incr = -1;
495-
}
496-
497-
for (; I != End; I += Incr) {
498-
auto MIB = BuildMI(MBB, MBBI, DL, get(Opc),
499-
TRI->getSubReg(DstReg, SubRegIdx + I));
500-
if (UseVMV_V_V)
501-
MIB.addReg(TRI->getSubReg(DstReg, SubRegIdx + I),
502-
RegState::Undef);
503-
if (UseVMV_V_I)
504-
MIB = MIB.add(DefMBBI->getOperand(2));
505-
else
506-
MIB = MIB.addReg(TRI->getSubReg(SrcReg, SubRegIdx + I),
507-
getKillRegState(KillSrc));
508-
if (UseVMV_V_V) {
509-
const MCInstrDesc &Desc = DefMBBI->getDesc();
510-
MIB.add(DefMBBI->getOperand(RISCVII::getVLOpNum(Desc))); // AVL
511-
MIB.add(DefMBBI->getOperand(RISCVII::getSEWOpNum(Desc))); // SEW
512-
MIB.addImm(0); // tu, mu
513-
MIB.addReg(RISCV::VL, RegState::Implicit);
514-
MIB.addReg(RISCV::VTYPE, RegState::Implicit);
515-
}
516-
}
517527
}
518-
} else {
519-
BuildMI(MBB, MBBI, DL, get(Opc), DstReg)
520-
.addReg(SrcReg, getKillRegState(KillSrc))
521-
.addReg(SrcReg, getKillRegState(KillSrc));
522528
}
523529
}
524530

0 commit comments

Comments
 (0)