mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-24 06:30:19 +00:00
Add a simple little improvement to the local spiller to keep track of stores
and delete them if they turn out to be dead. This is a useful little hack that even speeds up some programs. For example, it speeds up Ptrdist/ks from 17.53s to 15.59s, and 188.ammp from 149s to 146s. This also speeds up llc :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16630 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7fb64347d7
commit
52b25db3ef
@ -35,6 +35,7 @@ namespace {
|
|||||||
Statistic<> NumStores("spiller", "Number of stores added");
|
Statistic<> NumStores("spiller", "Number of stores added");
|
||||||
Statistic<> NumLoads ("spiller", "Number of loads added");
|
Statistic<> NumLoads ("spiller", "Number of loads added");
|
||||||
Statistic<> NumReused("spiller", "Number of values reused");
|
Statistic<> NumReused("spiller", "Number of values reused");
|
||||||
|
Statistic<> NumDSE ("spiller", "Number of dead stores elided");
|
||||||
|
|
||||||
enum SpillerName { simple, local };
|
enum SpillerName { simple, local };
|
||||||
|
|
||||||
@ -283,6 +284,14 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) {
|
|||||||
// and ".second" is the virtual register that is spilled.
|
// and ".second" is the virtual register that is spilled.
|
||||||
std::vector<std::pair<unsigned, unsigned> > DefAndUseVReg;
|
std::vector<std::pair<unsigned, unsigned> > DefAndUseVReg;
|
||||||
|
|
||||||
|
// MaybeDeadStores - When we need to write a value back into a stack slot,
|
||||||
|
// keep track of the inserted store. If the stack slot value is never read
|
||||||
|
// (because the value was used from some available register, for example), and
|
||||||
|
// subsequently stored to, the original store is dead. This map keeps track
|
||||||
|
// of inserted stores that are not used. If we see a subsequent store to the
|
||||||
|
// same stack slot, the original store is deleted.
|
||||||
|
std::map<int, MachineInstr*> MaybeDeadStores;
|
||||||
|
|
||||||
for (MachineBasicBlock::iterator MII = MBB.begin(), E = MBB.end();
|
for (MachineBasicBlock::iterator MII = MBB.begin(), E = MBB.end();
|
||||||
MII != E; ) {
|
MII != E; ) {
|
||||||
MachineInstr &MI = *MII;
|
MachineInstr &MI = *MII;
|
||||||
@ -361,6 +370,9 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) {
|
|||||||
ClobberPhysReg(Op.AssignedPhysReg, SpillSlotsAvailable,
|
ClobberPhysReg(Op.AssignedPhysReg, SpillSlotsAvailable,
|
||||||
PhysRegsAvailable);
|
PhysRegsAvailable);
|
||||||
|
|
||||||
|
// Any stores to this stack slot are not dead anymore.
|
||||||
|
MaybeDeadStores.erase(Op.StackSlot);
|
||||||
|
|
||||||
MI.SetMachineOperandReg(Op.Operand, Op.AssignedPhysReg);
|
MI.SetMachineOperandReg(Op.Operand, Op.AssignedPhysReg);
|
||||||
PhysRegsAvailable[Op.AssignedPhysReg] = Op.StackSlot;
|
PhysRegsAvailable[Op.AssignedPhysReg] = Op.StackSlot;
|
||||||
SpillSlotsAvailable[Op.StackSlot] = Op.AssignedPhysReg;
|
SpillSlotsAvailable[Op.StackSlot] = Op.AssignedPhysReg;
|
||||||
@ -383,6 +395,9 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) {
|
|||||||
// This invalidates PhysReg.
|
// This invalidates PhysReg.
|
||||||
ClobberPhysReg(PhysReg, SpillSlotsAvailable, PhysRegsAvailable);
|
ClobberPhysReg(PhysReg, SpillSlotsAvailable, PhysRegsAvailable);
|
||||||
|
|
||||||
|
// Any stores to this stack slot are not dead anymore.
|
||||||
|
MaybeDeadStores.erase(StackSlot);
|
||||||
|
|
||||||
MI.SetMachineOperandReg(i, PhysReg);
|
MI.SetMachineOperandReg(i, PhysReg);
|
||||||
PhysRegsAvailable[PhysReg] = StackSlot;
|
PhysRegsAvailable[PhysReg] = StackSlot;
|
||||||
SpillSlotsAvailable[StackSlot] = PhysReg;
|
SpillSlotsAvailable[StackSlot] = PhysReg;
|
||||||
@ -423,6 +438,9 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) {
|
|||||||
int SS = VRM.getStackSlot(I->second);
|
int SS = VRM.getStackSlot(I->second);
|
||||||
DEBUG(std::cerr << " - StackSlot: " << SS << "\n");
|
DEBUG(std::cerr << " - StackSlot: " << SS << "\n");
|
||||||
|
|
||||||
|
// Any stores to this stack slot are not dead anymore.
|
||||||
|
MaybeDeadStores.erase(SS);
|
||||||
|
|
||||||
std::map<int, unsigned>::iterator I = SpillSlotsAvailable.find(SS);
|
std::map<int, unsigned>::iterator I = SpillSlotsAvailable.find(SS);
|
||||||
if (I != SpillSlotsAvailable.end()) {
|
if (I != SpillSlotsAvailable.end()) {
|
||||||
PhysRegsAvailable.erase(I->second);
|
PhysRegsAvailable.erase(I->second);
|
||||||
@ -476,6 +494,14 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, const VirtRegMap &VRM) {
|
|||||||
DEBUG(std::cerr << "Store:\t" << *next(MII));
|
DEBUG(std::cerr << "Store:\t" << *next(MII));
|
||||||
MI.SetMachineOperandReg(i, PhysReg);
|
MI.SetMachineOperandReg(i, PhysReg);
|
||||||
|
|
||||||
|
// If there is a dead store to this stack slot, nuke it now.
|
||||||
|
MachineInstr *&LastStore = MaybeDeadStores[StackSlot];
|
||||||
|
if (LastStore) {
|
||||||
|
++NumDSE;
|
||||||
|
MBB.erase(LastStore);
|
||||||
|
}
|
||||||
|
LastStore = next(MII);
|
||||||
|
|
||||||
// If the stack slot value was previously available in some other
|
// If the stack slot value was previously available in some other
|
||||||
// register, change it now. Otherwise, make the register available,
|
// register, change it now. Otherwise, make the register available,
|
||||||
// in PhysReg.
|
// in PhysReg.
|
||||||
|
Loading…
Reference in New Issue
Block a user