diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-03-20 08:13:50 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-03-20 08:13:50 +0000 |
commit | 2638e1a6b9e3c0e22b398987e1db99bee81db4fb (patch) | |
tree | e3b4b57156d3fc3776657d0899fc255b3d4da09b /lib/CodeGen/VirtRegMap.h | |
parent | c70d1849b7b85b06adf7dce856b3b19028fff8f7 (diff) | |
download | external_llvm-2638e1a6b9e3c0e22b398987e1db99bee81db4fb.zip external_llvm-2638e1a6b9e3c0e22b398987e1db99bee81db4fb.tar.gz external_llvm-2638e1a6b9e3c0e22b398987e1db99bee81db4fb.tar.bz2 |
First cut trivial re-materialization support.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35208 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/VirtRegMap.h')
-rw-r--r-- | lib/CodeGen/VirtRegMap.h | 46 |
1 files changed, 41 insertions, 5 deletions
diff --git a/lib/CodeGen/VirtRegMap.h b/lib/CodeGen/VirtRegMap.h index 5b06c01..61ce92f 100644 --- a/lib/CodeGen/VirtRegMap.h +++ b/lib/CodeGen/VirtRegMap.h @@ -18,6 +18,7 @@ #define LLVM_CODEGEN_VIRTREGMAP_H #include "llvm/Target/MRegisterInfo.h" +#include "llvm/ADT/BitVector.h" #include "llvm/ADT/IndexedMap.h" #include "llvm/Support/Streams.h" #include <map> @@ -28,6 +29,12 @@ namespace llvm { class VirtRegMap { public: + enum { + NO_PHYS_REG = 0, + NO_STACK_SLOT = ~0 >> 1, + MAX_STACK_SLOT = (1 << 18)-1 + }; + enum ModRef { isRef = 1, isMod = 2, isModRef = 3 }; typedef std::multimap<MachineInstr*, std::pair<unsigned, ModRef> > MI2VirtMapTy; @@ -53,14 +60,20 @@ namespace llvm { /// read/written by this instruction. MI2VirtMapTy MI2VirtMap; + /// ReMatMap - This is irtual register to re-materialized instruction + /// mapping. Each virtual register whose definition is going to be + /// re-materialized has an entry in it. + std::map<unsigned, const MachineInstr*> ReMatMap; + + /// ReMatId - Instead of assigning a stack slot to a to be rematerialized + /// virtaul register, an unique id is being assinged. This keeps track of + /// the highest id used so far. Note, this starts at (1<<18) to avoid + /// conflicts with stack slot numbers. + int ReMatId; + VirtRegMap(const VirtRegMap&); // DO NOT IMPLEMENT void operator=(const VirtRegMap&); // DO NOT IMPLEMENT - enum { - NO_PHYS_REG = 0, - NO_STACK_SLOT = ~0 >> 1 - }; - public: VirtRegMap(MachineFunction &mf); @@ -125,6 +138,29 @@ namespace llvm { /// the specified stack slot void assignVirt2StackSlot(unsigned virtReg, int frameIndex); + /// @brief assign an unique re-materialization id to the specified + /// virtual register. + int assignVirtReMatId(unsigned virtReg); + + /// @brief returns true if the specified virtual register is being + /// re-materialized. + bool isReMaterialized(unsigned virtReg) const { + return ReMatMap.count(virtReg) != 0; + } + + /// @brief returns the original machine instruction being re-issued + /// to re-materialize the specified virtual register. + const MachineInstr *getReMaterializedMI(unsigned virtReg) { + return ReMatMap[virtReg]; + } + + /// @brief records the specified virtual register will be + /// re-materialized and the original instruction which will be re-issed + /// for this purpose. + void setVirtIsReMaterialized(unsigned virtReg, MachineInstr *def) { + ReMatMap[virtReg] = def; + } + /// @brief Updates information about the specified virtual register's value /// folded into newMI machine instruction. The OpNum argument indicates the /// operand number of OldMI that is folded. |