mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-01 15:17:25 +00:00
LV info on machine instructions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -3,36 +3,48 @@
|
||||
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
|
||||
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:
|
||||
It must be called like:
|
||||
|
||||
MethodLiveVarInfo MLVI( Mehtod *); // initializes data structures
|
||||
MLVI.analyze(); // do the actural live variable anal
|
||||
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
|
||||
live var info of a BB.
|
||||
|
||||
The live var set before an instruction can be constructed in several ways:
|
||||
The live var set before an instruction can be obtained in 2 ways:
|
||||
|
||||
1. Use the OutSet and applyTranferFuncForInst(const Instruction *const Inst)
|
||||
1. Use the method getLiveVarSetAfterInst(Instruction *) to get the LV Info
|
||||
just after an instruction. (also exists getLiveVarSetBeforeInst(..))
|
||||
|
||||
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. However, if you need LV info of nearly all the instructions of a
|
||||
BB, this is the best and simplest interfrace.
|
||||
|
||||
|
||||
2. 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:
|
||||
This is the most memory efficient method if you need LV info for
|
||||
only several 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
|
||||
// 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
|
||||
InstIterator = InstListInBB.rbegin(); // get the rev iter for inst in BB
|
||||
|
||||
// iterate over all the instructions in BB in reverse
|
||||
// iterate over all the instructions in BB in reverse
|
||||
for( ; InstIterator != InstListInBB.rend(); InstIterator++) {
|
||||
|
||||
//...... all code here which uses LVSet ........
|
||||
@@ -45,28 +57,16 @@
|
||||
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
|
||||
// set DEBUG_LV for printing out debug messages
|
||||
// if DEBUG_LV is 1 normal output messages
|
||||
// if DEBUG_LV is 2 extensive debug info for each instr
|
||||
|
||||
#define DEBUG_LV (1)
|
||||
|
||||
#include "LiveVarSet.h"
|
||||
@@ -82,38 +82,65 @@
|
||||
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
|
||||
// Live var anal is done on this method - set by constructor
|
||||
const Method *const Meth;
|
||||
|
||||
InstToLiveVarSetMapType Inst2LVSetMap; // Instruction to LiveVarSet Map
|
||||
//- for providing LV info for each inst
|
||||
// A map betwn the BasicBlock and BBLiveVar
|
||||
BBToBBLiveVarMapType BB2BBLVMap;
|
||||
|
||||
void constructBBs(); // constructs BBLiveVars and init Def and In sets
|
||||
bool doSingleBackwardPass(); // do one backward pass over the CFG
|
||||
// Machine Instr to LiveVarSet Map for providing LVset BEFORE each inst
|
||||
MInstToLiveVarSetMapType MInst2LVSetBI;
|
||||
|
||||
// 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 -----------------------------------------
|
||||
|
||||
// constructs BBLiveVars and init Def and In sets
|
||||
void constructBBs();
|
||||
|
||||
// do one backward pass over the CFG
|
||||
bool doSingleBackwardPass();
|
||||
|
||||
// calculates live var sets for instructions in a BB
|
||||
void calcLiveVarSetsForBB(const BasicBlock *const BB);
|
||||
|
||||
|
||||
public:
|
||||
MethodLiveVarInfo(Method *const Meth); // constructor
|
||||
MethodLiveVarInfo(const Method *const Meth); // constructor
|
||||
|
||||
~MethodLiveVarInfo(); // destructor
|
||||
~MethodLiveVarInfo(); // destructor
|
||||
|
||||
void analyze(); // performs a liver var analysis of a single method
|
||||
// performs a liver var analysis of a single method
|
||||
void analyze();
|
||||
|
||||
// gets OutSet of a BB
|
||||
inline const LiveVarSet *getOutSetOfBB( const BasicBlock *const BB) const {
|
||||
// gets OutSet of a BB
|
||||
inline const LiveVarSet *getOutSetOfBB( const BasicBlock *const BB) const {
|
||||
assert( HasAnalyzed && "call analyze() before calling this" );
|
||||
return ( (* (BB2BBLVMap.find(BB)) ).second )->getOutSet();
|
||||
}
|
||||
|
||||
// gets InSet of a BB
|
||||
// gets InSet of a BB
|
||||
inline const LiveVarSet *getInSetOfBB( const BasicBlock *const BB) const {
|
||||
assert( HasAnalyzed && "call analyze() before calling this" );
|
||||
return ( (* (BB2BBLVMap.find(BB)) ).second )->getInSet();
|
||||
}
|
||||
// gets the Live var set before an instruction
|
||||
const LiveVarSet *
|
||||
MethodLiveVarInfo::getLiveVarSetBeforeInst(const Instruction *const Inst);
|
||||
|
||||
// gets the Live var set BEFORE an instruction
|
||||
const LiveVarSet * getLiveVarSetBeforeMInst(const MachineInstr *const Inst,
|
||||
const BasicBlock *const CurBB);
|
||||
|
||||
// gets the Live var set AFTER an instruction
|
||||
const LiveVarSet * getLiveVarSetAfterMInst(const MachineInstr *const MInst,
|
||||
const BasicBlock *const CurBB);
|
||||
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user