LLVM API Documentation
00001 //===-- RegisterScavenging.h - Machine register scavenging ------*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This file declares the machine register scavenger class. It can provide 00011 // information such as unused register at any point in a machine basic block. 00012 // It also provides a mechanism to make registers availbale by evicting them 00013 // to spill slots. 00014 // 00015 //===----------------------------------------------------------------------===// 00016 00017 #ifndef LLVM_CODEGEN_REGISTER_SCAVENGING_H 00018 #define LLVM_CODEGEN_REGISTER_SCAVENGING_H 00019 00020 #include "llvm/CodeGen/MachineBasicBlock.h" 00021 #include "llvm/ADT/BitVector.h" 00022 #include "llvm/ADT/DenseMap.h" 00023 00024 namespace llvm { 00025 00026 class MachineRegisterInfo; 00027 class TargetRegisterInfo; 00028 class TargetInstrInfo; 00029 class TargetRegisterClass; 00030 00031 class RegScavenger { 00032 const TargetRegisterInfo *TRI; 00033 const TargetInstrInfo *TII; 00034 MachineRegisterInfo* MRI; 00035 MachineBasicBlock *MBB; 00036 MachineBasicBlock::iterator MBBI; 00037 unsigned NumPhysRegs; 00038 00039 /// Tracking - True if RegScavenger is currently tracking the liveness of 00040 /// registers. 00041 bool Tracking; 00042 00043 /// ScavengingFrameIndex - Special spill slot used for scavenging a register 00044 /// post register allocation. 00045 int ScavengingFrameIndex; 00046 00047 /// ScavengedReg - If none zero, the specific register is currently being 00048 /// scavenged. That is, it is spilled to the special scavenging stack slot. 00049 unsigned ScavengedReg; 00050 00051 /// ScavengedRC - Register class of the scavenged register. 00052 /// 00053 const TargetRegisterClass *ScavengedRC; 00054 00055 /// ScavengeRestore - Instruction that restores the scavenged register from 00056 /// stack. 00057 const MachineInstr *ScavengeRestore; 00058 00059 /// CalleeSavedrRegs - A bitvector of callee saved registers for the target. 00060 /// 00061 BitVector CalleeSavedRegs; 00062 00063 /// ReservedRegs - A bitvector of reserved registers. 00064 /// 00065 BitVector ReservedRegs; 00066 00067 /// RegsAvailable - The current state of all the physical registers immediately 00068 /// before MBBI. One bit per physical register. If bit is set that means it's 00069 /// available, unset means the register is currently being used. 00070 BitVector RegsAvailable; 00071 00072 /// ImplicitDefed - If bit is set that means the register is defined by an 00073 /// implicit_def instructions. That means it can be clobbered at will. 00074 BitVector ImplicitDefed; 00075 00076 /// CurrDist - Distance from MBB entry to the current instruction MBBI. 00077 /// 00078 unsigned CurrDist; 00079 00080 /// DistanceMap - Keep track the distance of a MI from the start of the 00081 /// current basic block. 00082 DenseMap<MachineInstr*, unsigned> DistanceMap; 00083 00084 public: 00085 RegScavenger() 00086 : MBB(NULL), NumPhysRegs(0), Tracking(false), 00087 ScavengingFrameIndex(-1), ScavengedReg(0), ScavengedRC(NULL) {} 00088 00089 /// enterBasicBlock - Start tracking liveness from the begin of the specific 00090 /// basic block. 00091 void enterBasicBlock(MachineBasicBlock *mbb); 00092 00093 /// forward / backward - Move the internal MBB iterator and update register 00094 /// states. 00095 void forward(); 00096 void backward(); 00097 00098 /// forward / backward - Move the internal MBB iterator and update register 00099 /// states until it has processed the specific iterator. 00100 void forward(MachineBasicBlock::iterator I) { 00101 if (!Tracking && MBB->begin() != I) forward(); 00102 while (MBBI != I) forward(); 00103 } 00104 void backward(MachineBasicBlock::iterator I) { 00105 while (MBBI != I) backward(); 00106 } 00107 00108 /// skipTo - Move the internal MBB iterator but do not update register states. 00109 /// 00110 void skipTo(MachineBasicBlock::iterator I) { MBBI = I; } 00111 00112 /// isReserved - Returns true if a register is reserved. It is never "unused". 00113 bool isReserved(unsigned Reg) const { return ReservedRegs[Reg]; } 00114 00115 /// isUsed / isUsed - Test if a register is currently being used. 00116 /// 00117 bool isUsed(unsigned Reg) const { return !RegsAvailable[Reg]; } 00118 bool isUnused(unsigned Reg) const { return RegsAvailable[Reg]; } 00119 00120 bool isImplicitlyDefined(unsigned Reg) const { return ImplicitDefed[Reg]; } 00121 00122 /// getRegsUsed - return all registers currently in use in used. 00123 void getRegsUsed(BitVector &used, bool includeReserved); 00124 00125 /// setUsed / setUnused - Mark the state of one or a number of registers. 00126 /// 00127 void setUsed(unsigned Reg, bool ImpDef = false); 00128 void setUsed(BitVector Regs, bool ImpDef = false) { 00129 RegsAvailable &= ~Regs; 00130 if (ImpDef) 00131 ImplicitDefed |= Regs; 00132 else 00133 ImplicitDefed &= ~Regs; 00134 } 00135 void setUnused(unsigned Reg, const MachineInstr *MI); 00136 void setUnused(BitVector Regs) { 00137 RegsAvailable |= Regs; 00138 ImplicitDefed &= ~Regs; 00139 } 00140 00141 /// FindUnusedReg - Find a unused register of the specified register class 00142 /// from the specified set of registers. It return 0 is none is found. 00143 unsigned FindUnusedReg(const TargetRegisterClass *RegClass, 00144 const BitVector &Candidates) const; 00145 00146 /// FindUnusedReg - Find a unused register of the specified register class. 00147 /// Exclude callee saved registers if directed. It return 0 is none is found. 00148 unsigned FindUnusedReg(const TargetRegisterClass *RegClass, 00149 bool ExCalleeSaved = false) const; 00150 00151 /// setScavengingFrameIndex / getScavengingFrameIndex - accessor and setter of 00152 /// ScavengingFrameIndex. 00153 void setScavengingFrameIndex(int FI) { ScavengingFrameIndex = FI; } 00154 int getScavengingFrameIndex() const { return ScavengingFrameIndex; } 00155 00156 /// scavengeRegister - Make a register of the specific register class 00157 /// available and do the appropriate bookkeeping. SPAdj is the stack 00158 /// adjustment due to call frame, it's passed along to eliminateFrameIndex(). 00159 /// Returns the scavenged register. 00160 unsigned scavengeRegister(const TargetRegisterClass *RegClass, 00161 MachineBasicBlock::iterator I, int SPAdj); 00162 unsigned scavengeRegister(const TargetRegisterClass *RegClass, int SPAdj) { 00163 return scavengeRegister(RegClass, MBBI, SPAdj); 00164 } 00165 00166 private: 00167 /// restoreScavengedReg - Restore scavenged by loading it back from the 00168 /// emergency spill slot. Mark it used. 00169 void restoreScavengedReg(); 00170 00171 MachineInstr *findFirstUse(MachineBasicBlock *MBB, 00172 MachineBasicBlock::iterator I, unsigned Reg, 00173 unsigned &Dist); 00174 }; 00175 00176 } // End llvm namespace 00177 00178 #endif