Rewrote uses of deprecated `MachineFunction::get(BasicBlock *BB)'.
[oota-llvm.git] / lib / Target / SparcV9 / RegAlloc / LiveRangeInfo.h
index 934737327be0bd66e91fe2a06c35b25d96824696..48abdc0da5ab59909d5f9aecdf1343d6c8ba6623 100644 (file)
-/* Title:   LiveRangeInfo.h
-   Author:  Ruchira Sasanka
-   Date:    Jun 30, 01
-   Purpose: 
-
-   This file constructs and keeps the LiveRang map which contains all the live
-   ranges used in a method.
-
-   Assumptions: 
-
-   All variables (llvm Values) are defined before they are used. However, a 
-   constant may not be defined in the machine instruction stream if it can be
-   used as an immediate value within a machine instruction. However, register
-   allocation does not have to worry about immediate constants since they
-   do not require registers.
-
-   Since an llvm Value has a list of uses associated, it is sufficient to
-   record only the defs in a Live Range.
-
-*/
-
+//===-- LiveRangeInfo.h - Track all LiveRanges for a Function ----*- C++ -*-==//
+//
+// This file contains the class LiveRangeInfo which constructs and keeps 
+// the LiveRangMap which contains all the live ranges used in a method.
+//
+// Assumptions: 
+//
+// All variables (llvm Values) are defined before they are used. However, a 
+// constant may not be defined in the machine instruction stream if it can be
+// used as an immediate value within a machine instruction. However, register
+// allocation does not have to worry about immediate constants since they
+// do not require registers.
+//
+// Since an llvm Value has a list of uses associated, it is sufficient to
+// record only the defs in a Live Range.
+//
+//===----------------------------------------------------------------------===//
 
 #ifndef LIVE_RANGE_INFO_H
 #define LIVE_RANGE_INFO_H
 
+#include "Support/HashExtras.h"
+#include "llvm/Analysis/LiveVar/ValueSet.h"
+
+class LiveRange;
+class MachineInstr;
+class RegClass;
+class MachineRegInfo;
+class TargetMachine;
+class Value;
+class Function;
+class Instruction;
+
+typedef hash_map<const Value*, LiveRange*> LiveRangeMapType;
+typedef std::vector<MachineInstr*> CallRetInstrListType;
+
+//----------------------------------------------------------------------------
+// Class LiveRangeInfo
+//
+// Constructs and keeps the LiveRangMap which contains all the live 
+// ranges used in a method. Also contain methods to coalesce live ranges.
+//----------------------------------------------------------------------------
+
+class LiveRangeInfo {
+  const Function *const Meth;       // Func for which live range info is held
+  LiveRangeMapType  LiveRangeMap;   // A map from Value * to LiveRange * to 
+                                    // record all live ranges in a method
+                                    // created by constructLiveRanges
+  
+  const TargetMachine& TM;          // target machine description
 
-#include "llvm/Type.h"
-#include "llvm/Method.h"
-#include "llvm/CodeGen/MachineInstr.h"
-
-#include "llvm/Analysis/LiveVar/LiveVarSet.h"
-
-#include "llvm/CodeGen/IGNode.h"
-#include "llvm/CodeGen/LiveRange.h"
-#include "llvm/CodeGen/RegClass.h"
+  std::vector<RegClass *> & RegClassList;// vector containing register classess
 
-/*
- #ifndef size_type 
- #define size_type (unsigned int)
- #endif
-*/
+  const MachineRegInfo& MRI;        // machine reg info
 
+  CallRetInstrListType  CallRetInstrList;  // a list of all call/ret instrs
 
-typedef hash_map <const Value *,  LiveRange *, hashFuncValue> LiveRangeMapType;
-typedef vector <const MachineInstr *> CallRetInstrListType;
 
-class LiveRangeInfo 
-{
+  //------------ Private methods (see LiveRangeInfo.cpp for description)-------
 
-private:
+  LiveRange* createNewLiveRange         (const Value* Def,
+                                         bool isCC = false);
 
-  const Method *const Meth;         // Method for which live range info is held
+  LiveRange* createOrAddToLiveRange     (const Value* Def,
+                                         bool isCC = false);
 
-  LiveRangeMapType  LiveRangeMap;   // A map from Value * to LiveRange * 
-                                    // created by constructLiveRanges
+  void unionAndUpdateLRs                (LiveRange *L1,
+                                         LiveRange *L2);
 
-  const TargetMachine& TM;          // target machine description
-  vector<RegClass *> & RegClassList;// a vector containing register classess
-  const MachineRegInfo& MRI;        // machine reg info
-
-  CallRetInstrListType  CallRetInstrList;  // a list of all call/ret instrs
-
-  void unionAndUpdateLRs(LiveRange *L1, LiveRange *L2);
-
-  void addInterference(const Instruction *const Inst, 
-                      const LiveVarSet *const LVSet);
+  void addInterference                  (const Instruction *Inst,
+                                         const ValueSet *LVSet);
   
-  void suggestRegs4CallRets();
+  void suggestRegs4CallRets             ();
+
+  const Function *getMethod             () const { return Meth; }
 
 public:
   
-  LiveRangeInfo(const Method *const M
+  LiveRangeInfo(const Function *F
                const TargetMachine& tm,
-               vector<RegClass *> & RCList);
+               std::vector<RegClass *> & RCList);
 
-  void constructLiveRanges();
 
-  const Method* getMethod() { return Meth; }
+  // Destructor to destroy all LiveRanges in the LiveRange Map
+  ~LiveRangeInfo();
 
-  inline void addLRToMap(const Value *Val, LiveRange *LR) {
-    assert( Val && LR && "Val/LR is NULL!\n");
-    assert( (! LiveRangeMap[ Val ]) && "LR already set in map");
-    LiveRangeMap[ Val ] = LR;
-  }
+  // Main entry point for live range construction
+  //
+  void constructLiveRanges();
   
-
+  // return the common live range map for this method
+  //
   inline const LiveRangeMapType *const getLiveRangeMap() const 
     { return &LiveRangeMap; }
 
+  // Method sed to get the corresponding live range of a Value
+  //
   inline LiveRange *getLiveRangeForValue( const Value *const Val) 
-    { return LiveRangeMap[ Val ]; }
+    { return LiveRangeMap[Val]; }
 
+  // Method used to get the Call and Return instruction list
+  //
   inline  CallRetInstrListType &getCallRetInstrList() {
     return CallRetInstrList;
   }
 
-
-
+  // Method for coalescing live ranges. Called only after interference info
+  // is calculated.
+  //
   void coalesceLRs();  
 
+  // debugging method to print the live ranges
+  //
   void printLiveRanges();
-
 };
 
-
-
-
 #endif