mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
e7506a366e
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1957 91177308-0d34-0410-b5e6-96231b3b80d8
141 lines
4.6 KiB
C++
141 lines
4.6 KiB
C++
/* Title: MethodLiveVarInfo.h -*- C++ -*-
|
|
Author: Ruchira Sasanka
|
|
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
|
|
|
|
It must be called like:
|
|
|
|
MethodLiveVarInfo MLVI(Function *); // initializes data structures
|
|
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.
|
|
|
|
The live var set before an instruction can be obtained in 2 ways:
|
|
|
|
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 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
|
|
LVSet.setUnion( LVI->getOutSetOfBB( *BBI ) );
|
|
|
|
BasicBlock::InstListType::const_reverse_iterator
|
|
InstIterator = InstListInBB.rbegin(); // get the rev iter for inst in BB
|
|
|
|
// iterate over all the instructions in BB in reverse
|
|
for( ; InstIterator != InstListInBB.rend(); InstIterator++) {
|
|
|
|
//...... all code here which uses LVSet ........
|
|
|
|
LVSet.applyTranferFuncForInst(*InstIterator);
|
|
|
|
// Now LVSet contains live vars ABOVE the current instrution
|
|
}
|
|
|
|
See buildInterferenceGraph() for the above example.
|
|
*/
|
|
|
|
|
|
#ifndef METH_LIVE_VAR_INFO_H
|
|
#define METH_LIVE_VAR_INFO_H
|
|
|
|
#include "llvm/Pass.h"
|
|
#include "llvm/Analysis/LiveVar/ValueSet.h"
|
|
#include "Support/CommandLine.h"
|
|
|
|
class BBLiveVar;
|
|
class MachineInstr;
|
|
|
|
|
|
enum LiveVarDebugLevel_t {
|
|
LV_DEBUG_None,
|
|
LV_DEBUG_Normal,
|
|
LV_DEBUG_Instr,
|
|
LV_DEBUG_Verbose
|
|
};
|
|
|
|
extern cl::Enum<LiveVarDebugLevel_t> DEBUG_LV;
|
|
|
|
|
|
class MethodLiveVarInfo : public MethodPass {
|
|
// Machine Instr to LiveVarSet Map for providing LVset BEFORE each inst
|
|
std::map<const MachineInstr *, const ValueSet *> MInst2LVSetBI;
|
|
|
|
// Machine Instr to LiveVarSet Map for providing LVset AFTER each inst
|
|
std::map<const MachineInstr *, const ValueSet *> MInst2LVSetAI;
|
|
|
|
// Stored Function that the data is computed with respect to
|
|
const Function *M;
|
|
|
|
// --------- private methods -----------------------------------------
|
|
|
|
// constructs BBLiveVars and init Def and In sets
|
|
void constructBBs(const Function *F);
|
|
|
|
// do one backward pass over the CFG
|
|
bool doSingleBackwardPass(const Function *F, unsigned int iter);
|
|
|
|
// calculates live var sets for instructions in a BB
|
|
void calcLiveVarSetsForBB(const BasicBlock *BB);
|
|
|
|
public:
|
|
static AnalysisID ID; // We are an analysis, we must have an ID
|
|
|
|
MethodLiveVarInfo(AnalysisID id = ID) { assert(id == ID); }
|
|
|
|
// --------- Implement the MethodPass interface ----------------------
|
|
|
|
// runOnMethod - Perform analysis, update internal data structures.
|
|
virtual bool runOnMethod(Function *F);
|
|
|
|
// 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
|
|
const ValueSet &getOutSetOfBB(const BasicBlock *BB) const;
|
|
|
|
// gets InSet of a BB
|
|
const ValueSet &getInSetOfBB(const BasicBlock *BB) const;
|
|
|
|
// gets the Live var set BEFORE an instruction
|
|
const ValueSet &getLiveVarSetBeforeMInst(const MachineInstr *MI,
|
|
const BasicBlock *BB);
|
|
|
|
// gets the Live var set AFTER an instruction
|
|
const ValueSet &getLiveVarSetAfterMInst(const MachineInstr *MI,
|
|
const BasicBlock *BB);
|
|
};
|
|
|
|
#endif
|