[llvm-commits] CVS: llvm/include/llvm/CodeGen/RegisterScavenging.h
Evan Cheng
evan.cheng at apple.com
Thu Feb 22 17:01:37 PST 2007
Changes in directory llvm/include/llvm/CodeGen:
RegisterScavenging.h added (r1.1)
---
Log message:
Initial check in of register scavenger. Its only current functionality is tracking live registers per MBB.
---
Diffs of the changes: (+75 -0)
RegisterScavenging.h | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 75 insertions(+)
Index: llvm/include/llvm/CodeGen/RegisterScavenging.h
diff -c /dev/null llvm/include/llvm/CodeGen/RegisterScavenging.h:1.1
*** /dev/null Thu Feb 22 19:01:29 2007
--- llvm/include/llvm/CodeGen/RegisterScavenging.h Thu Feb 22 19:01:19 2007
***************
*** 0 ****
--- 1,75 ----
+ //===-- RegisterScavenging.h - Machine register scavenging ------*- C++ -*-===//
+ //
+ // The LLVM Compiler Infrastructure
+ //
+ // This file was developed by the Evan Cheng and is distributed under the
+ // University of Illinois Open Source License. See LICENSE.TXT for details.
+ //
+ //===----------------------------------------------------------------------===//
+ //
+ // This file declares the machine register scavenger class. It can provide
+ // information such as unused register at any point in a machine basic block.
+ // It also provides a mechanism to make registers availbale by evicting them
+ // to spill slots.
+ //
+ //===----------------------------------------------------------------------===//
+
+ #ifndef LLVM_CODEGEN_REGISTER_SCAVENGING_H
+ #define LLVM_CODEGEN_REGISTER_SCAVENGING_H
+
+ #include "llvm/CodeGen/MachineBasicBlock.h"
+ #include "llvm/ADT/BitVector.h"
+
+ namespace llvm {
+
+ class TargetRegisterClass;
+
+ class RegScavenger {
+ MachineBasicBlock *MBB;
+ MachineBasicBlock::iterator MBBI;
+ unsigned NumPhysRegs;
+
+ /// RegStates - 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.
+ BitVector RegStates;
+
+ public:
+ RegScavenger(MachineBasicBlock *mbb);
+
+ /// forward / backward - Move the internal MBB iterator and update register
+ /// states.
+ void forward();
+ void backward();
+
+ /// isReserved - Returns true if a register is reserved. It is never "unused".
+ bool isReserved(unsigned Reg) const { return ReservedRegs[Reg]; }
+
+ /// isUsed / isUsed - Test if a register is currently being used.
+ ///
+ bool isUsed(unsigned Reg) const { return !RegStates[Reg]; }
+ bool isUnused(unsigned Reg) const { return RegStates[Reg]; }
+
+ /// setUsed / setUnused - Mark the state of one or a number of registers.
+ ///
+ void setUsed(unsigned Reg) { RegStates.reset(Reg); }
+ void setUsed(BitVector Regs) { RegStates &= ~Regs; }
+ void setUnused(unsigned Reg) { RegStates.set(Reg); }
+ void setUnused(BitVector Regs) { RegStates |= Regs; }
+
+ /// FindUnusedReg - Find a unused register of the specified register class.
+ /// Exclude callee saved registers if directed. It return 0 is none is found.
+ unsigned FindUnusedReg(const TargetRegisterClass *RegClass,
+ bool ExCalleeSaved = false) const;
+
+ private:
+ /// CalleeSavedrRegs - A bitvector of callee saved registers for the target.
+ BitVector CalleeSavedRegs;
+
+ /// ReservedRegs - A bitvector of reserved registers.
+ BitVector ReservedRegs;
+ };
+
+ } // End llvm namespace
+
+ #endif
More information about the llvm-commits
mailing list