diff --git a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp index 1d91d46cb30ee..268b8134ed803 100644 --- a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp @@ -610,6 +610,25 @@ static MCCFIInstruction createDefCFAOffset(const TargetRegisterInfo &TRI, Comment.str()); } +void RISCVFrameLowering::allocateStack(MachineBasicBlock &MBB, + MachineBasicBlock::iterator MBBI, + StackOffset Offset, bool EmitCFI, + unsigned CFIIndex) const { + DebugLoc DL; + const RISCVRegisterInfo *RI = STI.getRegisterInfo(); + const RISCVInstrInfo *TII = STI.getInstrInfo(); + + RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg, Offset, MachineInstr::FrameSetup, + getStackAlign()); + + if (EmitCFI) { + // Emit ".cfi_def_cfa_offset StackSize" + BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION)) + .addCFIIndex(CFIIndex) + .setMIFlag(MachineInstr::FrameSetup); + } +} + void RISCVFrameLowering::emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const { MachineFrameInfo &MFI = MF.getFrameInfo(); @@ -726,16 +745,10 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF, if (StackSize != 0) { // Allocate space on the stack if necessary. - RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg, - StackOffset::getFixed(-StackSize), MachineInstr::FrameSetup, - getStackAlign()); - - // Emit ".cfi_def_cfa_offset RealStackSize" unsigned CFIIndex = MF.addFrameInst( MCCFIInstruction::cfiDefCfaOffset(nullptr, RealStackSize)); - BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION)) - .addCFIIndex(CFIIndex) - .setMIFlag(MachineInstr::FrameSetup); + allocateStack(MBB, MBBI, StackOffset::getFixed(-StackSize), + /*EmitCFI=*/ true, CFIIndex); } // The frame pointer is callee-saved, and code has been generated for us to @@ -776,20 +789,13 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF, getStackSizeWithRVVPadding(MF) - FirstSPAdjustAmount; assert(SecondSPAdjustAmount > 0 && "SecondSPAdjustAmount should be greater than zero"); - RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg, - StackOffset::getFixed(-SecondSPAdjustAmount), - MachineInstr::FrameSetup, getStackAlign()); // If we are using a frame-pointer, and thus emitted ".cfi_def_cfa fp, 0", // don't emit an sp-based .cfi_def_cfa_offset - if (!hasFP(MF)) { - // Emit ".cfi_def_cfa_offset StackSize" - unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::cfiDefCfaOffset( - nullptr, getStackSizeWithRVVPadding(MF))); - BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION)) - .addCFIIndex(CFIIndex) - .setMIFlag(MachineInstr::FrameSetup); - } + unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::cfiDefCfaOffset( + nullptr, getStackSizeWithRVVPadding(MF))); + allocateStack(MBB, MBBI, StackOffset::getFixed(-SecondSPAdjustAmount), + !hasFP(MF), CFIIndex); } if (RVVStackSize) { diff --git a/llvm/lib/Target/RISCV/RISCVFrameLowering.h b/llvm/lib/Target/RISCV/RISCVFrameLowering.h index c106b7b675465..9aff4dc9e4089 100644 --- a/llvm/lib/Target/RISCV/RISCVFrameLowering.h +++ b/llvm/lib/Target/RISCV/RISCVFrameLowering.h @@ -78,6 +78,9 @@ class RISCVFrameLowering : public TargetFrameLowering { return StackId != TargetStackID::ScalableVector; } + void allocateStack(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, + StackOffset Offset, bool EmitCFI, unsigned CFIIndex) const; + protected: const RISCVSubtarget &STI;