summaryrefslogtreecommitdiff
path: root/include/llvm/CodeGen/RegisterScavenging.h
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2008-11-20 02:32:35 +0000
committerEvan Cheng <evan.cheng@apple.com>2008-11-20 02:32:35 +0000
commitd37c13cfd1bf4b08d0b99d93c799a1caa74cf3c6 (patch)
treed2ae90ed4c43c90d89fa90448c066c1435b441ff /include/llvm/CodeGen/RegisterScavenging.h
parent97c573d5de4f729f9b3a5db59c6daa3a6fc7efe4 (diff)
downloadllvm-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.h40
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