diff options
author | Alkis Evlogimenos <alkis@evlogimenos.com> | 2004-02-25 21:55:45 +0000 |
---|---|---|
committer | Alkis Evlogimenos <alkis@evlogimenos.com> | 2004-02-25 21:55:45 +0000 |
commit | 4d0d864be3d9a698c4edfe36961a22126f041298 (patch) | |
tree | 09856bbbbec226b436a6e3a24aea571e5249e4e6 /lib/CodeGen/RegAllocLocal.cpp | |
parent | dd429c6de9e4c65d4992ec6494e57635dcb2b641 (diff) |
Add DenseMap template and actually use it for for mapping virtual regs
to objects.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11840 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/RegAllocLocal.cpp')
-rw-r--r-- | lib/CodeGen/RegAllocLocal.cpp | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/lib/CodeGen/RegAllocLocal.cpp b/lib/CodeGen/RegAllocLocal.cpp index a3d66391cc..f3753326ee 100644 --- a/lib/CodeGen/RegAllocLocal.cpp +++ b/lib/CodeGen/RegAllocLocal.cpp @@ -23,6 +23,7 @@ #include "llvm/Target/TargetMachine.h" #include "Support/CommandLine.h" #include "Support/Debug.h" +#include "Support/DenseMap.h" #include "Support/Statistic.h" #include <iostream> using namespace llvm; @@ -43,19 +44,11 @@ namespace { std::map<unsigned, int> StackSlotForVirtReg; // Virt2PhysRegMap - This map contains entries for each virtual register - // that is currently available in a physical register. This is "logically" - // a map from virtual register numbers to physical register numbers. - // Instead of using a map, however, which is slow, we use a vector. The - // index is the VREG number - FirstVirtualRegister. If the entry is zero, - // then it is logically "not in the map". - // - std::vector<unsigned> Virt2PhysRegMap; + // that is currently available in a physical register. + DenseMap<unsigned, VirtReg2IndexFunctor> Virt2PhysRegMap; unsigned &getVirt2PhysRegMapSlot(unsigned VirtReg) { - assert(MRegisterInfo::isVirtualRegister(VirtReg) &&"Illegal VREG #"); - assert(VirtReg-MRegisterInfo::FirstVirtualRegister <Virt2PhysRegMap.size() - && "VirtReg not in map!"); - return Virt2PhysRegMap[VirtReg-MRegisterInfo::FirstVirtualRegister]; + return Virt2PhysRegMap[VirtReg]; } // PhysRegsUsed - This array is effectively a map, containing entries for @@ -661,7 +654,8 @@ void RA::AllocateBasicBlock(MachineBasicBlock &MBB) { #ifndef NDEBUG bool AllOk = true; - for (unsigned i = 0, e = Virt2PhysRegMap.size(); i != e; ++i) + for (unsigned i = MRegisterInfo::FirstVirtualRegister, + e = MF->getSSARegMap()->getLastVirtReg(); i <= e; ++i) if (unsigned PR = Virt2PhysRegMap[i]) { std::cerr << "Register still mapped: " << i << " -> " << PR << "\n"; AllOk = false; @@ -689,7 +683,8 @@ bool RA::runOnMachineFunction(MachineFunction &Fn) { // initialize the virtual->physical register map to have a 'null' // mapping for all virtual registers - Virt2PhysRegMap.assign(MF->getSSARegMap()->getNumVirtualRegs(), 0); + Virt2PhysRegMap.clear(); + Virt2PhysRegMap.grow(MF->getSSARegMap()->getLastVirtReg()); // Loop over all of the basic blocks, eliminating virtual register references for (MachineFunction::iterator MBB = Fn.begin(), MBBe = Fn.end(); |