mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-20 11:29:24 +00:00
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291 91177308-0d34-0410-b5e6-96231b3b80d8
130 lines
3.9 KiB
C++
130 lines
3.9 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 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
|
|
|
|
|
|
|
|
|