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/VirtRegMap.h | |
parent | dd429c6de9e4c65d4992ec6494e57635dcb2b641 (diff) | |
download | external_llvm-4d0d864be3d9a698c4edfe36961a22126f041298.zip external_llvm-4d0d864be3d9a698c4edfe36961a22126f041298.tar.gz external_llvm-4d0d864be3d9a698c4edfe36961a22126f041298.tar.bz2 |
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/VirtRegMap.h')
-rw-r--r-- | lib/CodeGen/VirtRegMap.h | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/lib/CodeGen/VirtRegMap.h b/lib/CodeGen/VirtRegMap.h index b5a819f..3c991ab 100644 --- a/lib/CodeGen/VirtRegMap.h +++ b/lib/CodeGen/VirtRegMap.h @@ -20,14 +20,15 @@ #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/SSARegMap.h" +#include "Support/DenseMap.h" #include <climits> namespace llvm { class VirtRegMap { public: - typedef std::vector<unsigned> Virt2PhysMap; - typedef std::vector<int> Virt2StackSlotMap; + typedef DenseMap<unsigned, VirtReg2IndexFunctor> Virt2PhysMap; + typedef DenseMap<int, VirtReg2IndexFunctor> Virt2StackSlotMap; private: MachineFunction* mf_; @@ -38,13 +39,6 @@ namespace llvm { VirtRegMap(const VirtRegMap& rhs); const VirtRegMap& operator=(const VirtRegMap& rhs); - static unsigned toIndex(unsigned virtReg) { - return virtReg - MRegisterInfo::FirstVirtualRegister; - } - static unsigned fromIndex(unsigned index) { - return index + MRegisterInfo::FirstVirtualRegister; - } - enum { NO_PHYS_REG = 0, NO_STACK_SLOT = INT_MAX @@ -53,8 +47,10 @@ namespace llvm { public: VirtRegMap(MachineFunction& mf) : mf_(&mf), - v2pMap_(mf.getSSARegMap()->getNumVirtualRegs(), NO_PHYS_REG), - v2ssMap_(mf.getSSARegMap()->getNumVirtualRegs(), NO_STACK_SLOT) { + v2pMap_(NO_PHYS_REG), + v2ssMap_(NO_STACK_SLOT) { + v2pMap_.grow(mf.getSSARegMap()->getLastVirtReg()); + v2ssMap_.grow(mf.getSSARegMap()->getLastVirtReg()); } bool hasPhys(unsigned virtReg) const { @@ -63,23 +59,23 @@ namespace llvm { unsigned getPhys(unsigned virtReg) const { assert(MRegisterInfo::isVirtualRegister(virtReg)); - return v2pMap_[toIndex(virtReg)]; + return v2pMap_[virtReg]; } void assignVirt2Phys(unsigned virtReg, unsigned physReg) { assert(MRegisterInfo::isVirtualRegister(virtReg) && MRegisterInfo::isPhysicalRegister(physReg)); - assert(v2pMap_[toIndex(virtReg)] == NO_PHYS_REG && + assert(v2pMap_[virtReg] == NO_PHYS_REG && "attempt to assign physical register to already mapped " "virtual register"); - v2pMap_[toIndex(virtReg)] = physReg; + v2pMap_[virtReg] = physReg; } void clearVirtReg(unsigned virtReg) { assert(MRegisterInfo::isVirtualRegister(virtReg)); - assert(v2pMap_[toIndex(virtReg)] != NO_PHYS_REG && + assert(v2pMap_[virtReg] != NO_PHYS_REG && "attempt to clear a not assigned virtual register"); - v2pMap_[toIndex(virtReg)] = NO_PHYS_REG; + v2pMap_[virtReg] = NO_PHYS_REG; } bool hasStackSlot(unsigned virtReg) const { @@ -88,7 +84,7 @@ namespace llvm { int getStackSlot(unsigned virtReg) const { assert(MRegisterInfo::isVirtualRegister(virtReg)); - return v2ssMap_[toIndex(virtReg)]; + return v2ssMap_[virtReg]; } int assignVirt2StackSlot(unsigned virtReg); |