diff options
Diffstat (limited to 'lib/Target/SparcV9/LiveVar/FunctionLiveVarInfo.h')
-rw-r--r-- | lib/Target/SparcV9/LiveVar/FunctionLiveVarInfo.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/lib/Target/SparcV9/LiveVar/FunctionLiveVarInfo.h b/lib/Target/SparcV9/LiveVar/FunctionLiveVarInfo.h new file mode 100644 index 0000000000..23a9d93a6e --- /dev/null +++ b/lib/Target/SparcV9/LiveVar/FunctionLiveVarInfo.h @@ -0,0 +1,111 @@ +//===-- CodeGen/FunctionLiveVarInfo.h - LiveVar Analysis --------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This is the interface for live variable info of a function that is required +// by any other part of the compiler +// +// 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). +// +//===----------------------------------------------------------------------===// + +#ifndef FUNCTION_LIVE_VAR_INFO_H +#define FUNCTION_LIVE_VAR_INFO_H + +#include "Support/hash_map" +#include "llvm/Pass.h" +#include "llvm/CodeGen/ValueSet.h" + +namespace llvm { + +class BBLiveVar; +class MachineInstr; + +class FunctionLiveVarInfo : public FunctionPass { + // Machine Instr to LiveVarSet Map for providing LVset BEFORE each inst + // These sets are owned by this map and will be freed in releaseMemory(). + hash_map<const MachineInstr *, ValueSet *> MInst2LVSetBI; + + // Machine Instr to LiveVarSet Map for providing LVset AFTER each inst. + // These sets are just pointers to sets in MInst2LVSetBI or BBLiveVar. + hash_map<const MachineInstr *, ValueSet *> MInst2LVSetAI; + + hash_map<const BasicBlock*, BBLiveVar*> BBLiveVarInfo; + + // 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: + // --------- Implement the FunctionPass interface ---------------------- + + // runOnFunction - Perform analysis, update internal data structures. + virtual bool runOnFunction(Function &F); + + // releaseMemory - After LiveVariable analysis has been used, forget! + virtual void releaseMemory(); + + // getAnalysisUsage - Provide self! + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + } + + // --------- Functions to access analysis results ------------------- + + // get OutSet of a BB + const ValueSet &getOutSetOfBB(const BasicBlock *BB) const; + ValueSet &getOutSetOfBB(const BasicBlock *BB) ; + + // get InSet of a BB + const ValueSet &getInSetOfBB(const BasicBlock *BB) const; + ValueSet &getInSetOfBB(const BasicBlock *BB) ; + + // gets the Live var set BEFORE an instruction. + // if BB is specified and the live var set has not yet been computed, + // it will be computed on demand. + const ValueSet &getLiveVarSetBeforeMInst(const MachineInstr *MI, + const BasicBlock *BB = 0); + + // gets the Live var set AFTER an instruction + // if BB is specified and the live var set has not yet been computed, + // it will be computed on demand. + const ValueSet &getLiveVarSetAfterMInst(const MachineInstr *MI, + const BasicBlock *BB = 0); +}; + +} // End llvm namespace + +#endif |