diff options
Diffstat (limited to 'include/llvm/CodeGen/FunctionLiveVarInfo.h')
-rw-r--r-- | include/llvm/CodeGen/FunctionLiveVarInfo.h | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/include/llvm/CodeGen/FunctionLiveVarInfo.h b/include/llvm/CodeGen/FunctionLiveVarInfo.h new file mode 100644 index 0000000000..206fef8e3e --- /dev/null +++ b/include/llvm/CodeGen/FunctionLiveVarInfo.h @@ -0,0 +1,129 @@ +/* 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 should 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 constructed in several ways: + + 1. 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 efficient method if you need LV info for several (all) + 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 reverse it 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. + + + 2. Use the function getLiveVarSetBeforeInst(Instruction *) to get the LV Info + just before an instruction. + + 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. + + + **BUGS: Cannot be called on a method prototype because the BB front() + iterator causes a seg fault in CFG.h (Chris will fix this) + So, currently, DO NOT call this for method prototypes. + +*/ + + +#ifndef METH_LIVE_VAR_INFO_H +#define METH_LIVE_VAR_INFO_H + + // for printing out debug messages +#define DEBUG_LV (1) + +#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: + const Method *Meth; // Live var anal is done on this method + // set by constructor + + BBToBBLiveVarMapType BB2BBLVMap; // A map betwn the BasicBlock and BBLiveVar + + InstToLiveVarSetMapType Inst2LVSetMap; // Instruction to LiveVarSet Map + //- for providing LV info for each inst + + void constructBBs(); // constructs BBLiveVars and init Def and In sets + bool doSingleBackwardPass(); // do one backward pass over the CFG + + + + public: + MethodLiveVarInfo(Method *const Meth); // constructor + + ~MethodLiveVarInfo(); // destructor + + void analyze(); // performs a liver var analysis of a single method + + // gets OutSet of a BB + inline const LiveVarSet *getOutSetOfBB( const BasicBlock *const BB) const { + return ( (* (BB2BBLVMap.find(BB)) ).second )->getOutSet(); + } + + // gets InSet of a BB + inline const LiveVarSet *getInSetOfBB( const BasicBlock *const BB) const { + return ( (* (BB2BBLVMap.find(BB)) ).second )->getInSet(); + } + // gets the Live var set before an instruction + const LiveVarSet * + MethodLiveVarInfo::getLiveVarSetBeforeInst(const Instruction *const Inst); + + +}; + + + + + +#endif + + + + |