1
0
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:
Chris Lattner 2002-02-04 20:00:08 +00:00
parent 5726b834cd
commit b4e0d0424c
3 changed files with 66 additions and 65 deletions

View File

@ -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

View File

@ -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

View File

@ -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
@ -52,16 +42,14 @@ MethodLiveVarInfo:: ~MethodLiveVarInfo()
//
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.
bool MethodLiveVarInfo::runOnMethod(Method *M) {
Meth = M;
if (HasAnalyzed)
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
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;
}