mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1503 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Title:   InterferenceGraph.h   -*- C++ -*-
 | |
|    Author:  Ruchira Sasanka
 | |
|    Date:    July 20, 01
 | |
|    Purpose: Interference Graph used for register coloring.
 | |
| 
 | |
|    Notes: 
 | |
|    Adj Info is  stored in the lower trangular matrix (i.e., row > col ) 
 | |
| 
 | |
|    This class must be used in the following way:
 | |
| 
 | |
|    * Construct class
 | |
|    * call addLRToIG as many times to add ALL LRs to this IG
 | |
|    * call createGraph to create the actual matrix
 | |
|    * Then setInterference, getInterference, mergeIGNodesOfLRs can be 
 | |
|      called as desired to modify the graph.
 | |
|    * Once the modifications to the graph are over, call 
 | |
|      setCurDegreeOfIGNodes() before pushing IGNodes on to stack for coloring.
 | |
| */
 | |
| 
 | |
| 
 | |
| #ifndef  INTERFERENCE_GRAPH_H
 | |
| #define  INTERFERENCE_GRAPH_H
 | |
| 
 | |
| 
 | |
| #include "llvm/CodeGen/IGNode.h"
 | |
| 
 | |
| typedef std::vector <IGNode *> IGNodeListType;
 | |
| 
 | |
| 
 | |
| class InterferenceGraph
 | |
| {
 | |
|   char **IG;                            // a poiner to the interference graph
 | |
|   unsigned int Size;                    // size of a side of the IG
 | |
|   RegClass *const RegCl;                // RegCl contains this IG
 | |
|   IGNodeListType IGNodeList;            // a list of all IGNodes in a reg class
 | |
|                             
 | |
|   // for asserting this IG node is infact in the IGNodeList of this class
 | |
|   inline void assertIGNode(const IGNode *const Node) const {     
 | |
|     assert( IGNodeList[ Node->getIndex() ] == Node );
 | |
|   }
 | |
| 
 | |
| 
 | |
| 
 | |
|  public:
 | |
| 
 | |
|   // the matrix is not yet created by the constructor. Call createGraph() 
 | |
|   // to create it after adding all IGNodes to the IGNodeList
 | |
| 
 | |
|   InterferenceGraph(RegClass *const RC);
 | |
|   ~InterferenceGraph();
 | |
| 
 | |
|   void createGraph();
 | |
| 
 | |
|   void addLRToIG(LiveRange *const LR);
 | |
| 
 | |
|   void setInterference(const LiveRange *const LR1,
 | |
| 			      const LiveRange *const LR2 );
 | |
| 
 | |
|   unsigned getInterference(const LiveRange *const LR1,
 | |
| 				  const LiveRange *const LR2 ) const ;
 | |
| 
 | |
|   void mergeIGNodesOfLRs(const LiveRange *const LR1, LiveRange *const LR2);
 | |
| 
 | |
|   inline IGNodeListType &getIGNodeList() { return IGNodeList; } 
 | |
| 
 | |
|   void setCurDegreeOfIGNodes();
 | |
| 
 | |
|   void printIG() const;
 | |
|   void printIGNodeList() const;
 | |
| };
 | |
| 
 | |
| #endif
 |