mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-14 17:34:41 +00:00
Eliminate data relocations by using NULL instead of global empty list.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29250 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
60f09928a0
commit
cd4317efcf
@ -639,8 +639,10 @@ void LiveIntervals::computeIntervals()
|
||||
DEBUG(std::cerr << getInstructionIndex(mi) << "\t" << *mi);
|
||||
|
||||
// handle implicit defs
|
||||
for (const unsigned* id = tid.ImplicitDefs; *id; ++id)
|
||||
handleRegisterDef(mbb, mi, *id);
|
||||
if (tid.ImplicitDefs) {
|
||||
for (const unsigned* id = tid.ImplicitDefs; *id; ++id)
|
||||
handleRegisterDef(mbb, mi, *id);
|
||||
}
|
||||
|
||||
// handle explicit defs
|
||||
for (int i = mi->getNumOperands() - 1; i >= 0; --i) {
|
||||
|
@ -239,9 +239,11 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &MF) {
|
||||
NumOperandsToProcess = 1;
|
||||
|
||||
// Loop over implicit uses, using them.
|
||||
for (const unsigned *ImplicitUses = MID.ImplicitUses;
|
||||
*ImplicitUses; ++ImplicitUses)
|
||||
HandlePhysRegUse(*ImplicitUses, MI);
|
||||
if (MID.ImplicitUses) {
|
||||
for (const unsigned *ImplicitUses = MID.ImplicitUses;
|
||||
*ImplicitUses; ++ImplicitUses)
|
||||
HandlePhysRegUse(*ImplicitUses, MI);
|
||||
}
|
||||
|
||||
// Process all explicit uses...
|
||||
for (unsigned i = 0; i != NumOperandsToProcess; ++i) {
|
||||
@ -257,9 +259,11 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &MF) {
|
||||
}
|
||||
|
||||
// Loop over implicit defs, defining them.
|
||||
for (const unsigned *ImplicitDefs = MID.ImplicitDefs;
|
||||
*ImplicitDefs; ++ImplicitDefs)
|
||||
HandlePhysRegDef(*ImplicitDefs, MI);
|
||||
if (MID.ImplicitDefs) {
|
||||
for (const unsigned *ImplicitDefs = MID.ImplicitDefs;
|
||||
*ImplicitDefs; ++ImplicitDefs)
|
||||
HandlePhysRegDef(*ImplicitDefs, MI);
|
||||
}
|
||||
|
||||
// Process all explicit defs...
|
||||
for (unsigned i = 0; i != NumOperandsToProcess; ++i) {
|
||||
|
@ -525,9 +525,11 @@ void RA::AllocateBasicBlock(MachineBasicBlock &MBB) {
|
||||
|
||||
// Loop over the implicit uses, making sure that they are at the head of the
|
||||
// use order list, so they don't get reallocated.
|
||||
for (const unsigned *ImplicitUses = TID.ImplicitUses;
|
||||
*ImplicitUses; ++ImplicitUses)
|
||||
MarkPhysRegRecentlyUsed(*ImplicitUses);
|
||||
if (TID.ImplicitUses) {
|
||||
for (const unsigned *ImplicitUses = TID.ImplicitUses;
|
||||
*ImplicitUses; ++ImplicitUses)
|
||||
MarkPhysRegRecentlyUsed(*ImplicitUses);
|
||||
}
|
||||
|
||||
// Get the used operands into registers. This has the potential to spill
|
||||
// incoming values if we are out of registers. Note that we completely
|
||||
@ -587,19 +589,21 @@ void RA::AllocateBasicBlock(MachineBasicBlock &MBB) {
|
||||
}
|
||||
|
||||
// Loop over the implicit defs, spilling them as well.
|
||||
for (const unsigned *ImplicitDefs = TID.ImplicitDefs;
|
||||
*ImplicitDefs; ++ImplicitDefs) {
|
||||
unsigned Reg = *ImplicitDefs;
|
||||
spillPhysReg(MBB, MI, Reg, true);
|
||||
PhysRegsUseOrder.push_back(Reg);
|
||||
PhysRegsUsed[Reg] = 0; // It is free and reserved now
|
||||
PhysRegsEverUsed[Reg] = true;
|
||||
if (TID.ImplicitDefs) {
|
||||
for (const unsigned *ImplicitDefs = TID.ImplicitDefs;
|
||||
*ImplicitDefs; ++ImplicitDefs) {
|
||||
unsigned Reg = *ImplicitDefs;
|
||||
spillPhysReg(MBB, MI, Reg, true);
|
||||
PhysRegsUseOrder.push_back(Reg);
|
||||
PhysRegsUsed[Reg] = 0; // It is free and reserved now
|
||||
PhysRegsEverUsed[Reg] = true;
|
||||
|
||||
for (const unsigned *AliasSet = RegInfo->getAliasSet(Reg);
|
||||
*AliasSet; ++AliasSet) {
|
||||
PhysRegsUseOrder.push_back(*AliasSet);
|
||||
PhysRegsUsed[*AliasSet] = 0; // It is free and reserved now
|
||||
PhysRegsEverUsed[*AliasSet] = true;
|
||||
for (const unsigned *AliasSet = RegInfo->getAliasSet(Reg);
|
||||
*AliasSet; ++AliasSet) {
|
||||
PhysRegsUseOrder.push_back(*AliasSet);
|
||||
PhysRegsUsed[*AliasSet] = 0; // It is free and reserved now
|
||||
PhysRegsEverUsed[*AliasSet] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -166,12 +166,16 @@ void RegAllocSimple::AllocateBasicBlock(MachineBasicBlock &MBB) {
|
||||
unsigned Opcode = MI->getOpcode();
|
||||
const TargetInstrDescriptor &Desc = TM->getInstrInfo()->get(Opcode);
|
||||
const unsigned *Regs;
|
||||
for (Regs = Desc.ImplicitUses; *Regs; ++Regs)
|
||||
RegsUsed[*Regs] = true;
|
||||
if (Desc.ImplicitUses) {
|
||||
for (Regs = Desc.ImplicitUses; *Regs; ++Regs)
|
||||
RegsUsed[*Regs] = true;
|
||||
}
|
||||
|
||||
for (Regs = Desc.ImplicitDefs; *Regs; ++Regs) {
|
||||
RegsUsed[*Regs] = true;
|
||||
PhysRegsEverUsed[*Regs] = true;
|
||||
if (Desc.ImplicitDefs) {
|
||||
for (Regs = Desc.ImplicitDefs; *Regs; ++Regs) {
|
||||
RegsUsed[*Regs] = true;
|
||||
PhysRegsEverUsed[*Regs] = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Loop over uses, move from memory into registers.
|
||||
|
@ -671,10 +671,12 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) {
|
||||
|
||||
// Loop over all of the implicit defs, clearing them from our available
|
||||
// sets.
|
||||
for (const unsigned *ImpDef = TII->getImplicitDefs(MI.getOpcode());
|
||||
*ImpDef; ++ImpDef) {
|
||||
PhysRegsUsed[*ImpDef] = true;
|
||||
Spills.ClobberPhysReg(*ImpDef);
|
||||
const unsigned *ImpDef = TII->getImplicitDefs(MI.getOpcode());
|
||||
if (ImpDef) {
|
||||
for ( ; *ImpDef; ++ImpDef) {
|
||||
PhysRegsUsed[*ImpDef] = true;
|
||||
Spills.ClobberPhysReg(*ImpDef);
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG(std::cerr << '\t' << MI);
|
||||
|
@ -97,9 +97,6 @@ void InstrInfoEmitter::run(std::ostream &OS) {
|
||||
const std::string &TargetName = Target.getName();
|
||||
Record *InstrInfo = Target.getInstructionSet();
|
||||
|
||||
// Emit empty implicit uses and defs lists
|
||||
OS << "static const unsigned EmptyImpList[] = { 0 };\n";
|
||||
|
||||
// Keep track of all of the def lists we have emitted already.
|
||||
std::map<std::vector<Record*>, unsigned> EmittedLists;
|
||||
unsigned ListNumber = 0;
|
||||
@ -239,13 +236,13 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
|
||||
// Emit the implicit uses and defs lists...
|
||||
std::vector<Record*> UseList = Inst.TheDef->getValueAsListOfDefs("Uses");
|
||||
if (UseList.empty())
|
||||
OS << "EmptyImpList, ";
|
||||
OS << "NULL, ";
|
||||
else
|
||||
OS << "ImplicitList" << EmittedLists[UseList] << ", ";
|
||||
|
||||
std::vector<Record*> DefList = Inst.TheDef->getValueAsListOfDefs("Defs");
|
||||
if (DefList.empty())
|
||||
OS << "EmptyImpList, ";
|
||||
OS << "NULL, ";
|
||||
else
|
||||
OS << "ImplicitList" << EmittedLists[DefList] << ", ";
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user