mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
Turn live variable analysis into a real MethodPass.
llvm-svn: 1699
This commit is contained in:
parent
5726b834cd
commit
b4e0d0424c
@ -67,12 +67,13 @@
|
||||
|
||||
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
|
||||
const Method *const Meth;
|
||||
const Method *Meth;
|
||||
|
||||
// A map betwn the BasicBlock and BBLiveVar
|
||||
BBToBBLiveVarMapType BB2BBLVMap;
|
||||
@ -83,10 +84,6 @@ class MethodLiveVarInfo {
|
||||
// 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 -----------------------------------------
|
||||
|
||||
@ -100,22 +97,36 @@ class MethodLiveVarInfo {
|
||||
void calcLiveVarSetsForBB(const BasicBlock *BB);
|
||||
|
||||
|
||||
public:
|
||||
MethodLiveVarInfo(const Method *Meth);
|
||||
~MethodLiveVarInfo();
|
||||
public:
|
||||
static AnalysisID ID; // We are an analysis, we must have an ID
|
||||
|
||||
// performs a liver var analysis of a single method
|
||||
void analyze();
|
||||
MethodLiveVarInfo(AnalysisID id = ID) : Meth(0) { assert(id == ID); }
|
||||
~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
|
||||
inline const LiveVarSet *getOutSetOfBB( const BasicBlock *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 *BB) const {
|
||||
assert(HasAnalyzed && "call analyze() before calling this" );
|
||||
return BB2BBLVMap.find(BB)->second->getInSet();
|
||||
}
|
||||
|
||||
@ -126,7 +137,6 @@ class MethodLiveVarInfo {
|
||||
// gets the Live var set AFTER an instruction
|
||||
const LiveVarSet * getLiveVarSetAfterMInst(const MachineInstr *MInst,
|
||||
const BasicBlock *CurBB);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -67,12 +67,13 @@
|
||||
|
||||
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
|
||||
const Method *const Meth;
|
||||
const Method *Meth;
|
||||
|
||||
// A map betwn the BasicBlock and BBLiveVar
|
||||
BBToBBLiveVarMapType BB2BBLVMap;
|
||||
@ -83,10 +84,6 @@ class MethodLiveVarInfo {
|
||||
// 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 -----------------------------------------
|
||||
|
||||
@ -100,22 +97,36 @@ class MethodLiveVarInfo {
|
||||
void calcLiveVarSetsForBB(const BasicBlock *BB);
|
||||
|
||||
|
||||
public:
|
||||
MethodLiveVarInfo(const Method *Meth);
|
||||
~MethodLiveVarInfo();
|
||||
public:
|
||||
static AnalysisID ID; // We are an analysis, we must have an ID
|
||||
|
||||
// performs a liver var analysis of a single method
|
||||
void analyze();
|
||||
MethodLiveVarInfo(AnalysisID id = ID) : Meth(0) { assert(id == ID); }
|
||||
~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
|
||||
inline const LiveVarSet *getOutSetOfBB( const BasicBlock *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 *BB) const {
|
||||
assert(HasAnalyzed && "call analyze() before calling this" );
|
||||
return BB2BBLVMap.find(BB)->second->getInSet();
|
||||
}
|
||||
|
||||
@ -126,7 +137,6 @@ class MethodLiveVarInfo {
|
||||
// gets the Live var set AFTER an instruction
|
||||
const LiveVarSet * getLiveVarSetAfterMInst(const MachineInstr *MInst,
|
||||
const BasicBlock *CurBB);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -17,18 +17,9 @@
|
||||
using std::cout;
|
||||
using std::endl;
|
||||
|
||||
//************************** Constructor/Destructor ***************************
|
||||
AnalysisID MethodLiveVarInfo::ID(AnalysisID::create<MethodLiveVarInfo>());
|
||||
|
||||
|
||||
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()
|
||||
{
|
||||
void MethodLiveVarInfo::releaseMemory() {
|
||||
// First delete all BBLiveVar objects created in constructBBs(). A new object
|
||||
// of type BBLiveVa is created for every BasicBlock in the method
|
||||
|
||||
@ -36,11 +27,10 @@ MethodLiveVarInfo:: ~MethodLiveVarInfo()
|
||||
//
|
||||
BBToBBLiveVarMapType::iterator HMI = BB2BBLVMap.begin();
|
||||
|
||||
for( ; HMI != BB2BBLVMap.end() ; HMI ++ ) {
|
||||
if( (*HMI).first ) // delete all BBLiveVar in BB2BBLVMap
|
||||
delete (*HMI).second;
|
||||
}
|
||||
for( ; HMI != BB2BBLVMap.end(); ++HMI)
|
||||
delete HMI->second; // delete all BBLiveVar in BB2BBLVMap
|
||||
|
||||
BB2BBLVMap.clear();
|
||||
|
||||
// Then delete all objects of type LiveVarSet created in calcLiveVarSetsForBB
|
||||
// and entered into MInst2LVSetBI and MInst2LVSetAI (these are caches
|
||||
@ -50,18 +40,16 @@ MethodLiveVarInfo:: ~MethodLiveVarInfo()
|
||||
|
||||
// hash map iterator for MInst2LVSetBI
|
||||
//
|
||||
MInstToLiveVarSetMapType::iterator MI = MInst2LVSetBI.begin();
|
||||
MInstToLiveVarSetMapType::iterator MI = MInst2LVSetBI.begin();
|
||||
|
||||
for( ; MI != MInst2LVSetBI.end() ; MI ++ ) {
|
||||
if( (*MI).first ) // delete all LiveVarSets in MInst2LVSetBI
|
||||
delete (*MI).second;
|
||||
}
|
||||
for( ; MI != MInst2LVSetBI.end(); ++MI)
|
||||
delete MI->second; // delete all LiveVarSets in MInst2LVSetBI
|
||||
|
||||
MInst2LVSetBI.clear();
|
||||
MInst2LVSetAI.clear();
|
||||
}
|
||||
|
||||
|
||||
// ************************* support functions ********************************
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// constructs BBLiveVars and init Def and In sets
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -154,17 +142,11 @@ bool MethodLiveVarInfo::doSingleBackwardPass()
|
||||
//-----------------------------------------------------------------------------
|
||||
// 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.
|
||||
|
||||
|
||||
if (HasAnalyzed)
|
||||
return;
|
||||
|
||||
bool MethodLiveVarInfo::runOnMethod(Method *M) {
|
||||
Meth = M;
|
||||
|
||||
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
|
||||
constructBBs();
|
||||
@ -175,9 +157,8 @@ void MethodLiveVarInfo::analyze()
|
||||
} while (NeedAnotherIteration ); // repeat until we need more iterations
|
||||
|
||||
|
||||
HasAnalyzed = true; // finished analysing
|
||||
|
||||
if( DEBUG_LV) cout << "Live Variable Analysis complete!" << endl;
|
||||
if( DEBUG_LV) cout << "Live Variable Analysis complete!\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user