diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-11-20 02:32:35 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-11-20 02:32:35 +0000 |
commit | d37c13cfd1bf4b08d0b99d93c799a1caa74cf3c6 (patch) | |
tree | d2ae90ed4c43c90d89fa90448c066c1435b441ff /include/llvm/CodeGen/RegisterScavenging.h | |
parent | 97c573d5de4f729f9b3a5db59c6daa3a6fc7efe4 (diff) | |
download | llvm-d37c13cfd1bf4b08d0b99d93c799a1caa74cf3c6.tar.gz llvm-d37c13cfd1bf4b08d0b99d93c799a1caa74cf3c6.tar.bz2 llvm-d37c13cfd1bf4b08d0b99d93c799a1caa74cf3c6.tar.xz |
- Register scavenger should use MachineRegisterInfo and internal map to find the first use of a register after a given machine instruction.
- When scavenging a register, in addition to the spill, insert a restore before the first use.
- Abort if client is looking to scavenge a register even when a previously scavenged register is still live.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59697 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/CodeGen/RegisterScavenging.h')
-rw-r--r-- | include/llvm/CodeGen/RegisterScavenging.h | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/include/llvm/CodeGen/RegisterScavenging.h b/include/llvm/CodeGen/RegisterScavenging.h index 4b1a6a9409..0108dcd046 100644 --- a/include/llvm/CodeGen/RegisterScavenging.h +++ b/include/llvm/CodeGen/RegisterScavenging.h @@ -19,6 +19,7 @@ #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/ADT/BitVector.h" +#include "llvm/ADT/DenseMap.h" namespace llvm { @@ -28,6 +29,9 @@ class TargetInstrInfo; class TargetRegisterClass; class RegScavenger { + const TargetRegisterInfo *TRI; + const TargetInstrInfo *TII; + MachineRegisterInfo* MRI; MachineBasicBlock *MBB; MachineBasicBlock::iterator MBBI; unsigned NumPhysRegs; @@ -48,6 +52,18 @@ class RegScavenger { /// const TargetRegisterClass *ScavengedRC; + /// ScavengeRestore - Instruction that restores the scavenged register from + /// stack. + const MachineInstr *ScavengeRestore; + + /// CalleeSavedrRegs - A bitvector of callee saved registers for the target. + /// + BitVector CalleeSavedRegs; + + /// ReservedRegs - A bitvector of reserved registers. + /// + BitVector ReservedRegs; + /// RegsAvailable - The current state of all the physical registers immediately /// before MBBI. One bit per physical register. If bit is set that means it's /// available, unset means the register is currently being used. @@ -57,6 +73,14 @@ class RegScavenger { /// implicit_def instructions. That means it can be clobbered at will. BitVector ImplicitDefed; + /// CurrDist - Distance from MBB entry to the current instruction MBBI. + /// + unsigned CurrDist; + + /// DistanceMap - Keep track the distance of a MI from the start of the + /// current basic block. + DenseMap<MachineInstr*, unsigned> DistanceMap; + public: RegScavenger() : MBB(NULL), NumPhysRegs(0), Tracking(false), @@ -143,21 +167,13 @@ public: } private: - const TargetRegisterInfo *TRI; - const TargetInstrInfo *TII; - MachineRegisterInfo* MRI; - - /// CalleeSavedrRegs - A bitvector of callee saved registers for the target. - /// - BitVector CalleeSavedRegs; - - /// ReservedRegs - A bitvector of reserved registers. - /// - BitVector ReservedRegs; - /// restoreScavengedReg - Restore scavenged by loading it back from the /// emergency spill slot. Mark it used. void restoreScavengedReg(); + + MachineInstr *findFirstUse(MachineBasicBlock *MBB, + MachineBasicBlock::iterator I, unsigned Reg, + unsigned &Dist); }; } // End llvm namespace |