LLVM API Documentation

RegisterScavenging.h

Go to the documentation of this file.
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