@@ -476,8 +476,8 @@ static void assignCalleeSavedSpillSlots(MachineFunction &F,
476
476
// Now that we know which registers need to be saved and restored, allocate
477
477
// stack slots for them.
478
478
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.
481
481
if (CS.isSpilledToReg ())
482
482
continue ;
483
483
@@ -597,14 +597,25 @@ static void updateLiveness(MachineFunction &MF) {
597
597
static void insertCSRSaves (MachineBasicBlock &SaveBlock,
598
598
ArrayRef<CalleeSavedInfo> CSI) {
599
599
MachineFunction &MF = *SaveBlock.getParent ();
600
- const TargetInstrInfo * TII = MF.getSubtarget ().getInstrInfo ();
600
+ const TargetInstrInfo & TII = * MF.getSubtarget ().getInstrInfo ();
601
601
const TargetFrameLowering *TFI = MF.getSubtarget ().getFrameLowering ();
602
602
const TargetRegisterInfo *TRI = MF.getSubtarget ().getRegisterInfo ();
603
603
604
604
MachineBasicBlock::iterator I = SaveBlock.begin ();
605
605
if (!TFI->spillCalleeSavedRegisters (SaveBlock, I, CSI, TRI)) {
606
606
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
+ }
608
619
}
609
620
}
610
621
}
@@ -613,7 +624,7 @@ static void insertCSRSaves(MachineBasicBlock &SaveBlock,
613
624
static void insertCSRRestores (MachineBasicBlock &RestoreBlock,
614
625
std::vector<CalleeSavedInfo> &CSI) {
615
626
MachineFunction &MF = *RestoreBlock.getParent ();
616
- const TargetInstrInfo * TII = MF.getSubtarget ().getInstrInfo ();
627
+ const TargetInstrInfo & TII = * MF.getSubtarget ().getInstrInfo ();
617
628
const TargetFrameLowering *TFI = MF.getSubtarget ().getFrameLowering ();
618
629
const TargetRegisterInfo *TRI = MF.getSubtarget ().getRegisterInfo ();
619
630
@@ -623,7 +634,19 @@ static void insertCSRRestores(MachineBasicBlock &RestoreBlock,
623
634
624
635
if (!TFI->restoreCalleeSavedRegisters (RestoreBlock, I, CSI, TRI)) {
625
636
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
+ }
627
650
}
628
651
}
629
652
}
0 commit comments