@@ -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, we don't
480- // need to allocate a stack slot.
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.
481481 if (CS.isSpilledToReg ())
482482 continue ;
483483
@@ -597,25 +597,14 @@ 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- // Insert the spill to the stack frame.
608- MCRegister Reg = CS.getReg ();
609-
610- if (CS.isSpilledToReg ()) {
611- BuildMI (SaveBlock, I, DebugLoc (),
612- TII.get (TargetOpcode::COPY), 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- }
607+ TFI->spillCalleeSavedRegister (SaveBlock, I, CS, TII, TRI);
619608 }
620609 }
621610}
@@ -624,7 +613,7 @@ static void insertCSRSaves(MachineBasicBlock &SaveBlock,
624613static void insertCSRRestores (MachineBasicBlock &RestoreBlock,
625614 std::vector<CalleeSavedInfo> &CSI) {
626615 MachineFunction &MF = *RestoreBlock.getParent ();
627- const TargetInstrInfo & TII = * MF.getSubtarget ().getInstrInfo ();
616+ const TargetInstrInfo * TII = MF.getSubtarget ().getInstrInfo ();
628617 const TargetFrameLowering *TFI = MF.getSubtarget ().getFrameLowering ();
629618 const TargetRegisterInfo *TRI = MF.getSubtarget ().getRegisterInfo ();
630619
@@ -634,19 +623,7 @@ static void insertCSRRestores(MachineBasicBlock &RestoreBlock,
634623
635624 if (!TFI->restoreCalleeSavedRegisters (RestoreBlock, I, CSI, TRI)) {
636625 for (const CalleeSavedInfo &CI : reverse (CSI)) {
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- }
626+ TFI->restoreCalleeSavedRegister (RestoreBlock, I, CI, TII, TRI);
650627 }
651628 }
652629}
0 commit comments