Rewrote uses of deprecated `MachineFunction::get(BasicBlock *BB)'.
[oota-llvm.git] / lib / Target / SparcV9 / RegAlloc / PhyRegAlloc.h
index 0380e803add6cbc60165787f33ac533ac054d6ee..12f0bf05ebf00c23265ed9fdfd070e249b78958b 100644 (file)
@@ -1,9 +1,10 @@
-/* Title:   PhyRegAlloc.h
+/* Title:   PhyRegAlloc.h   -*- C++ -*-
    Author:  Ruchira Sasanka
    Date:    Aug 20, 01
    Purpose: This is the main entry point for register allocation.
 
    Notes:
+   =====
 
  * RegisterClasses: Each RegClass accepts a 
    MachineRegClass which contains machine specific info about that register
  * Machine dependent work: All parts of the register coloring algorithm
    except coloring of an individual node are machine independent.
 
-   Register allocation must be done  as:
+   Register allocation must be done  as:       
 
-     static const MachineRegInfo MRI = MachineRegInfo();  // machine reg info 
+      FunctionLiveVarInfo LVI(*FunctionI );           // compute LV info
+      LVI.analyze();
 
-     MethodLiveVarInfo LVI(*MethodI );                    // compute LV info
-     LVI.analyze();
+      TargetMachine &target = ....                             
 
-     PhyRegAlloc PRA(*MethodI, &MRI, &LVI);               // allocate regs
-     PRA.allocateRegisters();
-
-   Assumptions: 
-     All values in a live range will be of the same physical reg class.
 
+      PhyRegAlloc PRA(*FunctionI, target, &LVI);     // allocate regs
+      PRA.allocateRegisters();
 */ 
 
 #ifndef PHY_REG_ALLOC_H
 #define PHY_REG_ALLOC_H
 
-#include "llvm/CodeGen/MachineInstr.h"
 #include "llvm/CodeGen/RegClass.h"
 #include "llvm/CodeGen/LiveRangeInfo.h"
-#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
-
-#include <deque>
+#include <vector>
+#include <map>
 
+class MachineFunction;
+class MachineRegInfo;
+class FunctionLiveVarInfo;
+class MachineInstr;
+class LoopInfo;
 
 //----------------------------------------------------------------------------
 // Class AddedInstrns:
 // to store such instructions added before and after an existing instruction.
 //----------------------------------------------------------------------------
 
-class AddedInstrns
-{
- public:
-  deque<MachineInstr *> InstrnsBefore;  // Added insts BEFORE an existing inst
-  deque<MachineInstr *> InstrnsAfter;   // Added insts AFTER an existing inst
-
-  AddedInstrns() : InstrnsBefore(), InstrnsAfter() { }
+struct AddedInstrns {
+  std::vector<MachineInstr*> InstrnsBefore;//Insts added BEFORE an existing inst
+  std::vector<MachineInstr*> InstrnsAfter; //Insts added AFTER an existing inst
 };
 
-typedef hash_map<const MachineInstr *, AddedInstrns *> AddedInstrMapType;
-
-
-
-//----------------------------------------------------------------------------
-// Class RegStackOffsets:
-// This class is responsible for managing stack frame of the method for
-// register allocation.
-//
-//----------------------------------------------------------------------------
-
-class RegStackOffsets {
-
- private:
-  int curSpilledVarOff;                 // cur pos of spilled LRs
-  int curNewTmpPosOffset;               // cur pos of tmp values on stack
-  bool isTmpRegionUsable;               // can we call getNewTmpPosOffFromFP
-
-  const int SizeOfStackItem;            // size of an item on stack
-  const int StackSpillStartFromFP;      // start position of spill region
-  int StartOfTmpRegion;                 // start of the tmp var region
-
- public:
-
-  // constructor  
-
-  RegStackOffsets(int SEnSize=8, int StartSpill=176 ) : 
-    SizeOfStackItem(SEnSize),  StackSpillStartFromFP(StartSpill) {
-
-    curSpilledVarOff = StartSpill;   
-    isTmpRegionUsable = false;
-  };
-
-
-  int getNewSpillOffFromFP() { 
-    int tmp =  curSpilledVarOff;     
-    curSpilledVarOff += SizeOfStackItem;
-    return tmp;   // **TODO: Is sending un-incremented value correct?
-  };
-
-
-  // The following method must be called only after allocating space
-  // for spilled LRs and calling setEndOfSpillRegion()
-  int getNewTmpPosOffFromFP() { 
-    assert( isTmpRegionUsable && "Spill region still open");
-    int tmp = curNewTmpPosOffset;
-    curNewTmpPosOffset += SizeOfStackItem;
-    return tmp; //**TODO: Is sending un-incremented val correct?
-  };
-
-
-  // This method is called when we have allocated space for all spilled
-  // LRs. The tmp region can be used only after a call to this method.
-
-  void setEndOfSpillRegion() {
-    assert(( ! isTmpRegionUsable) && "setEndOfSpillRegion called again");
-    isTmpRegionUsable = true;
-    StartOfTmpRegion = curSpilledVarOff; 
-  }
-  
-
-  // called when temporary values allocated on stack are no longer needed
-  void resetTmpPos() { 
-    curNewTmpPosOffset = StartOfTmpRegion;
-  }
-
-};
+typedef std::map<const MachineInstr *, AddedInstrns> AddedInstrMapType;
 
 
 
 //----------------------------------------------------------------------------
 // class PhyRegAlloc:
 // Main class the register allocator. Call allocateRegisters() to allocate
-// registers for a Method.
+// registers for a Function.
 //----------------------------------------------------------------------------
 
 
-class PhyRegAlloc
-{
+class PhyRegAlloc: public NonCopyable {
 
-  vector<RegClass *> RegClassList  ;    // vector of register classes
-  const Method *const Meth;             // name of the method we work on
+  std::vector<RegClass *> RegClassList; // vector of register classes
   const TargetMachine &TM;              // target machine
-  MethodLiveVarInfo *const LVI;         // LV information for this method 
+  const Function *Fn;                   // name of the function we work on
+  MachineFunction &MF;                  // descriptor for method's native code
+  FunctionLiveVarInfo *const LVI;       // LV information for this method 
                                         // (already computed for BBs) 
   LiveRangeInfo LRI;                    // LR info  (will be computed)
   const MachineRegInfo &MRI;            // Machine Register information
   const unsigned NumOfRegClasses;       // recorded here for efficiency
 
-  //vector<const Instruction *> CallInstrList;  // a list of all call instrs
-  //vector<const Instruction *> RetInstrList;   // a list of all return instrs
-
   
   AddedInstrMapType AddedInstrMap;      // to store instrns added in this phase
+  AddedInstrns AddedInstrAtEntry;       // to store instrns added at entry
+  LoopInfo *LoopDepthCalc;              // to calculate loop depths 
+  ReservedColorListType ResColList;     // A set of reserved regs if desired.
+                                        // currently not used
+
+public:
+  PhyRegAlloc(Function *F, const TargetMachine& TM, FunctionLiveVarInfo *Lvi,
+              LoopInfo *LoopDepthCalc);
+  ~PhyRegAlloc();
+
+  // main method called for allocating registers
+  //
+  void allocateRegisters();           
+
+
+  // access to register classes by class ID
+  // 
+  const RegClass*  getRegClassByID(unsigned int id) const {
+                                                    return RegClassList[id];
+  }
+        RegClass*  getRegClassByID(unsigned int id)       {
+                                                    return RegClassList[id]; }
+  
+  
+private:
 
-  RegStackOffsets StackOffsets;
 
-  vector<const MachineInstr *> PhiInstList;   // a list of all phi instrs
 
-  //------- private methods ---------------------------------------------------
+  //------- ------------------ private methods---------------------------------
 
-  void addInterference(const Value *const Def, const LiveVarSet *const LVSet, 
-                      const bool isCallInst);
+  void addInterference(const Value *Def, const ValueSet *LVSet, 
+                      bool isCallInst);
 
   void addInterferencesForArgs();
   void createIGNodeListsAndIGs();
   void buildInterferenceGraphs();
-  //void insertCallerSavingCode(const MachineInstr *MInst, 
-  //                         const BasicBlock *BB );
 
   void setCallInterferences(const MachineInstr *MInst, 
-                           const LiveVarSet *const LVSetAft );
+                           const ValueSet *LVSetAft );
 
   void move2DelayedInstr(const MachineInstr *OrigMI, 
                         const MachineInstr *DelayedMI );
@@ -178,13 +126,12 @@ class PhyRegAlloc
   void markUnusableSugColors();
   void allocateStackSpace4SpilledLRs();
 
-  RegStackOffsets & getStackOffsets() {
-    return  StackOffsets;
-  }
-
+  void insertCode4SpilledLR     (const LiveRange *LR, 
+                                 MachineInstr *MInst,
+                                 const BasicBlock *BB,
+                                 const unsigned OpNum);
 
-  inline void constructLiveRanges() 
-    { LRI.constructLiveRanges(); }      
+  inline void constructLiveRanges() { LRI.constructLiveRanges(); }      
 
   void colorIncomingArgs();
   void colorCallRetArgs();
@@ -194,42 +141,22 @@ class PhyRegAlloc
   void printMachineCode();
 
   friend class UltraSparcRegInfo;
-  void setRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
-  int getRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
-
-  void PhyRegAlloc::insertPhiEleminateInstrns();
-
- public:
-
-  PhyRegAlloc(const Method *const M, const TargetMachine& TM, 
-             MethodLiveVarInfo *const Lvi);
-
-  void allocateRegisters();             // main method called for allocatin
 
-};
-
-
-
-/*
-
-
-What to do:
-
-  * Insert IntCCReg checking code to insertCallerSaving
-  * add methods like cpCCReg2Mem & cpMem2CCReg (these will accept an array
-  and push back or push_front the instr according to PUSH_BACK, PUSH_FRONT
-  flags
 
-*/
+  int getUsableUniRegAtMI(int RegType, 
+                         const ValueSet *LVSetBef,
+                         MachineInstr *MInst,
+                          std::vector<MachineInstr*>& MIBef,
+                          std::vector<MachineInstr*>& MIAft);
   
-  
-
-
-
-
-
+  int getUnusedUniRegAtMI(RegClass *RC,  const MachineInstr *MInst, 
+                          const ValueSet *LVSetBef);
 
+  void setRelRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
+  int getUniRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
 
+  void addInterf4PseudoInstr(const MachineInstr *MInst);
+};
 
 
 #endif