mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-23 14:25:07 +00:00
- Register scavenger should use MachineRegisterInfo and internal map to find the first use of a register after a given machine instruction.
- When scavenging a register, in addition to the spill, insert a restore before the first use. - Abort if client is looking to scavenge a register even when a previously scavenged register is still live. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59697 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@@ -28,6 +29,9 @@ class TargetInstrInfo;
|
||||
class TargetRegisterClass;
|
||||
|
||||
class RegScavenger {
|
||||
const TargetRegisterInfo *TRI;
|
||||
const TargetInstrInfo *TII;
|
||||
MachineRegisterInfo* MRI;
|
||||
MachineBasicBlock *MBB;
|
||||
MachineBasicBlock::iterator MBBI;
|
||||
unsigned NumPhysRegs;
|
||||
@@ -48,6 +52,18 @@ class RegScavenger {
|
||||
///
|
||||
const TargetRegisterClass *ScavengedRC;
|
||||
|
||||
/// ScavengeRestore - Instruction that restores the scavenged register from
|
||||
/// stack.
|
||||
const MachineInstr *ScavengeRestore;
|
||||
|
||||
/// CalleeSavedrRegs - A bitvector of callee saved registers for the target.
|
||||
///
|
||||
BitVector CalleeSavedRegs;
|
||||
|
||||
/// ReservedRegs - A bitvector of reserved registers.
|
||||
///
|
||||
BitVector ReservedRegs;
|
||||
|
||||
/// RegsAvailable - The current state of all the physical registers immediately
|
||||
/// before MBBI. One bit per physical register. If bit is set that means it's
|
||||
/// available, unset means the register is currently being used.
|
||||
@@ -57,6 +73,14 @@ class RegScavenger {
|
||||
/// implicit_def instructions. That means it can be clobbered at will.
|
||||
BitVector ImplicitDefed;
|
||||
|
||||
/// CurrDist - Distance from MBB entry to the current instruction MBBI.
|
||||
///
|
||||
unsigned CurrDist;
|
||||
|
||||
/// DistanceMap - Keep track the distance of a MI from the start of the
|
||||
/// current basic block.
|
||||
DenseMap<MachineInstr*, unsigned> DistanceMap;
|
||||
|
||||
public:
|
||||
RegScavenger()
|
||||
: MBB(NULL), NumPhysRegs(0), Tracking(false),
|
||||
@@ -143,21 +167,13 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
const TargetRegisterInfo *TRI;
|
||||
const TargetInstrInfo *TII;
|
||||
MachineRegisterInfo* MRI;
|
||||
|
||||
/// CalleeSavedrRegs - A bitvector of callee saved registers for the target.
|
||||
///
|
||||
BitVector CalleeSavedRegs;
|
||||
|
||||
/// ReservedRegs - A bitvector of reserved registers.
|
||||
///
|
||||
BitVector ReservedRegs;
|
||||
|
||||
/// restoreScavengedReg - Restore scavenged by loading it back from the
|
||||
/// emergency spill slot. Mark it used.
|
||||
void restoreScavengedReg();
|
||||
|
||||
MachineInstr *findFirstUse(MachineBasicBlock *MBB,
|
||||
MachineBasicBlock::iterator I, unsigned Reg,
|
||||
unsigned &Dist);
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
Reference in New Issue
Block a user