mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	* Reduce number of #includes, sometimes drastically (LiveRangeInfo.h lost _7_) * Move instrIsFeasible() from InstrScheduling.h to SchedPriorities.h * Delete blank lines at end of files git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1672 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			127 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Title:   RegClass.h   -*- C++ -*-
 | |
|    Author:  Ruchira Sasanka
 | |
|    Date:    Aug 20, 01
 | |
|    Purpose: Contains machine independent methods for register coloring.
 | |
| 
 | |
| */
 | |
| 
 | |
| #ifndef REG_CLASS_H
 | |
| #define REG_CLASS_H
 | |
| 
 | |
| #include "llvm/CodeGen/IGNode.h"
 | |
| #include "llvm/CodeGen/InterferenceGraph.h"
 | |
| #include "llvm/Target/MachineRegInfo.h"
 | |
| #include <stack>
 | |
| #include <iostream>
 | |
| class MachineRegClassInfo;
 | |
| 
 | |
| typedef std::vector<unsigned> ReservedColorListType;
 | |
| 
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // Class RegClass
 | |
| //
 | |
| //   Implements a machine independant register class. 
 | |
| //
 | |
| //   This is the class that contains all data structures and common algos
 | |
| //   for coloring a particular register class (e.g., int class, fp class).  
 | |
| //   This class is hardware independent. This class accepts a hardware 
 | |
| //   dependent description of machine registers (MachineRegInfo class) to 
 | |
| //   get hardware specific info and to color an individual IG node.
 | |
| //
 | |
| //   This class contains the InterferenceGraph (IG).
 | |
| //   Also it contains an IGNode stack that can be used for coloring. 
 | |
| //   The class provides some easy access methods to the IG methods, since these
 | |
| //   methods are called thru a register class.
 | |
| //
 | |
| //-----------------------------------------------------------------------------
 | |
| class RegClass {
 | |
|   const Method *const Meth;             // Method we are working on
 | |
|   const MachineRegClassInfo *const MRC; // corresponding MRC
 | |
|   const unsigned RegClassID;            // my int ID
 | |
| 
 | |
|   InterferenceGraph IG;                 // Interference graph - constructed by
 | |
|                                         // buildInterferenceGraph
 | |
|   std::stack<IGNode *> IGNodeStack;     // the stack used for coloring
 | |
| 
 | |
|   const ReservedColorListType *const ReservedColorList;
 | |
|   //
 | |
|   // for passing registers that are pre-allocated and cannot be used by the
 | |
|   // register allocator for this method.
 | |
|   
 | |
|   bool *IsColorUsedArr;
 | |
|   //
 | |
|   // An array used for coloring each node. This array must be of size 
 | |
|   // MRC->getNumOfAllRegs(). Allocated once in the constructor
 | |
|   // for efficiency.
 | |
| 
 | |
| 
 | |
|   //--------------------------- private methods ------------------------------
 | |
| 
 | |
|   void pushAllIGNodes();
 | |
| 
 | |
|   bool  pushUnconstrainedIGNodes();
 | |
| 
 | |
|   IGNode * getIGNodeWithMinSpillCost();
 | |
| 
 | |
|   void colorIGNode(IGNode *const Node);
 | |
| 
 | |
| 
 | |
|  public:
 | |
| 
 | |
|   RegClass(const Method *const M, 
 | |
| 	   const MachineRegClassInfo *const MRC, 
 | |
| 	   const ReservedColorListType *const RCL = NULL);
 | |
| 
 | |
|   ~RegClass() { delete[] IsColorUsedArr; };
 | |
| 
 | |
|   inline void createInterferenceGraph() 
 | |
|     { IG.createGraph(); }
 | |
| 
 | |
|   inline InterferenceGraph &getIG() { return IG; }
 | |
| 
 | |
|   inline const unsigned getID() const { return RegClassID; }
 | |
| 
 | |
|   // main method called for coloring regs
 | |
|   //
 | |
|   void colorAllRegs();                 
 | |
| 
 | |
|   inline unsigned getNumOfAvailRegs() const 
 | |
|     { return MRC->getNumOfAvailRegs(); }
 | |
| 
 | |
| 
 | |
|   // --- following methods are provided to access the IG contained within this
 | |
|   // ---- RegClass easilly.
 | |
| 
 | |
|   inline void addLRToIG(LiveRange *const LR) 
 | |
|     { IG.addLRToIG(LR); }
 | |
| 
 | |
|   inline void setInterference(const LiveRange *const LR1,
 | |
| 			      const LiveRange *const LR2)  
 | |
|     { IG.setInterference(LR1, LR2); }
 | |
| 
 | |
|   inline unsigned getInterference(const LiveRange *const LR1,
 | |
| 			      const LiveRange *const LR2) const 
 | |
|     { return IG.getInterference(LR1, LR2); }
 | |
| 
 | |
|   inline void mergeIGNodesOfLRs(const LiveRange *const LR1,
 | |
| 				LiveRange *const LR2) 
 | |
|     { IG.mergeIGNodesOfLRs(LR1, LR2); }
 | |
| 
 | |
| 
 | |
|   inline bool * getIsColorUsedArr() { return IsColorUsedArr; }
 | |
| 
 | |
| 
 | |
|   inline void printIGNodeList() const {
 | |
|     std::cerr << "IG Nodes for Register Class " << RegClassID << ":" << "\n";
 | |
|     IG.printIGNodeList(); 
 | |
|   }
 | |
| 
 | |
|   inline void printIG() {  
 | |
|     std::cerr << "IG for Register Class " << RegClassID << ":" << "\n";
 | |
|     IG.printIG(); 
 | |
|   }
 | |
| };
 | |
| 
 | |
| #endif
 |