@@ -476,8 +476,8 @@ static void assignCalleeSavedSpillSlots(MachineFunction &F,
476476 // Now that we know which registers need to be saved and restored, allocate
477477 // stack slots for them.
478478 for (auto &CS : CSI) {
479- // If the target has spilled this register to another register or already
480- // handled it , we don't need to allocate a stack slot.
479+ // If the target has spilled this register to another register, we don't
480+ // need to allocate a stack slot.
481481 if (CS.isSpilledToReg ())
482482 continue ;
483483
@@ -597,14 +597,25 @@ static void updateLiveness(MachineFunction &MF) {
597597static void insertCSRSaves (MachineBasicBlock &SaveBlock,
598598 ArrayRef<CalleeSavedInfo> CSI) {
599599 MachineFunction &MF = *SaveBlock.getParent ();
600- const TargetInstrInfo * TII = MF.getSubtarget ().getInstrInfo ();
600+ const TargetInstrInfo & TII = * MF.getSubtarget ().getInstrInfo ();
601601 const TargetFrameLowering *TFI = MF.getSubtarget ().getFrameLowering ();
602602 const TargetRegisterInfo *TRI = MF.getSubtarget ().getRegisterInfo ();
603603
604604 MachineBasicBlock::iterator I = SaveBlock.begin ();
605605 if (!TFI->spillCalleeSavedRegisters (SaveBlock, I, CSI, TRI)) {
606606 for (const CalleeSavedInfo &CS : CSI) {
607- TFI->spillCalleeSavedRegister (SaveBlock, I, CS, TII, TRI);
607+ // Insert the spill to the stack frame.
608+ MCRegister Reg = CS.getReg ();
609+
610+ if (CS.isSpilledToReg ()) {
611+ BuildMI (SaveBlock, I, DebugLoc (), TII.get (TargetOpcode::COPY),
612+ CS.getDstReg ())
613+ .addReg (Reg, getKillRegState (true ));
614+ } else {
615+ const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass (Reg);
616+ TII.storeRegToStackSlot (SaveBlock, I, Reg, true , CS.getFrameIdx (), RC,
617+ TRI, Register ());
618+ }
608619 }
609620 }
610621}
@@ -613,7 +624,7 @@ static void insertCSRSaves(MachineBasicBlock &SaveBlock,
613624static void insertCSRRestores (MachineBasicBlock &RestoreBlock,
614625 std::vector<CalleeSavedInfo> &CSI) {
615626 MachineFunction &MF = *RestoreBlock.getParent ();
616- const TargetInstrInfo * TII = MF.getSubtarget ().getInstrInfo ();
627+ const TargetInstrInfo & TII = * MF.getSubtarget ().getInstrInfo ();
617628 const TargetFrameLowering *TFI = MF.getSubtarget ().getFrameLowering ();
618629 const TargetRegisterInfo *TRI = MF.getSubtarget ().getRegisterInfo ();
619630
@@ -623,7 +634,19 @@ static void insertCSRRestores(MachineBasicBlock &RestoreBlock,
623634
624635 if (!TFI->restoreCalleeSavedRegisters (RestoreBlock, I, CSI, TRI)) {
625636 for (const CalleeSavedInfo &CI : reverse (CSI)) {
626- TFI->restoreCalleeSavedRegister (RestoreBlock, I, CI, TII, TRI);
637+ MCRegister Reg = CI.getReg ();
638+ if (CI.isSpilledToReg ()) {
639+ BuildMI (RestoreBlock, I, DebugLoc (), TII.get (TargetOpcode::COPY), Reg)
640+ .addReg (CI.getDstReg (), getKillRegState (true ));
641+ } else {
642+ const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass (Reg);
643+ TII.loadRegFromStackSlot (RestoreBlock, I, Reg, CI.getFrameIdx (), RC,
644+ TRI, Register ());
645+ assert (I != RestoreBlock.begin () &&
646+ " loadRegFromStackSlot didn't insert any code!" );
647+ // Insert in reverse order. loadRegFromStackSlot can insert
648+ // multiple instructions.
649+ }
627650 }
628651 }
629652}
0 commit comments