@@ -810,8 +810,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
810810
811811 auto FirstFrameSetup = MBBI;
812812
813- // Since spillCalleeSavedRegisters may have inserted a libcall, skip past
814- // any instructions marked as FrameSetup
813+ // Skip past all callee-saved register spill instructions.
815814 while (MBBI != MBB.end () && MBBI->getFlag (MachineInstr::FrameSetup))
816815 ++MBBI;
817816
@@ -820,6 +819,12 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
820819
821820 const auto &CSI = MFI.getCalleeSavedInfo ();
822821
822+ // Skip to before the spills of scalar callee-saved registers
823+ // FIXME: assumes exactly one instruction is used to restore each
824+ // callee-saved register.
825+ MBBI = std::prev (MBBI, getRVVCalleeSavedInfo (MF, CSI).size () +
826+ getUnmanagedCSI (MF, CSI).size ());
827+
823828 // If libcalls are used to spill and restore callee-saved registers, the frame
824829 // has two sections; the opaque section managed by the libcalls, and the
825830 // section managed by MachineFrameInfo which can also hold callee saved
@@ -1076,8 +1081,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
10761081
10771082 MBBI = MBB.getFirstTerminator ();
10781083
1079- // If callee-saved registers are saved via libcall, place stack adjustment
1080- // before this call.
1084+ // Skip to before the restores of all callee-saved registers.
10811085 while (MBBI != MBB.begin () &&
10821086 std::prev (MBBI)->getFlag (MachineInstr::FrameDestroy))
10831087 --MBBI;
@@ -1088,7 +1092,8 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
10881092 // Skip to before the restores of scalar callee-saved registers
10891093 // FIXME: assumes exactly one instruction is used to restore each
10901094 // callee-saved register.
1091- auto LastFrameDestroy = std::prev (MBBI, getUnmanagedCSI (MF, CSI).size ());
1095+ auto FirstScalarCSRRestoreInsn =
1096+ std::next (MBBI, getRVVCalleeSavedInfo (MF, CSI).size ());
10921097
10931098 uint64_t FirstSPAdjustAmount = getFirstSPAdjustAmount (MF);
10941099 uint64_t RealStackSize = FirstSPAdjustAmount ? FirstSPAdjustAmount
@@ -1105,20 +1110,20 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
11051110 // If RestoreSPFromFP the stack pointer will be restored using the frame
11061111 // pointer value.
11071112 if (!RestoreSPFromFP)
1108- RI->adjustReg (MBB, LastFrameDestroy , DL, SPReg, SPReg,
1113+ RI->adjustReg (MBB, FirstScalarCSRRestoreInsn , DL, SPReg, SPReg,
11091114 StackOffset::getScalable (RVVStackSize),
11101115 MachineInstr::FrameDestroy, getStackAlign ());
11111116
11121117 if (!hasFP (MF)) {
11131118 unsigned CFIIndex = MF.addFrameInst (MCCFIInstruction::cfiDefCfa (
11141119 nullptr , RI->getDwarfRegNum (SPReg, true ), RealStackSize));
1115- BuildMI (MBB, LastFrameDestroy , DL,
1120+ BuildMI (MBB, FirstScalarCSRRestoreInsn , DL,
11161121 TII->get (TargetOpcode::CFI_INSTRUCTION))
11171122 .addCFIIndex (CFIIndex)
11181123 .setMIFlag (MachineInstr::FrameDestroy);
11191124 }
11201125
1121- emitCalleeSavedRVVEpilogCFI (MBB, LastFrameDestroy );
1126+ emitCalleeSavedRVVEpilogCFI (MBB, FirstScalarCSRRestoreInsn );
11221127 }
11231128
11241129 if (FirstSPAdjustAmount) {
@@ -1130,14 +1135,14 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
11301135 // If RestoreSPFromFP the stack pointer will be restored using the frame
11311136 // pointer value.
11321137 if (!RestoreSPFromFP)
1133- RI->adjustReg (MBB, LastFrameDestroy , DL, SPReg, SPReg,
1138+ RI->adjustReg (MBB, FirstScalarCSRRestoreInsn , DL, SPReg, SPReg,
11341139 StackOffset::getFixed (SecondSPAdjustAmount),
11351140 MachineInstr::FrameDestroy, getStackAlign ());
11361141
11371142 if (!hasFP (MF)) {
11381143 unsigned CFIIndex = MF.addFrameInst (
11391144 MCCFIInstruction::cfiDefCfaOffset (nullptr , FirstSPAdjustAmount));
1140- BuildMI (MBB, LastFrameDestroy , DL,
1145+ BuildMI (MBB, FirstScalarCSRRestoreInsn , DL,
11411146 TII->get (TargetOpcode::CFI_INSTRUCTION))
11421147 .addCFIIndex (CFIIndex)
11431148 .setMIFlag (MachineInstr::FrameDestroy);
@@ -1156,19 +1161,25 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
11561161 // have vector objects in stack.
11571162 if (RestoreSPFromFP) {
11581163 assert (hasFP (MF) && " frame pointer should not have been eliminated" );
1159- RI->adjustReg (MBB, LastFrameDestroy , DL, SPReg, FPReg,
1164+ RI->adjustReg (MBB, FirstScalarCSRRestoreInsn , DL, SPReg, FPReg,
11601165 StackOffset::getFixed (-FPOffset), MachineInstr::FrameDestroy,
11611166 getStackAlign ());
11621167 }
11631168
11641169 if (hasFP (MF)) {
11651170 unsigned CFIIndex = MF.addFrameInst (MCCFIInstruction::cfiDefCfa (
11661171 nullptr , RI->getDwarfRegNum (SPReg, true ), RealStackSize));
1167- BuildMI (MBB, LastFrameDestroy, DL, TII->get (TargetOpcode::CFI_INSTRUCTION))
1172+ BuildMI (MBB, FirstScalarCSRRestoreInsn, DL,
1173+ TII->get (TargetOpcode::CFI_INSTRUCTION))
11681174 .addCFIIndex (CFIIndex)
11691175 .setMIFlag (MachineInstr::FrameDestroy);
11701176 }
11711177
1178+ // Skip to after the restores of scalar callee-saved registers
1179+ // FIXME: assumes exactly one instruction is used to restore each
1180+ // callee-saved register.
1181+ MBBI = std::next (FirstScalarCSRRestoreInsn, getUnmanagedCSI (MF, CSI).size ());
1182+
11721183 if (getLibCallID (MF, CSI) != -1 ) {
11731184 // tail __riscv_restore_[0-12] instruction is considered as a terminator,
11741185 // therefor it is unnecessary to place any CFI instructions after it. Just
@@ -1898,7 +1909,8 @@ bool RISCVFrameLowering::spillCalleeSavedRegisters(
18981909 Register Reg = CS.getReg ();
18991910 const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass (Reg);
19001911 TII.storeRegToStackSlot (MBB, MI, Reg, !MBB.isLiveIn (Reg),
1901- CS.getFrameIdx (), RC, TRI, Register ());
1912+ CS.getFrameIdx (), RC, TRI, Register (),
1913+ MachineInstr::FrameSetup);
19021914 }
19031915 };
19041916 storeRegsToStackSlots (UnmanagedCSI);
@@ -2009,7 +2021,7 @@ bool RISCVFrameLowering::restoreCalleeSavedRegisters(
20092021 Register Reg = CS.getReg ();
20102022 const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass (Reg);
20112023 TII.loadRegFromStackSlot (MBB, MI, Reg, CS.getFrameIdx (), RC, TRI,
2012- Register ());
2024+ Register (), MachineInstr::FrameDestroy );
20132025 assert (MI != MBB.begin () &&
20142026 " loadRegFromStackSlot didn't insert any code!" );
20152027 }
0 commit comments