mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-19 02:25:01 +00:00
MachineFrameInfo: Simplify pristine register calculation.
About pristine regsiters: Pristine registers "hold a value that is useless to the current function, but that must be preserved - they are callee saved registers that have not been saved." This concept saves compile time as it frees the prologue/epilogue inserter from adding every such register to every basic blocks live-in list. However the current code in getPristineRegs is formulated in a complicated way: Inside the function prologue and epilogue all callee saves are considered pristine, while in the rest of the code only the non-saved ones are considered pristine. This requires logic to differentiate between prologue/epilogue and the rest and in the presence of shrink-wrapping this even becomes complicated/expensive. It's also unnecessary because the prologue epilogue inserters already mark callee-save registers that are saved/restores properly in the respective blocks in the prologue/epilogue (see updateLiveness() in PrologueEpilogueInserter.cpp). So only declaring non-saved/restored callee saved registers as pristine just works. Differential Revision: http://reviews.llvm.org/D10101 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238524 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -584,12 +584,8 @@ int MachineFrameInfo::CreateFixedSpillStackObject(uint64_t Size,
|
||||
return -++NumFixedObjects;
|
||||
}
|
||||
|
||||
BitVector
|
||||
MachineFrameInfo::getPristineRegs(const MachineBasicBlock *MBB) const {
|
||||
assert(MBB && "MBB must be valid");
|
||||
const MachineFunction *MF = MBB->getParent();
|
||||
assert(MF && "MBB must be part of a MachineFunction");
|
||||
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
|
||||
BitVector MachineFrameInfo::getPristineRegs(const MachineFunction &MF) const {
|
||||
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
|
||||
BitVector BV(TRI->getNumRegs());
|
||||
|
||||
// Before CSI is calculated, no registers are considered pristine. They can be
|
||||
@@ -597,14 +593,10 @@ MachineFrameInfo::getPristineRegs(const MachineBasicBlock *MBB) const {
|
||||
if (!isCalleeSavedInfoValid())
|
||||
return BV;
|
||||
|
||||
for (const MCPhysReg *CSR = TRI->getCalleeSavedRegs(MF); CSR && *CSR; ++CSR)
|
||||
for (const MCPhysReg *CSR = TRI->getCalleeSavedRegs(&MF); CSR && *CSR; ++CSR)
|
||||
BV.set(*CSR);
|
||||
|
||||
// Each MBB before the save point has all CSRs pristine.
|
||||
if (isBeforeSavePoint(*MF, *MBB))
|
||||
return BV;
|
||||
|
||||
// On other MBBs the saved CSRs are not pristine.
|
||||
// Saved CSRs are not pristine.
|
||||
const std::vector<CalleeSavedInfo> &CSI = getCalleeSavedInfo();
|
||||
for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
|
||||
E = CSI.end(); I != E; ++I)
|
||||
@@ -613,40 +605,6 @@ MachineFrameInfo::getPristineRegs(const MachineBasicBlock *MBB) const {
|
||||
return BV;
|
||||
}
|
||||
|
||||
// Note: We could use some sort of caching mecanism, but we lack the ability
|
||||
// to know when the cache is invalid, i.e., the CFG changed.
|
||||
// Assuming we have that, we can simply compute all the set of MBBs
|
||||
// that are before the save point.
|
||||
bool MachineFrameInfo::isBeforeSavePoint(const MachineFunction &MF,
|
||||
const MachineBasicBlock &MBB) const {
|
||||
// Early exit if shrink-wrapping did not kick.
|
||||
if (!Save)
|
||||
return &MBB == &MF.front();
|
||||
|
||||
// Starting from MBB, check if there is a path leading to Save that do
|
||||
// not cross Restore.
|
||||
SmallPtrSet<const MachineBasicBlock *, 8> Visited;
|
||||
SmallVector<const MachineBasicBlock *, 8> WorkList;
|
||||
WorkList.push_back(&MBB);
|
||||
Visited.insert(&MBB);
|
||||
do {
|
||||
const MachineBasicBlock *CurBB = WorkList.pop_back_val();
|
||||
// By construction, the region that is after the save point is
|
||||
// dominated by the Save and post-dominated by the Restore.
|
||||
// If we do not reach Restore and still reach Save, this
|
||||
// means MBB is before Save.
|
||||
if (CurBB == Save)
|
||||
return true;
|
||||
if (CurBB == Restore)
|
||||
continue;
|
||||
// Enqueue all the successors not already visited.
|
||||
for (MachineBasicBlock *SuccBB : CurBB->successors())
|
||||
if (Visited.insert(SuccBB).second)
|
||||
WorkList.push_back(SuccBB);
|
||||
} while (!WorkList.empty());
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned MachineFrameInfo::estimateStackSize(const MachineFunction &MF) const {
|
||||
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
|
||||
const TargetRegisterInfo *RegInfo = MF.getSubtarget().getRegisterInfo();
|
||||
|
Reference in New Issue
Block a user