mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-31 09:25:42 +00:00
PrologEpilogInserter: Rewrite API to determine callee save regsiters.
This changes TargetFrameLowering::processFunctionBeforeCalleeSavedScan(): - Rename the function to determineCalleeSaves() - Pass a bitset of callee saved registers by reference, thus avoiding the function-global PhysRegUsed bitset in MachineRegisterInfo. - Without PhysRegUsed the implementation is fine tuned to not save physcial registers which are only read but never modified. Related to rdar://21539507 Differential Revision: http://reviews.llvm.org/D10909 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242165 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -11,9 +11,12 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/Target/TargetFrameLowering.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||
@@ -54,3 +57,30 @@ bool TargetFrameLowering::needsFrameIndexResolution(
|
||||
const MachineFunction &MF) const {
|
||||
return MF.getFrameInfo()->hasStackObjects();
|
||||
}
|
||||
|
||||
void TargetFrameLowering::determineCalleeSaves(MachineFunction &MF,
|
||||
BitVector &SavedRegs,
|
||||
RegScavenger *RS) const {
|
||||
// Get the callee saved register list...
|
||||
const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
|
||||
const MCPhysReg *CSRegs = TRI.getCalleeSavedRegs(&MF);
|
||||
|
||||
// Early exit if there are no callee saved registers.
|
||||
if (!CSRegs || CSRegs[0] == 0)
|
||||
return;
|
||||
|
||||
SavedRegs.resize(TRI.getNumRegs());
|
||||
|
||||
// In Naked functions we aren't going to save any registers.
|
||||
if (MF.getFunction()->hasFnAttribute(Attribute::Naked))
|
||||
return;
|
||||
|
||||
// Functions which call __builtin_unwind_init get all their registers saved.
|
||||
bool CallsUnwindInit = MF.getMMI().callsUnwindInit();
|
||||
const MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
for (unsigned i = 0; CSRegs[i]; ++i) {
|
||||
unsigned Reg = CSRegs[i];
|
||||
if (CallsUnwindInit || MRI.isPhysRegModified(Reg))
|
||||
SavedRegs.set(Reg);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user