forked from OSchip/llvm-project
Turn live variable analysis into a real MethodPass.
llvm-svn: 1699
This commit is contained in:
parent
ee445a60a1
commit
494266eaf0
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue