Skip to content

Commit c18e78c

Browse files
authored
[RISCV] Add copyPhysRegVector to extract common vector code out of copyPhysRegVector. (#70497)
Call this method directly from each vector case with the correct arguments. This allows us to treat each type of copy as its own special case and not pass variables to a common merge point. This is similar to how AArch64 is structured. I think I can reduce the number of operands to this new method, but I'll do that as a follow up.
1 parent 124613c commit c18e78c

File tree

2 files changed

+176
-146
lines changed

2 files changed

+176
-146
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

Lines changed: 170 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -294,153 +294,12 @@ static bool isConvertibleToVMV_V_V(const RISCVSubtarget &STI,
294294
return false;
295295
}
296296

297-
void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
298-
MachineBasicBlock::iterator MBBI,
299-
const DebugLoc &DL, MCRegister DstReg,
300-
MCRegister SrcReg, bool KillSrc) const {
297+
void RISCVInstrInfo::copyPhysRegVector(
298+
MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
299+
const DebugLoc &DL, MCRegister DstReg, MCRegister SrcReg, bool KillSrc,
300+
unsigned Opc, unsigned NF, RISCVII::VLMUL LMul, unsigned SubRegIdx) const {
301301
const TargetRegisterInfo *TRI = STI.getRegisterInfo();
302302

303-
if (RISCV::GPRRegClass.contains(DstReg, SrcReg)) {
304-
BuildMI(MBB, MBBI, DL, get(RISCV::ADDI), DstReg)
305-
.addReg(SrcReg, getKillRegState(KillSrc))
306-
.addImm(0);
307-
return;
308-
}
309-
310-
if (RISCV::GPRPF64RegClass.contains(DstReg, SrcReg)) {
311-
// Emit an ADDI for both parts of GPRPF64.
312-
BuildMI(MBB, MBBI, DL, get(RISCV::ADDI),
313-
TRI->getSubReg(DstReg, RISCV::sub_32))
314-
.addReg(TRI->getSubReg(SrcReg, RISCV::sub_32), getKillRegState(KillSrc))
315-
.addImm(0);
316-
BuildMI(MBB, MBBI, DL, get(RISCV::ADDI),
317-
TRI->getSubReg(DstReg, RISCV::sub_32_hi))
318-
.addReg(TRI->getSubReg(SrcReg, RISCV::sub_32_hi),
319-
getKillRegState(KillSrc))
320-
.addImm(0);
321-
return;
322-
}
323-
324-
// Handle copy from csr
325-
if (RISCV::VCSRRegClass.contains(SrcReg) &&
326-
RISCV::GPRRegClass.contains(DstReg)) {
327-
BuildMI(MBB, MBBI, DL, get(RISCV::CSRRS), DstReg)
328-
.addImm(RISCVSysReg::lookupSysRegByName(TRI->getName(SrcReg))->Encoding)
329-
.addReg(RISCV::X0);
330-
return;
331-
}
332-
333-
if (RISCV::FPR16RegClass.contains(DstReg, SrcReg)) {
334-
unsigned Opc;
335-
if (STI.hasStdExtZfh()) {
336-
Opc = RISCV::FSGNJ_H;
337-
} else {
338-
assert(STI.hasStdExtF() &&
339-
(STI.hasStdExtZfhmin() || STI.hasStdExtZfbfmin()) &&
340-
"Unexpected extensions");
341-
// Zfhmin/Zfbfmin doesn't have FSGNJ_H, replace FSGNJ_H with FSGNJ_S.
342-
DstReg = TRI->getMatchingSuperReg(DstReg, RISCV::sub_16,
343-
&RISCV::FPR32RegClass);
344-
SrcReg = TRI->getMatchingSuperReg(SrcReg, RISCV::sub_16,
345-
&RISCV::FPR32RegClass);
346-
Opc = RISCV::FSGNJ_S;
347-
}
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)) {
374-
Opc = RISCV::VMV1R_V;
375-
LMul = RISCVII::LMUL_1;
376-
} else if (RISCV::VRM2RegClass.contains(DstReg, SrcReg)) {
377-
Opc = RISCV::VMV2R_V;
378-
LMul = RISCVII::LMUL_2;
379-
} else if (RISCV::VRM4RegClass.contains(DstReg, SrcReg)) {
380-
Opc = RISCV::VMV4R_V;
381-
LMul = RISCVII::LMUL_4;
382-
} else if (RISCV::VRM8RegClass.contains(DstReg, SrcReg)) {
383-
Opc = RISCV::VMV8R_V;
384-
LMul = RISCVII::LMUL_8;
385-
} else if (RISCV::VRN2M1RegClass.contains(DstReg, SrcReg)) {
386-
Opc = RISCV::VMV1R_V;
387-
SubRegIdx = RISCV::sub_vrm1_0;
388-
NF = 2;
389-
LMul = RISCVII::LMUL_1;
390-
} else if (RISCV::VRN2M2RegClass.contains(DstReg, SrcReg)) {
391-
Opc = RISCV::VMV2R_V;
392-
SubRegIdx = RISCV::sub_vrm2_0;
393-
NF = 2;
394-
LMul = RISCVII::LMUL_2;
395-
} else if (RISCV::VRN2M4RegClass.contains(DstReg, SrcReg)) {
396-
Opc = RISCV::VMV4R_V;
397-
SubRegIdx = RISCV::sub_vrm4_0;
398-
NF = 2;
399-
LMul = RISCVII::LMUL_4;
400-
} else if (RISCV::VRN3M1RegClass.contains(DstReg, SrcReg)) {
401-
Opc = RISCV::VMV1R_V;
402-
SubRegIdx = RISCV::sub_vrm1_0;
403-
NF = 3;
404-
LMul = RISCVII::LMUL_1;
405-
} else if (RISCV::VRN3M2RegClass.contains(DstReg, SrcReg)) {
406-
Opc = RISCV::VMV2R_V;
407-
SubRegIdx = RISCV::sub_vrm2_0;
408-
NF = 3;
409-
LMul = RISCVII::LMUL_2;
410-
} else if (RISCV::VRN4M1RegClass.contains(DstReg, SrcReg)) {
411-
Opc = RISCV::VMV1R_V;
412-
SubRegIdx = RISCV::sub_vrm1_0;
413-
NF = 4;
414-
LMul = RISCVII::LMUL_1;
415-
} else if (RISCV::VRN4M2RegClass.contains(DstReg, SrcReg)) {
416-
Opc = RISCV::VMV2R_V;
417-
SubRegIdx = RISCV::sub_vrm2_0;
418-
NF = 4;
419-
LMul = RISCVII::LMUL_2;
420-
} else if (RISCV::VRN5M1RegClass.contains(DstReg, SrcReg)) {
421-
Opc = RISCV::VMV1R_V;
422-
SubRegIdx = RISCV::sub_vrm1_0;
423-
NF = 5;
424-
LMul = RISCVII::LMUL_1;
425-
} else if (RISCV::VRN6M1RegClass.contains(DstReg, SrcReg)) {
426-
Opc = RISCV::VMV1R_V;
427-
SubRegIdx = RISCV::sub_vrm1_0;
428-
NF = 6;
429-
LMul = RISCVII::LMUL_1;
430-
} else if (RISCV::VRN7M1RegClass.contains(DstReg, SrcReg)) {
431-
Opc = RISCV::VMV1R_V;
432-
SubRegIdx = RISCV::sub_vrm1_0;
433-
NF = 7;
434-
LMul = RISCVII::LMUL_1;
435-
} else if (RISCV::VRN8M1RegClass.contains(DstReg, SrcReg)) {
436-
Opc = RISCV::VMV1R_V;
437-
SubRegIdx = RISCV::sub_vrm1_0;
438-
NF = 8;
439-
LMul = RISCVII::LMUL_1;
440-
} else {
441-
llvm_unreachable("Impossible reg-to-reg copy");
442-
}
443-
444303
bool UseVMV_V_V = false;
445304
bool UseVMV_V_I = false;
446305
MachineBasicBlock::const_iterator DefMBBI;
@@ -518,7 +377,7 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
518377
getKillRegState(KillSrc));
519378
if (UseVMV_V_V) {
520379
const MCInstrDesc &Desc = DefMBBI->getDesc();
521-
MIB.add(DefMBBI->getOperand(RISCVII::getVLOpNum(Desc))); // AVL
380+
MIB.add(DefMBBI->getOperand(RISCVII::getVLOpNum(Desc))); // AVL
522381
MIB.add(DefMBBI->getOperand(RISCVII::getSEWOpNum(Desc))); // SEW
523382
MIB.addImm(0); // tu, mu
524383
MIB.addReg(RISCV::VL, RegState::Implicit);
@@ -528,6 +387,171 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
528387
}
529388
}
530389

390+
void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
391+
MachineBasicBlock::iterator MBBI,
392+
const DebugLoc &DL, MCRegister DstReg,
393+
MCRegister SrcReg, bool KillSrc) const {
394+
const TargetRegisterInfo *TRI = STI.getRegisterInfo();
395+
396+
if (RISCV::GPRRegClass.contains(DstReg, SrcReg)) {
397+
BuildMI(MBB, MBBI, DL, get(RISCV::ADDI), DstReg)
398+
.addReg(SrcReg, getKillRegState(KillSrc))
399+
.addImm(0);
400+
return;
401+
}
402+
403+
if (RISCV::GPRPF64RegClass.contains(DstReg, SrcReg)) {
404+
// Emit an ADDI for both parts of GPRPF64.
405+
BuildMI(MBB, MBBI, DL, get(RISCV::ADDI),
406+
TRI->getSubReg(DstReg, RISCV::sub_32))
407+
.addReg(TRI->getSubReg(SrcReg, RISCV::sub_32), getKillRegState(KillSrc))
408+
.addImm(0);
409+
BuildMI(MBB, MBBI, DL, get(RISCV::ADDI),
410+
TRI->getSubReg(DstReg, RISCV::sub_32_hi))
411+
.addReg(TRI->getSubReg(SrcReg, RISCV::sub_32_hi),
412+
getKillRegState(KillSrc))
413+
.addImm(0);
414+
return;
415+
}
416+
417+
// Handle copy from csr
418+
if (RISCV::VCSRRegClass.contains(SrcReg) &&
419+
RISCV::GPRRegClass.contains(DstReg)) {
420+
BuildMI(MBB, MBBI, DL, get(RISCV::CSRRS), DstReg)
421+
.addImm(RISCVSysReg::lookupSysRegByName(TRI->getName(SrcReg))->Encoding)
422+
.addReg(RISCV::X0);
423+
return;
424+
}
425+
426+
if (RISCV::FPR16RegClass.contains(DstReg, SrcReg)) {
427+
unsigned Opc;
428+
if (STI.hasStdExtZfh()) {
429+
Opc = RISCV::FSGNJ_H;
430+
} else {
431+
assert(STI.hasStdExtF() &&
432+
(STI.hasStdExtZfhmin() || STI.hasStdExtZfbfmin()) &&
433+
"Unexpected extensions");
434+
// Zfhmin/Zfbfmin doesn't have FSGNJ_H, replace FSGNJ_H with FSGNJ_S.
435+
DstReg = TRI->getMatchingSuperReg(DstReg, RISCV::sub_16,
436+
&RISCV::FPR32RegClass);
437+
SrcReg = TRI->getMatchingSuperReg(SrcReg, RISCV::sub_16,
438+
&RISCV::FPR32RegClass);
439+
Opc = RISCV::FSGNJ_S;
440+
}
441+
BuildMI(MBB, MBBI, DL, get(Opc), DstReg)
442+
.addReg(SrcReg, getKillRegState(KillSrc))
443+
.addReg(SrcReg, getKillRegState(KillSrc));
444+
return;
445+
}
446+
447+
if (RISCV::FPR32RegClass.contains(DstReg, SrcReg)) {
448+
BuildMI(MBB, MBBI, DL, get(RISCV::FSGNJ_S), DstReg)
449+
.addReg(SrcReg, getKillRegState(KillSrc))
450+
.addReg(SrcReg, getKillRegState(KillSrc));
451+
return;
452+
}
453+
454+
if (RISCV::FPR64RegClass.contains(DstReg, SrcReg)) {
455+
BuildMI(MBB, MBBI, DL, get(RISCV::FSGNJ_D), DstReg)
456+
.addReg(SrcReg, getKillRegState(KillSrc))
457+
.addReg(SrcReg, getKillRegState(KillSrc));
458+
return;
459+
}
460+
461+
// VR->VR copies.
462+
if (RISCV::VRRegClass.contains(DstReg, SrcReg)) {
463+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
464+
/*NF=*/1, RISCVII::LMUL_1, RISCV::sub_vrm1_0);
465+
return;
466+
}
467+
468+
if (RISCV::VRM2RegClass.contains(DstReg, SrcReg)) {
469+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV2R_V,
470+
/*NF=*/1, RISCVII::LMUL_2, RISCV::sub_vrm1_0);
471+
return;
472+
}
473+
474+
if (RISCV::VRM4RegClass.contains(DstReg, SrcReg)) {
475+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV4R_V,
476+
/*NF=*/1, RISCVII::LMUL_4, RISCV::sub_vrm1_0);
477+
return;
478+
}
479+
480+
if (RISCV::VRM8RegClass.contains(DstReg, SrcReg)) {
481+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV8R_V,
482+
/*NF=*/1, RISCVII::LMUL_8, RISCV::sub_vrm1_0);
483+
return;
484+
}
485+
486+
if (RISCV::VRN2M1RegClass.contains(DstReg, SrcReg)) {
487+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
488+
/*NF=*/2, RISCVII::LMUL_1, RISCV::sub_vrm1_0);
489+
return;
490+
}
491+
492+
if (RISCV::VRN2M2RegClass.contains(DstReg, SrcReg)) {
493+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV2R_V,
494+
/*NF=*/2, RISCVII::LMUL_2, RISCV::sub_vrm2_0);
495+
return;
496+
}
497+
498+
if (RISCV::VRN2M4RegClass.contains(DstReg, SrcReg)) {
499+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV4R_V,
500+
/*NF=*/2, RISCVII::LMUL_4, RISCV::sub_vrm4_0);
501+
return;
502+
}
503+
504+
if (RISCV::VRN3M1RegClass.contains(DstReg, SrcReg)) {
505+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
506+
/*NF=*/3, RISCVII::LMUL_1, RISCV::sub_vrm1_0);
507+
return;
508+
}
509+
510+
if (RISCV::VRN3M2RegClass.contains(DstReg, SrcReg)) {
511+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV2R_V,
512+
/*NF=*/3, RISCVII::LMUL_2, RISCV::sub_vrm2_0);
513+
return;
514+
}
515+
516+
if (RISCV::VRN4M1RegClass.contains(DstReg, SrcReg)) {
517+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
518+
/*NF=*/4, RISCVII::LMUL_1, RISCV::sub_vrm1_0);
519+
return;
520+
}
521+
522+
if (RISCV::VRN4M2RegClass.contains(DstReg, SrcReg)) {
523+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV2R_V,
524+
/*NF=*/4, RISCVII::LMUL_2, RISCV::sub_vrm2_0);
525+
return;
526+
}
527+
528+
if (RISCV::VRN5M1RegClass.contains(DstReg, SrcReg)) {
529+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
530+
/*NF=*/5, RISCVII::LMUL_1, RISCV::sub_vrm1_0);
531+
return;
532+
}
533+
534+
if (RISCV::VRN6M1RegClass.contains(DstReg, SrcReg)) {
535+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
536+
/*NF=*/6, RISCVII::LMUL_1, RISCV::sub_vrm1_0);
537+
return;
538+
}
539+
540+
if (RISCV::VRN7M1RegClass.contains(DstReg, SrcReg)) {
541+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
542+
/*NF=*/7, RISCVII::LMUL_1, RISCV::sub_vrm1_0);
543+
return;
544+
}
545+
546+
if (RISCV::VRN8M1RegClass.contains(DstReg, SrcReg)) {
547+
copyPhysRegVector(MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
548+
/*NF=*/8, RISCVII::LMUL_1, RISCV::sub_vrm1_0);
549+
return;
550+
}
551+
552+
llvm_unreachable("Impossible reg-to-reg copy");
553+
}
554+
531555
void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
532556
MachineBasicBlock::iterator I,
533557
Register SrcReg, bool IsKill, int FI,

llvm/lib/Target/RISCV/RISCVInstrInfo.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#ifndef LLVM_LIB_TARGET_RISCV_RISCVINSTRINFO_H
1414
#define LLVM_LIB_TARGET_RISCV_RISCVINSTRINFO_H
1515

16+
#include "MCTargetDesc/RISCVBaseInfo.h"
1617
#include "RISCVRegisterInfo.h"
1718
#include "llvm/CodeGen/TargetInstrInfo.h"
1819
#include "llvm/IR/DiagnosticInfo.h"
@@ -63,6 +64,11 @@ class RISCVInstrInfo : public RISCVGenInstrInfo {
6364
unsigned isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex,
6465
unsigned &MemBytes) const override;
6566

67+
void copyPhysRegVector(MachineBasicBlock &MBB,
68+
MachineBasicBlock::iterator MBBI, const DebugLoc &DL,
69+
MCRegister DstReg, MCRegister SrcReg, bool KillSrc,
70+
unsigned Opc, unsigned NF, RISCVII::VLMUL LMul,
71+
unsigned SubRegIdx) const;
6672
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
6773
const DebugLoc &DL, MCRegister DstReg, MCRegister SrcReg,
6874
bool KillSrc) const override;

0 commit comments

Comments
 (0)