summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-12-30 23:40:31 +0000
committerChris Lattner <sabre@nondot.org>2007-12-30 23:40:31 +0000
commit1c0780985d18a26a41cab8a821ab697ee1bbdfd9 (patch)
tree9747bed32c9b0291bcac290b4390f061460bc686
parent8aa797aa51cd4ea1ec6f46f4891a6897944b75b2 (diff)
downloadllvm-1c0780985d18a26a41cab8a821ab697ee1bbdfd9.tar.gz
llvm-1c0780985d18a26a41cab8a821ab697ee1bbdfd9.tar.bz2
llvm-1c0780985d18a26a41cab8a821ab697ee1bbdfd9.tar.xz
slightly simplify and document SSARegMap.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45465 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/CodeGen/SSARegMap.h43
1 files changed, 24 insertions, 19 deletions
diff --git a/include/llvm/CodeGen/SSARegMap.h b/include/llvm/CodeGen/SSARegMap.h
index feb5c19090..35193cfc37 100644
--- a/include/llvm/CodeGen/SSARegMap.h
+++ b/include/llvm/CodeGen/SSARegMap.h
@@ -7,10 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
-// Map register numbers to register classes that are correctly sized (typed) to
-// hold the information. Assists register allocation. Contained by
-// MachineFunction, should be deleted by register allocator when it is no
-// longer needed.
+// This file defines the SSARegMap class.
//
//===----------------------------------------------------------------------===//
@@ -18,21 +15,28 @@
#define LLVM_CODEGEN_SSAREGMAP_H
#include "llvm/Target/MRegisterInfo.h"
-#include "llvm/ADT/IndexedMap.h"
+#include <vector>
namespace llvm {
-
-class TargetRegisterClass;
-
+
+/// SSARegMap - Keep track of information for each virtual register, including
+/// its register class.
class SSARegMap {
- IndexedMap<const TargetRegisterClass*, VirtReg2IndexFunctor> RegClassMap;
- unsigned NextRegNum;
-
- public:
- SSARegMap() : NextRegNum(MRegisterInfo::FirstVirtualRegister) { }
+ /// VRegInfo - Information we keep for each virtual register. The entries in
+ /// this vector are actually converted to vreg numbers by adding the
+ /// MRegisterInfo::FirstVirtualRegister delta to their index.
+ std::vector<const TargetRegisterClass*> VRegInfo;
+
+public:
+ SSARegMap() {
+ VRegInfo.reserve(256);
+ }
- const TargetRegisterClass* getRegClass(unsigned Reg) {
- return RegClassMap[Reg];
+ /// getRegClass - Return the register class of the specified virtual register.
+ const TargetRegisterClass *getRegClass(unsigned Reg) {
+ Reg -= MRegisterInfo::FirstVirtualRegister;
+ assert(Reg < VRegInfo.size() && "Invalid vreg!");
+ return VRegInfo[Reg];
}
/// createVirtualRegister - Create and return a new virtual register in the
@@ -40,13 +44,14 @@ class SSARegMap {
///
unsigned createVirtualRegister(const TargetRegisterClass *RegClass) {
assert(RegClass && "Cannot create register without RegClass!");
- RegClassMap.grow(NextRegNum);
- RegClassMap[NextRegNum] = RegClass;
- return NextRegNum++;
+ VRegInfo.push_back(RegClass);
+ return getLastVirtReg();
}
+ /// getLastVirtReg - Return the highest currently assigned virtual register.
+ ///
unsigned getLastVirtReg() const {
- return NextRegNum - 1;
+ return VRegInfo.size()+MRegisterInfo::FirstVirtualRegister-1;
}
};