diff --git a/llvm/lib/CodeGen/RegAlloc/PhyRegAlloc.h b/llvm/lib/CodeGen/RegAlloc/PhyRegAlloc.h index dc7772e4a238..6790acd8bde0 100644 --- a/llvm/lib/CodeGen/RegAlloc/PhyRegAlloc.h +++ b/llvm/lib/CodeGen/RegAlloc/PhyRegAlloc.h @@ -20,6 +20,7 @@ #define PHY_REG_ALLOC_H #include "llvm/CodeGen/LiveRangeInfo.h" +#include "llvm/CodeGen/MachineBasicBlock.h" #include "Support/NonCopyable.h" #include @@ -81,7 +82,6 @@ public: // void allocateRegisters(); - // access to register classes by class ID // const RegClass* getRegClassByID(unsigned int id) const { @@ -90,7 +90,7 @@ public: RegClass* getRegClassByID(unsigned int id) { return RegClassList[id]; } - + private: void addInterference(const Value *Def, const ValueSet *LVSet, bool isCallInst); @@ -109,32 +109,45 @@ private: void allocateStackSpace4SpilledLRs(); void insertCode4SpilledLR (const LiveRange *LR, - MachineInstr *MInst, - const BasicBlock *BB, + MachineBasicBlock::iterator& MII, + MachineBasicBlock &MBB, const unsigned OpNum); + // Method for inserting caller saving code. The caller must save all the + // volatile registers live across a call. + void insertCallerSavingCode(std::vector& instrnsBefore, + std::vector& instrnsAfter, + MachineInstr *CallMI, + const BasicBlock *BB); + inline void constructLiveRanges() { LRI.constructLiveRanges(); } void colorIncomingArgs(); void colorCallRetArgs(); void updateMachineCode(); - void updateInstruction(MachineInstr* MInst, BasicBlock* BB); + void updateInstruction(MachineBasicBlock::iterator& MII, + MachineBasicBlock &MBB); void printLabel(const Value *const Val); void printMachineCode(); - friend class UltraSparcRegInfo; // FIXME: remove this - int getUsableUniRegAtMI(int RegType, const ValueSet *LVSetBef, MachineInstr *MInst, std::vector& MIBef, std::vector& MIAft); + // Callback method used to find unused registers. + // LVSetBef is the live variable set to search for an unused register. + // If it is not specified, the LV set before the current MInst is used. + // This is sufficient as long as no new copy instructions are generated + // to copy the free register to memory. + // int getUnusedUniRegAtMI(RegClass *RC, const int RegType, - const MachineInstr *MInst, const ValueSet *LVSetBef); - + const MachineInstr *MInst, + const ValueSet *LVSetBef = 0); + void setRelRegsUsedByThisInst(RegClass *RC, const int RegType, const MachineInstr *MInst );