From 4b49c23571c710ba4603c940394c54bd3de36ef9 Mon Sep 17 00:00:00 2001 From: Jim Laskey Date: Fri, 21 Jul 2006 21:15:20 +0000 Subject: [PATCH] Eliminate data relocations by using NULL instead of global empty list. llvm-svn: 29250 --- llvm/lib/CodeGen/LiveIntervalAnalysis.cpp | 6 ++-- llvm/lib/CodeGen/LiveVariables.cpp | 16 +++++++---- llvm/lib/CodeGen/RegAllocLocal.cpp | 34 +++++++++++++---------- llvm/lib/CodeGen/RegAllocSimple.cpp | 14 ++++++---- llvm/lib/CodeGen/VirtRegMap.cpp | 10 ++++--- llvm/utils/TableGen/InstrInfoEmitter.cpp | 7 ++--- 6 files changed, 50 insertions(+), 37 deletions(-) diff --git a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp index fba04670f21f..9e0d5d2325fa 100644 --- a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -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) { diff --git a/llvm/lib/CodeGen/LiveVariables.cpp b/llvm/lib/CodeGen/LiveVariables.cpp index 5c7818d330a0..46a8012ae3ab 100644 --- a/llvm/lib/CodeGen/LiveVariables.cpp +++ b/llvm/lib/CodeGen/LiveVariables.cpp @@ -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) { diff --git a/llvm/lib/CodeGen/RegAllocLocal.cpp b/llvm/lib/CodeGen/RegAllocLocal.cpp index 97be06fe8eab..763221ffbfe7 100644 --- a/llvm/lib/CodeGen/RegAllocLocal.cpp +++ b/llvm/lib/CodeGen/RegAllocLocal.cpp @@ -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; + } } } diff --git a/llvm/lib/CodeGen/RegAllocSimple.cpp b/llvm/lib/CodeGen/RegAllocSimple.cpp index 5d94f0af85d7..c6faead65818 100644 --- a/llvm/lib/CodeGen/RegAllocSimple.cpp +++ b/llvm/lib/CodeGen/RegAllocSimple.cpp @@ -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. diff --git a/llvm/lib/CodeGen/VirtRegMap.cpp b/llvm/lib/CodeGen/VirtRegMap.cpp index 86fef3e43248..bc56945bc834 100644 --- a/llvm/lib/CodeGen/VirtRegMap.cpp +++ b/llvm/lib/CodeGen/VirtRegMap.cpp @@ -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); diff --git a/llvm/utils/TableGen/InstrInfoEmitter.cpp b/llvm/utils/TableGen/InstrInfoEmitter.cpp index de93792556f9..812e0215d1ab 100644 --- a/llvm/utils/TableGen/InstrInfoEmitter.cpp +++ b/llvm/utils/TableGen/InstrInfoEmitter.cpp @@ -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, 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 UseList = Inst.TheDef->getValueAsListOfDefs("Uses"); if (UseList.empty()) - OS << "EmptyImpList, "; + OS << "NULL, "; else OS << "ImplicitList" << EmittedLists[UseList] << ", "; std::vector DefList = Inst.TheDef->getValueAsListOfDefs("Defs"); if (DefList.empty()) - OS << "EmptyImpList, "; + OS << "NULL, "; else OS << "ImplicitList" << EmittedLists[DefList] << ", ";