Turn live variable analysis into a real MethodPass.

llvm-svn: 1699
This commit is contained in:
Chris Lattner 2002-02-04 20:00:08 +00:00
parent ee445a60a1
commit 494266eaf0
3 changed files with 66 additions and 65 deletions

View File

@ -67,12 +67,13 @@
static const int DEBUG_LV = 0; static const int DEBUG_LV = 0;
#include "BBLiveVar.h" #include "llvm/Analysis/LiveVar/BBLiveVar.h"
#include "llvm/Pass.h"
class MethodLiveVarInfo { class MethodLiveVarInfo : public MethodPass {
// Live var anal is done on this method - set by constructor // Live var anal is done on this method - set by constructor
const Method *const Meth; const Method *Meth;
// A map betwn the BasicBlock and BBLiveVar // A map betwn the BasicBlock and BBLiveVar
BBToBBLiveVarMapType BB2BBLVMap; BBToBBLiveVarMapType BB2BBLVMap;
@ -83,10 +84,6 @@ class MethodLiveVarInfo {
// Machine Instr to LiveVarSet Map for providing LVset AFTER each inst // Machine Instr to LiveVarSet Map for providing LVset AFTER each inst
MInstToLiveVarSetMapType MInst2LVSetAI; 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 ----------------------------------------- // --------- private methods -----------------------------------------
@ -100,22 +97,36 @@ class MethodLiveVarInfo {
void calcLiveVarSetsForBB(const BasicBlock *BB); void calcLiveVarSetsForBB(const BasicBlock *BB);
public: public:
MethodLiveVarInfo(const Method *Meth); static AnalysisID ID; // We are an analysis, we must have an ID
~MethodLiveVarInfo();
// performs a liver var analysis of a single method MethodLiveVarInfo(AnalysisID id = ID) : Meth(0) { assert(id == ID); }
void analyze(); ~MethodLiveVarInfo() { releaseMemory(); }
// --------- Implement the MethodPass interface ----------------------
// runOnMethod - Perform analysis, update internal data structures.
virtual bool runOnMethod(Method *M);
// releaseMemory - After LiveVariable analysis has been used, forget!
virtual void releaseMemory();
// getAnalysisUsageInfo - Provide self!
virtual void getAnalysisUsageInfo(AnalysisSet &Required,
AnalysisSet &Destroyed,
AnalysisSet &Provided) {
Provided.push_back(ID);
}
// --------- Functions to access analysis results -------------------
// gets OutSet of a BB // gets OutSet of a BB
inline const LiveVarSet *getOutSetOfBB( const BasicBlock *BB) const { inline const LiveVarSet *getOutSetOfBB( const BasicBlock *BB) const {
assert( HasAnalyzed && "call analyze() before calling this" );
return BB2BBLVMap.find(BB)->second->getOutSet(); return BB2BBLVMap.find(BB)->second->getOutSet();
} }
// gets InSet of a BB // gets InSet of a BB
inline const LiveVarSet *getInSetOfBB( const BasicBlock *BB) const { inline const LiveVarSet *getInSetOfBB( const BasicBlock *BB) const {
assert(HasAnalyzed && "call analyze() before calling this" );
return BB2BBLVMap.find(BB)->second->getInSet(); return BB2BBLVMap.find(BB)->second->getInSet();
} }
@ -126,7 +137,6 @@ class MethodLiveVarInfo {
// gets the Live var set AFTER an instruction // gets the Live var set AFTER an instruction
const LiveVarSet * getLiveVarSetAfterMInst(const MachineInstr *MInst, const LiveVarSet * getLiveVarSetAfterMInst(const MachineInstr *MInst,
const BasicBlock *CurBB); const BasicBlock *CurBB);
}; };
#endif #endif

View File

@ -67,12 +67,13 @@
static const int DEBUG_LV = 0; static const int DEBUG_LV = 0;
#include "BBLiveVar.h" #include "llvm/Analysis/LiveVar/BBLiveVar.h"
#include "llvm/Pass.h"
class MethodLiveVarInfo { class MethodLiveVarInfo : public MethodPass {
// Live var anal is done on this method - set by constructor // Live var anal is done on this method - set by constructor
const Method *const Meth; const Method *Meth;
// A map betwn the BasicBlock and BBLiveVar // A map betwn the BasicBlock and BBLiveVar
BBToBBLiveVarMapType BB2BBLVMap; BBToBBLiveVarMapType BB2BBLVMap;
@ -83,10 +84,6 @@ class MethodLiveVarInfo {
// Machine Instr to LiveVarSet Map for providing LVset AFTER each inst // Machine Instr to LiveVarSet Map for providing LVset AFTER each inst
MInstToLiveVarSetMapType MInst2LVSetAI; 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 ----------------------------------------- // --------- private methods -----------------------------------------
@ -100,22 +97,36 @@ class MethodLiveVarInfo {
void calcLiveVarSetsForBB(const BasicBlock *BB); void calcLiveVarSetsForBB(const BasicBlock *BB);
public: public:
MethodLiveVarInfo(const Method *Meth); static AnalysisID ID; // We are an analysis, we must have an ID
~MethodLiveVarInfo();
// performs a liver var analysis of a single method MethodLiveVarInfo(AnalysisID id = ID) : Meth(0) { assert(id == ID); }
void analyze(); ~MethodLiveVarInfo() { releaseMemory(); }
// --------- Implement the MethodPass interface ----------------------
// runOnMethod - Perform analysis, update internal data structures.
virtual bool runOnMethod(Method *M);
// releaseMemory - After LiveVariable analysis has been used, forget!
virtual void releaseMemory();
// getAnalysisUsageInfo - Provide self!
virtual void getAnalysisUsageInfo(AnalysisSet &Required,
AnalysisSet &Destroyed,
AnalysisSet &Provided) {
Provided.push_back(ID);
}
// --------- Functions to access analysis results -------------------
// gets OutSet of a BB // gets OutSet of a BB
inline const LiveVarSet *getOutSetOfBB( const BasicBlock *BB) const { inline const LiveVarSet *getOutSetOfBB( const BasicBlock *BB) const {
assert( HasAnalyzed && "call analyze() before calling this" );
return BB2BBLVMap.find(BB)->second->getOutSet(); return BB2BBLVMap.find(BB)->second->getOutSet();
} }
// gets InSet of a BB // gets InSet of a BB
inline const LiveVarSet *getInSetOfBB( const BasicBlock *BB) const { inline const LiveVarSet *getInSetOfBB( const BasicBlock *BB) const {
assert(HasAnalyzed && "call analyze() before calling this" );
return BB2BBLVMap.find(BB)->second->getInSet(); return BB2BBLVMap.find(BB)->second->getInSet();
} }
@ -126,7 +137,6 @@ class MethodLiveVarInfo {
// gets the Live var set AFTER an instruction // gets the Live var set AFTER an instruction
const LiveVarSet * getLiveVarSetAfterMInst(const MachineInstr *MInst, const LiveVarSet * getLiveVarSetAfterMInst(const MachineInstr *MInst,
const BasicBlock *CurBB); const BasicBlock *CurBB);
}; };
#endif #endif

View File

@ -17,18 +17,9 @@
using std::cout; using std::cout;
using std::endl; using std::endl;
//************************** Constructor/Destructor *************************** AnalysisID MethodLiveVarInfo::ID(AnalysisID::create<MethodLiveVarInfo>());
void MethodLiveVarInfo::releaseMemory() {
MethodLiveVarInfo::MethodLiveVarInfo(const Method *const M) : Meth(M) {
assert(!M->isExternal() && "Cannot be a prototype declaration");
HasAnalyzed = false; // still we haven't called analyze()
}
MethodLiveVarInfo:: ~MethodLiveVarInfo()
{
// First delete all BBLiveVar objects created in constructBBs(). A new object // First delete all BBLiveVar objects created in constructBBs(). A new object
// of type BBLiveVa is created for every BasicBlock in the method // of type BBLiveVa is created for every BasicBlock in the method
@ -36,11 +27,10 @@ MethodLiveVarInfo:: ~MethodLiveVarInfo()
// //
BBToBBLiveVarMapType::iterator HMI = BB2BBLVMap.begin(); BBToBBLiveVarMapType::iterator HMI = BB2BBLVMap.begin();
for( ; HMI != BB2BBLVMap.end() ; HMI ++ ) { for( ; HMI != BB2BBLVMap.end(); ++HMI)
if( (*HMI).first ) // delete all BBLiveVar in BB2BBLVMap delete HMI->second; // delete all BBLiveVar in BB2BBLVMap
delete (*HMI).second;
}
BB2BBLVMap.clear();
// Then delete all objects of type LiveVarSet created in calcLiveVarSetsForBB // Then delete all objects of type LiveVarSet created in calcLiveVarSetsForBB
// and entered into MInst2LVSetBI and MInst2LVSetAI (these are caches // and entered into MInst2LVSetBI and MInst2LVSetAI (these are caches
@ -50,18 +40,16 @@ MethodLiveVarInfo:: ~MethodLiveVarInfo()
// hash map iterator for MInst2LVSetBI // hash map iterator for MInst2LVSetBI
// //
MInstToLiveVarSetMapType::iterator MI = MInst2LVSetBI.begin(); MInstToLiveVarSetMapType::iterator MI = MInst2LVSetBI.begin();
for( ; MI != MInst2LVSetBI.end() ; MI ++ ) { for( ; MI != MInst2LVSetBI.end(); ++MI)
if( (*MI).first ) // delete all LiveVarSets in MInst2LVSetBI delete MI->second; // delete all LiveVarSets in MInst2LVSetBI
delete (*MI).second;
} MInst2LVSetBI.clear();
MInst2LVSetAI.clear();
} }
// ************************* support functions ********************************
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// constructs BBLiveVars and init Def and In sets // constructs BBLiveVars and init Def and In sets
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -154,17 +142,11 @@ bool MethodLiveVarInfo::doSingleBackwardPass()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// performs live var anal for a method // performs live var anal for a method
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void MethodLiveVarInfo::analyze()
{
// Don't analyze the same method twice!
// Later, we need to add change notification here.
bool MethodLiveVarInfo::runOnMethod(Method *M) {
if (HasAnalyzed) Meth = M;
return;
if( DEBUG_LV) cout << "Analysing live variables ..." << endl; if( DEBUG_LV) cout << "Analysing live variables ...\n";
// create and initialize all the BBLiveVars of the CFG // create and initialize all the BBLiveVars of the CFG
constructBBs(); constructBBs();
@ -175,9 +157,8 @@ void MethodLiveVarInfo::analyze()
} while (NeedAnotherIteration ); // repeat until we need more iterations } while (NeedAnotherIteration ); // repeat until we need more iterations
HasAnalyzed = true; // finished analysing if( DEBUG_LV) cout << "Live Variable Analysis complete!\n";
return false;
if( DEBUG_LV) cout << "Live Variable Analysis complete!" << endl;
} }