mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 20:59:51 +00:00
Stop tracking spill slot uses in VirtRegMap.
Nobody cared, StackSlotColoring scans the instructions to find used stack slots. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144485 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3cb0b0edd9
commit
cb39064e7a
@ -726,7 +726,6 @@ bool InlineSpiller::hoistSpill(LiveInterval &SpillLI, MachineInstr *CopyMI) {
|
||||
MRI.getRegClass(SVI.SpillReg), &TRI);
|
||||
--MII; // Point to store instruction.
|
||||
LIS.InsertMachineInstrInMaps(MII);
|
||||
VRM.addSpillSlotUse(StackSlot, MII);
|
||||
DEBUG(dbgs() << "\thoisted: " << SVI.SpillVNI->def << '\t' << *MII);
|
||||
|
||||
++NumSpills;
|
||||
@ -1046,8 +1045,6 @@ bool InlineSpiller::foldMemoryOperand(MachineBasicBlock::iterator MI,
|
||||
if (!FoldMI)
|
||||
return false;
|
||||
LIS.ReplaceMachineInstrInMaps(MI, FoldMI);
|
||||
if (!LoadMI)
|
||||
VRM.addSpillSlotUse(StackSlot, FoldMI);
|
||||
MI->eraseFromParent();
|
||||
|
||||
// TII.foldMemoryOperand may have left some implicit operands on the
|
||||
@ -1081,7 +1078,6 @@ void InlineSpiller::insertReload(LiveInterval &NewLI,
|
||||
MRI.getRegClass(NewLI.reg), &TRI);
|
||||
--MI; // Point to load instruction.
|
||||
SlotIndex LoadIdx = LIS.InsertMachineInstrInMaps(MI).getDefIndex();
|
||||
VRM.addSpillSlotUse(StackSlot, MI);
|
||||
DEBUG(dbgs() << "\treload: " << LoadIdx << '\t' << *MI);
|
||||
VNInfo *LoadVNI = NewLI.getNextValue(LoadIdx, 0,
|
||||
LIS.getVNInfoAllocator());
|
||||
@ -1097,7 +1093,6 @@ void InlineSpiller::insertSpill(LiveInterval &NewLI, const LiveInterval &OldLI,
|
||||
MRI.getRegClass(NewLI.reg), &TRI);
|
||||
--MI; // Point to store instruction.
|
||||
SlotIndex StoreIdx = LIS.InsertMachineInstrInMaps(MI).getDefIndex();
|
||||
VRM.addSpillSlotUse(StackSlot, MI);
|
||||
DEBUG(dbgs() << "\tspilled: " << StoreIdx << '\t' << *MI);
|
||||
VNInfo *StoreVNI = NewLI.getNextValue(Idx, 0, LIS.getVNInfoAllocator());
|
||||
NewLI.addRange(LiveRange(Idx, StoreIdx, StoreVNI));
|
||||
@ -1254,7 +1249,6 @@ void InlineSpiller::spillAll() {
|
||||
MachineInstr *MI = RI.skipInstruction();) {
|
||||
assert(SnippetCopies.count(MI) && "Remaining use wasn't a snippet copy");
|
||||
// FIXME: Do this with a LiveRangeEdit callback.
|
||||
VRM.RemoveMachineInstrFromMaps(MI);
|
||||
LIS.RemoveMachineInstrFromMaps(MI);
|
||||
MI->eraseFromParent();
|
||||
}
|
||||
|
@ -889,8 +889,7 @@ UserValue::rewriteLocations(VirtRegMap &VRM, const TargetRegisterInfo &TRI) {
|
||||
// index is no longer available. That means the user value is in a
|
||||
// non-existent sub-register, and %noreg is exactly what we want.
|
||||
Loc.substPhysReg(VRM.getPhys(VirtReg), TRI);
|
||||
} else if (VRM.getStackSlot(VirtReg) != VirtRegMap::NO_STACK_SLOT &&
|
||||
VRM.isSpillSlotUsed(VRM.getStackSlot(VirtReg))) {
|
||||
} else if (VRM.getStackSlot(VirtReg) != VirtRegMap::NO_STACK_SLOT) {
|
||||
// FIXME: Translate SubIdx to a stackslot offset.
|
||||
Loc = MachineOperand::CreateFI(VRM.getStackSlot(VirtReg));
|
||||
} else {
|
||||
|
@ -248,7 +248,6 @@ public:
|
||||
static char ID;
|
||||
|
||||
private:
|
||||
void LRE_WillEraseInstruction(MachineInstr*);
|
||||
bool LRE_CanEraseVirtReg(unsigned);
|
||||
void LRE_WillShrinkVirtReg(unsigned);
|
||||
void LRE_DidCloneVirtReg(unsigned, unsigned);
|
||||
@ -350,11 +349,6 @@ void RAGreedy::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
// LiveRangeEdit delegate methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
void RAGreedy::LRE_WillEraseInstruction(MachineInstr *MI) {
|
||||
// LRE itself will remove from SlotIndexes and parent basic block.
|
||||
VRM->RemoveMachineInstrFromMaps(MI);
|
||||
}
|
||||
|
||||
bool RAGreedy::LRE_CanEraseVirtReg(unsigned VirtReg) {
|
||||
if (unsigned PhysReg = VRM->getPhys(VirtReg)) {
|
||||
unassign(LIS->getInterval(VirtReg), PhysReg);
|
||||
|
@ -140,7 +140,6 @@ protected:
|
||||
MachineInstr *loadInstr(prior(miItr));
|
||||
SlotIndex loadIndex =
|
||||
lis->InsertMachineInstrInMaps(loadInstr).getDefIndex();
|
||||
vrm->addSpillSlotUse(ss, loadInstr);
|
||||
SlotIndex endIndex = loadIndex.getNextIndex();
|
||||
VNInfo *loadVNI =
|
||||
newLI->getNextValue(loadIndex, 0, lis->getVNInfoAllocator());
|
||||
@ -154,7 +153,6 @@ protected:
|
||||
MachineInstr *storeInstr(llvm::next(miItr));
|
||||
SlotIndex storeIndex =
|
||||
lis->InsertMachineInstrInMaps(storeInstr).getDefIndex();
|
||||
vrm->addSpillSlotUse(ss, storeInstr);
|
||||
SlotIndex beginIndex = storeIndex.getPrevIndex();
|
||||
VNInfo *storeVNI =
|
||||
newLI->getNextValue(beginIndex, 0, lis->getVNInfoAllocator());
|
||||
|
@ -58,14 +58,9 @@ bool VirtRegMap::runOnMachineFunction(MachineFunction &mf) {
|
||||
TRI = mf.getTarget().getRegisterInfo();
|
||||
MF = &mf;
|
||||
|
||||
LowSpillSlot = HighSpillSlot = NO_STACK_SLOT;
|
||||
|
||||
Virt2PhysMap.clear();
|
||||
Virt2StackSlotMap.clear();
|
||||
Virt2SplitMap.clear();
|
||||
SpillSlotToUsesMap.clear();
|
||||
|
||||
SpillSlotToUsesMap.resize(8);
|
||||
|
||||
allocatableRCRegs.clear();
|
||||
for (TargetRegisterInfo::regclass_iterator I = TRI->regclass_begin(),
|
||||
@ -88,14 +83,6 @@ void VirtRegMap::grow() {
|
||||
unsigned VirtRegMap::createSpillSlot(const TargetRegisterClass *RC) {
|
||||
int SS = MF->getFrameInfo()->CreateSpillStackObject(RC->getSize(),
|
||||
RC->getAlignment());
|
||||
if (LowSpillSlot == NO_STACK_SLOT)
|
||||
LowSpillSlot = SS;
|
||||
if (HighSpillSlot == NO_STACK_SLOT || SS > HighSpillSlot)
|
||||
HighSpillSlot = SS;
|
||||
assert(SS >= LowSpillSlot && "Unexpected low spill slot");
|
||||
unsigned Idx = SS-LowSpillSlot;
|
||||
while (Idx >= SpillSlotToUsesMap.size())
|
||||
SpillSlotToUsesMap.resize(SpillSlotToUsesMap.size()*2);
|
||||
++NumSpillSlots;
|
||||
return SS;
|
||||
}
|
||||
@ -129,37 +116,6 @@ void VirtRegMap::assignVirt2StackSlot(unsigned virtReg, int SS) {
|
||||
Virt2StackSlotMap[virtReg] = SS;
|
||||
}
|
||||
|
||||
void VirtRegMap::addSpillSlotUse(int FI, MachineInstr *MI) {
|
||||
if (!MF->getFrameInfo()->isFixedObjectIndex(FI)) {
|
||||
// If FI < LowSpillSlot, this stack reference was produced by
|
||||
// instruction selection and is not a spill
|
||||
if (FI >= LowSpillSlot) {
|
||||
assert(FI >= 0 && "Spill slot index should not be negative!");
|
||||
assert((unsigned)FI-LowSpillSlot < SpillSlotToUsesMap.size()
|
||||
&& "Invalid spill slot");
|
||||
SpillSlotToUsesMap[FI-LowSpillSlot].insert(MI);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void VirtRegMap::RemoveMachineInstrFromMaps(MachineInstr *MI) {
|
||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||
MachineOperand &MO = MI->getOperand(i);
|
||||
if (!MO.isFI())
|
||||
continue;
|
||||
int FI = MO.getIndex();
|
||||
if (MF->getFrameInfo()->isFixedObjectIndex(FI))
|
||||
continue;
|
||||
// This stack reference was produced by instruction selection and
|
||||
// is not a spill
|
||||
if (FI < LowSpillSlot)
|
||||
continue;
|
||||
assert((unsigned)FI-LowSpillSlot < SpillSlotToUsesMap.size()
|
||||
&& "Invalid spill slot");
|
||||
SpillSlotToUsesMap[FI-LowSpillSlot].erase(MI);
|
||||
}
|
||||
}
|
||||
|
||||
void VirtRegMap::rewrite(SlotIndexes *Indexes) {
|
||||
DEBUG(dbgs() << "********** REWRITE VIRTUAL REGISTERS **********\n"
|
||||
<< "********** Function: "
|
||||
@ -236,7 +192,6 @@ void VirtRegMap::rewrite(SlotIndexes *Indexes) {
|
||||
++NumIdCopies;
|
||||
if (MI->getNumOperands() == 2) {
|
||||
DEBUG(dbgs() << "Deleting identity copy.\n");
|
||||
RemoveMachineInstrFromMaps(MI);
|
||||
if (Indexes)
|
||||
Indexes->removeMachineInstrFromMaps(MI);
|
||||
// It's safe to erase MI because MII has already been incremented.
|
||||
|
@ -74,12 +74,6 @@ namespace llvm {
|
||||
/// mapping.
|
||||
IndexedMap<unsigned, VirtReg2IndexFunctor> Virt2SplitMap;
|
||||
|
||||
/// LowSpillSlot, HighSpillSlot - Lowest and highest spill slot indexes.
|
||||
int LowSpillSlot, HighSpillSlot;
|
||||
|
||||
/// SpillSlotToUsesMap - Records uses for each register spill slot.
|
||||
SmallVector<SmallPtrSet<MachineInstr*, 4>, 8> SpillSlotToUsesMap;
|
||||
|
||||
/// createSpillSlot - Allocate a spill slot for RC from MFI.
|
||||
unsigned createSpillSlot(const TargetRegisterClass *RC);
|
||||
|
||||
@ -89,8 +83,7 @@ namespace llvm {
|
||||
public:
|
||||
static char ID;
|
||||
VirtRegMap() : MachineFunctionPass(ID), Virt2PhysMap(NO_PHYS_REG),
|
||||
Virt2StackSlotMap(NO_STACK_SLOT), Virt2SplitMap(0),
|
||||
LowSpillSlot(NO_STACK_SLOT), HighSpillSlot(NO_STACK_SLOT) { }
|
||||
Virt2StackSlotMap(NO_STACK_SLOT), Virt2SplitMap(0) { }
|
||||
virtual bool runOnMachineFunction(MachineFunction &MF);
|
||||
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
@ -198,19 +191,6 @@ namespace llvm {
|
||||
/// the specified stack slot
|
||||
void assignVirt2StackSlot(unsigned virtReg, int frameIndex);
|
||||
|
||||
/// @brief Records a spill slot use.
|
||||
void addSpillSlotUse(int FrameIndex, MachineInstr *MI);
|
||||
|
||||
/// @brief Returns true if spill slot has been used.
|
||||
bool isSpillSlotUsed(int FrameIndex) const {
|
||||
assert(FrameIndex >= 0 && "Spill slot index should not be negative!");
|
||||
return !SpillSlotToUsesMap[FrameIndex-LowSpillSlot].empty();
|
||||
}
|
||||
|
||||
/// RemoveMachineInstrFromMaps - MI is being erased, remove it from the
|
||||
/// the folded instruction map and spill point map.
|
||||
void RemoveMachineInstrFromMaps(MachineInstr *MI);
|
||||
|
||||
/// rewrite - Rewrite all instructions in MF to use only physical registers
|
||||
/// by mapping all virtual register operands to their assigned physical
|
||||
/// registers.
|
||||
|
Loading…
Reference in New Issue
Block a user