mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@388 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			157 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Title:   MethodLiveVarInfo.h
 | |
|    Author:  Ruchira Sasanka
 | |
|    Date:    Jun 30, 01
 | |
|    Purpose: 
 | |
| 
 | |
|    This is the interface for live variable info of a method that is required 
 | |
|    by any other part of the compiler
 | |
| 
 | |
|    It must be called like:
 | |
| 
 | |
|        MethodLiveVarInfo MLVI( Mehtod *);  // initializes data structures
 | |
|        MLVI.analyze();                     // do the actural live variable anal
 | |
| 
 | |
|  After the analysis, getInSetOfBB or getOutSetofBB can be called to get 
 | |
|  live var info of a BB.
 | |
| 
 | |
|  The live var set before an instruction can be obtained in 2 ways:
 | |
| 
 | |
|  1. Use the method getLiveVarSetAfterInst(Instruction *) to get the LV Info 
 | |
|     just after an instruction. (also exists getLiveVarSetBeforeInst(..))
 | |
| 
 | |
|     This function caluclates the LV info for a BB only once and caches that 
 | |
|     info. If the cache does not contain the LV info of the instruction, it 
 | |
|     calculates the LV info for the whole BB and caches them.
 | |
| 
 | |
|     Getting liveVar info this way uses more memory since, LV info should be 
 | |
|     cached. However, if you need LV info of nearly all the instructions of a
 | |
|     BB, this is the best and simplest interfrace.
 | |
| 
 | |
| 
 | |
|  2. Use the OutSet and applyTranferFuncForInst(const Instruction *const Inst) 
 | |
|     declared in LiveVarSet and  traverse the instructions of a basic block in 
 | |
|     reverse (using const_reverse_iterator in the BB class). 
 | |
| 
 | |
|     This is the most memory efficient method if you need LV info for 
 | |
|     only several instructions in a BasicBlock. An example is given below:
 | |
| 
 | |
| 
 | |
|     LiveVarSet LVSet;  // this will be the set used to traverse through each BB
 | |
| 
 | |
|     // Initialize LVSet so that it is the same as OutSet of the BB
 | |
|     LVSet.setUnion( LVI->getOutSetOfBB( *BBI ) );  
 | |
|  
 | |
|     BasicBlock::InstListType::const_reverse_iterator 
 | |
|       InstIterator = InstListInBB.rbegin(); // get the rev iter for inst in BB
 | |
| 
 | |
|       // iterate over all the instructions in BB in reverse
 | |
|     for( ; InstIterator != InstListInBB.rend(); InstIterator++) {  
 | |
| 
 | |
|       //...... all  code here which uses LVSet ........
 | |
| 
 | |
|       LVSet.applyTranferFuncForInst(*InstIterator);
 | |
| 
 | |
|       // Now LVSet contains live vars ABOVE the current instrution
 | |
|     }
 | |
| 
 | |
|     See buildInterferenceGraph() for the above example.
 | |
| 
 | |
| 
 | |
| */
 | |
| 
 | |
| 
 | |
| #ifndef METH_LIVE_VAR_INFO_H
 | |
| #define METH_LIVE_VAR_INFO_H
 | |
| 
 | |
| // set DEBUG_LV for printing out debug messages
 | |
| // if DEBUG_LV is 1 normal output messages
 | |
| // if DEBUG_LV is 2 extensive debug info for each instr
 | |
| 
 | |
| static const int DEBUG_LV = 0;
 | |
| 
 | |
| #include "LiveVarSet.h"
 | |
| #include "llvm/BasicBlock.h"
 | |
| #include "llvm/Instruction.h"
 | |
| #include "llvm/Method.h"
 | |
| #include "llvm/CFG.h"
 | |
| 
 | |
| #include "LiveVarMap.h"
 | |
| #include "BBLiveVar.h"
 | |
| 
 | |
| 
 | |
| class MethodLiveVarInfo
 | |
| {
 | |
|  private:
 | |
| 
 | |
|   // Live var anal is done on this method - set by constructor
 | |
|   const Method *const Meth;   
 | |
| 
 | |
|   // A map betwn the BasicBlock and BBLiveVar
 | |
|   BBToBBLiveVarMapType  BB2BBLVMap;  
 | |
| 
 | |
|   // Machine Instr to LiveVarSet Map for providing LVset BEFORE each inst
 | |
|   MInstToLiveVarSetMapType MInst2LVSetBI; 
 | |
| 
 | |
|   // Machine Instr to LiveVarSet Map for providing LVset AFTER each inst
 | |
|   MInstToLiveVarSetMapType MInst2LVSetAI; 
 | |
| 
 | |
|   // True if the analyze() method has been called. This is checked when
 | |
|   // getInSet/OutSet is called to prevent calling those methods before analyze
 | |
|   bool HasAnalyzed;
 | |
| 
 | |
| 
 | |
|   // --------- private methods -----------------------------------------
 | |
| 
 | |
|   // constructs BBLiveVars and init Def and In sets
 | |
|   void constructBBs();      
 | |
|     
 | |
|   // do one backward pass over the CFG
 | |
|   bool  doSingleBackwardPass(); 
 | |
| 
 | |
|   // calculates live var sets for instructions in a BB
 | |
|   void calcLiveVarSetsForBB(const BasicBlock *const BB);
 | |
|   
 | |
| 
 | |
|  public:
 | |
|   MethodLiveVarInfo(const Method *const Meth);    // constructor 
 | |
| 
 | |
|   ~MethodLiveVarInfo();                           // destructor
 | |
| 
 | |
|   // performs a liver var analysis of a single method
 | |
|   void analyze();            
 | |
| 
 | |
|   // gets OutSet of a BB
 | |
|   inline const LiveVarSet *getOutSetOfBB( const BasicBlock *const BB) const { 
 | |
|     assert( HasAnalyzed && "call analyze() before calling this" );
 | |
|     return (   (* (BB2BBLVMap.find(BB)) ).second  )->getOutSet();
 | |
|   }
 | |
| 
 | |
|   // gets InSet of a BB
 | |
|   inline const LiveVarSet *getInSetOfBB( const BasicBlock *const BB)  const { 
 | |
|     assert( HasAnalyzed && "call analyze() before calling this" );
 | |
|     return (   (* (BB2BBLVMap.find(BB)) ).second  )->getInSet();
 | |
|   }
 | |
| 
 | |
|   // gets the Live var set BEFORE an instruction
 | |
|   const LiveVarSet * getLiveVarSetBeforeMInst(const MachineInstr *const Inst,
 | |
| 					      const BasicBlock *const CurBB);
 | |
| 
 | |
|   // gets the Live var set AFTER an instruction
 | |
|   const LiveVarSet * getLiveVarSetAfterMInst(const MachineInstr *const MInst,
 | |
| 					     const BasicBlock *const CurBB);
 | |
| 
 | |
| 
 | |
| 
 | |
|  
 | |
| };
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| #endif
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |