* Order #includes as per style guide
[oota-llvm.git] / lib / CodeGen / RegAlloc / LiveRangeInfo.h
index d98ad9ab7a5859cc7b194e016cfee20a21dc7fe0..5c5244bd62cfdd4c14da37a7589b3b8f5b8c9552 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.
-
-*/
-
-
-#ifndef LIVE_RANGE_INFO_H
-#define LIVE_RANGE_INFO_H
-
-
-#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"
-
-/*
- #ifndef size_type 
- #define size_type (unsigned int)
- #endif
-*/
-
+//===-- LiveRangeInfo.h - Track all LiveRanges for a Function ----*- C++ -*-==//
+// 
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// 
+//===----------------------------------------------------------------------===//
+//
+// This file contains the class LiveRangeInfo which constructs and keeps 
+// the LiveRangeMap 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 LIVERANGEINFO_H
+#define LIVERANGEINFO_H
+
+#include "llvm/CodeGen/ValueSet.h"
+#include "Support/hash_map"
+
+class LiveRange;
+class MachineInstr;
+class RegClass;
+class TargetRegInfo;
+class TargetMachine;
+class Value;
+class Function;
+class Instruction;
+
+typedef hash_map<const Value*, LiveRange*> LiveRangeMapType;
+
+//----------------------------------------------------------------------------
+// Class LiveRangeInfo
+//
+// Constructs and keeps the LiveRangeMap 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
 
-typedef hash_map <const Value *,  LiveRange *, hashFuncValue> LiveRangeMapType;
-typedef vector <const MachineInstr *> CallRetInstrListType;
+  std::vector<RegClass *> & RegClassList;// vector containing register classess
 
-class LiveRangeInfo 
-{
+  const TargetRegInfo& MRI;        // machine reg info
 
-private:
+  std::vector<MachineInstr*> CallRetInstrList;  // a list of all call/ret instrs
 
-  const Method *const Meth;         // Method for which live range info is held
 
-  LiveRangeMapType  LiveRangeMap;   // A map from Value * to LiveRange * 
-                                    // created by constructLiveRanges
+  //------------ Private methods (see LiveRangeInfo.cpp for description)-------
 
-  const TargetMachine& TM;          // target machine description
-  vector<RegClass *> & RegClassList;// a vector containing register classess
-  const MachineRegInfo& MRI;        // machine reg info
+  LiveRange* createNewLiveRange         (const Value* Def,
+                                         bool isCC = false);
 
-  CallRetInstrListType  CallRetInstrList;  // a list of all call/ret instrs
+  LiveRange* createOrAddToLiveRange     (const Value* Def,
+                                         bool isCC = false);
 
-  void unionAndUpdateLRs(LiveRange *L1, LiveRange *L2);
+  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();
 
-  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;
-  }
-  
+  /// Destructor to destroy all LiveRanges in the LiveRange Map
+  ///
+  ~LiveRangeInfo();
 
-  inline const LiveRangeMapType *const getLiveRangeMap() const 
+  // Main entry point for live range construction
+  //
+  void constructLiveRanges();
+  
+  /// return the common live range map for this method
+  ///
+  inline const LiveRangeMapType *getLiveRangeMap() const 
     { return &LiveRangeMap; }
 
-  inline LiveRange *getLiveRangeForValue( const Value *const Val) 
-    { return LiveRangeMap[ Val ]; }
-
-  inline  CallRetInstrListType &getCallRetInstrList() {
-    return CallRetInstrList;
+  /// Method used to get the live range containing a Value.
+  /// This may return NULL if no live range exists for a Value (eg, some consts)
+  ///
+  inline LiveRange *getLiveRangeForValue(const Value *Val) {
+    return LiveRangeMap[Val];
+  }
+  inline const LiveRange *getLiveRangeForValue(const Value *Val) const {
+    LiveRangeMapType::const_iterator I = LiveRangeMap.find(Val);
+    return I->second;
   }
 
-
-
+  /// Method for coalescing live ranges. Called only after interference info
+  /// is calculated.
+  ///
   void coalesceLRs();  
 
+  /// debugging method to print the live ranges
+  ///
   void printLiveRanges();
-
 };
 
-
-
-
 #endif