Skip to content

Commit 9596c92

Browse files
authored
[RISCV] Use LD_RV32/SD_RV32 for spills and reloads when Zilsd is enabled (#153595)
We are currently only using `PseudoRV32ZdinxSD/LD` for spills and reloads when the register class is `GPRPairRegClass` . However, we can use `LD_RV32/SD_RV32` when the `Zilsd` extension is enabled and certain alignment requirements are met.
1 parent 30596a0 commit 9596c92

File tree

3 files changed

+385
-42
lines changed

3 files changed

+385
-42
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,7 @@ void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
652652
MachineInstr::MIFlag Flags) const {
653653
MachineFunction *MF = MBB.getParent();
654654
MachineFrameInfo &MFI = MF->getFrameInfo();
655+
Align Alignment = MFI.getObjectAlign(FI);
655656

656657
unsigned Opcode;
657658
if (RISCV::GPRRegClass.hasSubClassEq(RC)) {
@@ -662,7 +663,12 @@ void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
662663
} else if (RISCV::GPRF32RegClass.hasSubClassEq(RC)) {
663664
Opcode = RISCV::SW_INX;
664665
} else if (RISCV::GPRPairRegClass.hasSubClassEq(RC)) {
665-
Opcode = RISCV::PseudoRV32ZdinxSD;
666+
if (!STI.is64Bit() && STI.hasStdExtZilsd() &&
667+
Alignment >= STI.getZilsdAlign()) {
668+
Opcode = RISCV::SD_RV32;
669+
} else {
670+
Opcode = RISCV::PseudoRV32ZdinxSD;
671+
}
666672
} else if (RISCV::FPR16RegClass.hasSubClassEq(RC)) {
667673
Opcode = RISCV::FSH;
668674
} else if (RISCV::FPR32RegClass.hasSubClassEq(RC)) {
@@ -705,7 +711,7 @@ void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
705711
if (RISCVRegisterInfo::isRVVRegClass(RC)) {
706712
MachineMemOperand *MMO = MF->getMachineMemOperand(
707713
MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOStore,
708-
TypeSize::getScalable(MFI.getObjectSize(FI)), MFI.getObjectAlign(FI));
714+
TypeSize::getScalable(MFI.getObjectSize(FI)), Alignment);
709715

710716
MFI.setStackID(FI, TargetStackID::ScalableVector);
711717
BuildMI(MBB, I, DebugLoc(), get(Opcode))
@@ -717,7 +723,7 @@ void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
717723
} else {
718724
MachineMemOperand *MMO = MF->getMachineMemOperand(
719725
MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOStore,
720-
MFI.getObjectSize(FI), MFI.getObjectAlign(FI));
726+
MFI.getObjectSize(FI), Alignment);
721727

722728
BuildMI(MBB, I, DebugLoc(), get(Opcode))
723729
.addReg(SrcReg, getKillRegState(IsKill))
@@ -736,6 +742,7 @@ void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
736742
MachineInstr::MIFlag Flags) const {
737743
MachineFunction *MF = MBB.getParent();
738744
MachineFrameInfo &MFI = MF->getFrameInfo();
745+
Align Alignment = MFI.getObjectAlign(FI);
739746
DebugLoc DL =
740747
Flags & MachineInstr::FrameDestroy ? MBB.findDebugLoc(I) : DebugLoc();
741748

@@ -748,7 +755,12 @@ void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
748755
} else if (RISCV::GPRF32RegClass.hasSubClassEq(RC)) {
749756
Opcode = RISCV::LW_INX;
750757
} else if (RISCV::GPRPairRegClass.hasSubClassEq(RC)) {
751-
Opcode = RISCV::PseudoRV32ZdinxLD;
758+
if (!STI.is64Bit() && STI.hasStdExtZilsd() &&
759+
Alignment >= STI.getZilsdAlign()) {
760+
Opcode = RISCV::LD_RV32;
761+
} else {
762+
Opcode = RISCV::PseudoRV32ZdinxLD;
763+
}
752764
} else if (RISCV::FPR16RegClass.hasSubClassEq(RC)) {
753765
Opcode = RISCV::FLH;
754766
} else if (RISCV::FPR32RegClass.hasSubClassEq(RC)) {
@@ -791,7 +803,7 @@ void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
791803
if (RISCVRegisterInfo::isRVVRegClass(RC)) {
792804
MachineMemOperand *MMO = MF->getMachineMemOperand(
793805
MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOLoad,
794-
TypeSize::getScalable(MFI.getObjectSize(FI)), MFI.getObjectAlign(FI));
806+
TypeSize::getScalable(MFI.getObjectSize(FI)), Alignment);
795807

796808
MFI.setStackID(FI, TargetStackID::ScalableVector);
797809
BuildMI(MBB, I, DL, get(Opcode), DstReg)
@@ -802,7 +814,7 @@ void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
802814
} else {
803815
MachineMemOperand *MMO = MF->getMachineMemOperand(
804816
MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOLoad,
805-
MFI.getObjectSize(FI), MFI.getObjectAlign(FI));
817+
MFI.getObjectSize(FI), Alignment);
806818

807819
BuildMI(MBB, I, DL, get(Opcode), DstReg)
808820
.addFrameIndex(FI)

0 commit comments

Comments
 (0)