diff --git a/include/llvm/Analysis/LiveVar/FunctionLiveVarInfo.h b/include/llvm/Analysis/LiveVar/FunctionLiveVarInfo.h index 206fef8e3e8..c148d0c7a3e 100644 --- a/include/llvm/Analysis/LiveVar/FunctionLiveVarInfo.h +++ b/include/llvm/Analysis/LiveVar/FunctionLiveVarInfo.h @@ -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); + + }; diff --git a/include/llvm/Analysis/LiveVar/LiveVarMap.h b/include/llvm/Analysis/LiveVar/LiveVarMap.h index a7f1ccd6fd5..bc00d4f2815 100644 --- a/include/llvm/Analysis/LiveVar/LiveVarMap.h +++ b/include/llvm/Analysis/LiveVar/LiveVarMap.h @@ -1,4 +1,4 @@ -/* Title: ValueSet.h +/* Title: LiveVarMap.h Author: Ruchira Sasanka Date: Jun 30, 01 Purpose: This file contains the class for a map between the BasicBlock class @@ -18,8 +18,8 @@ class BasicBlock; class BBLiveVar; -struct hashFuncInst { // sturcture containing the hash function for Inst - inline size_t operator () (const Instruction *val) const { +struct hashFuncMInst { // sturcture containing the hash function for MInst + inline size_t operator () (const MachineInstr *val) const { return (size_t) val; } }; @@ -37,8 +37,8 @@ struct hashFuncBB { // sturcture containing the hash function for BB typedef hash_map BBToBBLiveVarMapType; -typedef hash_map InstToLiveVarSetMapType; +typedef hash_map MInstToLiveVarSetMapType; #endif diff --git a/include/llvm/Analysis/LiveVar/LiveVarSet.h b/include/llvm/Analysis/LiveVar/LiveVarSet.h index 37d0d21547a..17524fccd32 100644 --- a/include/llvm/Analysis/LiveVar/LiveVarSet.h +++ b/include/llvm/Analysis/LiveVar/LiveVarSet.h @@ -1,4 +1,4 @@ -/* Title: ValueSet.h +/* Title: LiveVarSet.h Author: Ruchira Sasanka Date: Jun 30, 01 Purpose: Contains the class definition of LiveVarSet which is used for @@ -16,8 +16,12 @@ class LiveVarSet : public ValueSet { public: - void applyTranferFuncForInst(const Instruction *const Inst); - + + // This function applies a machine instr to a live var set (accepts OutSet) + // and makes necessary changes to it (produces InSet). + + void applyTranferFuncForMInst(const MachineInstr *const MInst); + }; diff --git a/include/llvm/Analysis/LiveVar/ValueSet.h b/include/llvm/Analysis/LiveVar/ValueSet.h index 02d3906178c..2b564b4a90d 100644 --- a/include/llvm/Analysis/LiveVar/ValueSet.h +++ b/include/llvm/Analysis/LiveVar/ValueSet.h @@ -2,7 +2,7 @@ Author: Ruchira Sasanka Date: Jun 30, 01 Purpose: Contains a mathematical set of Values. LiveVarSet is derived from - this. Contains both class and method definitions + this. Contains both class and method definitions. */ #ifndef VALUE_SET_H @@ -20,14 +20,14 @@ //------------------------ Support functions --------------------------------- -struct hashFuncValue { // sturcture containing the hash function. +struct hashFuncValue { // sturcture containing the hash func inline size_t operator () (const Value *const val) const { return (size_t) val; } }; -//------------------- Class Definition for ValueSet ---------------------------- +//------------------- Class Definition for ValueSet -------------------------- void printValue( const Value *const v); // func to print a Value @@ -37,21 +37,21 @@ class ValueSet : public hash_set { public: - ValueSet(); // constructor + ValueSet(); // constructor inline void add(const Value *const val) - { assert( val ); insert(val);} // for adding a live variable to set + { assert( val ); insert(val);} // for adding a live variable to set inline void remove(const Value *const val) - { assert( val ); erase(val); } // for removing a live variable from set + { assert( val ); erase(val); } // for removing a live var from set - bool setUnion( const ValueSet *const set1); // for performing two set unions - void setSubtract( const ValueSet *const set1); // for performing set difference + bool setUnion( const ValueSet *const set1); // for performing set union + void setSubtract( const ValueSet *const set1); // for performing set diff - // for performing set difference + void setDifference( const ValueSet *const set1, const ValueSet *const set2); - void printSet() const; // for printing a live variable set + void printSet() const; // for printing a live variable set }; diff --git a/include/llvm/CodeGen/FunctionLiveVarInfo.h b/include/llvm/CodeGen/FunctionLiveVarInfo.h index 206fef8e3e8..c148d0c7a3e 100644 --- a/include/llvm/CodeGen/FunctionLiveVarInfo.h +++ b/include/llvm/CodeGen/FunctionLiveVarInfo.h @@ -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); + + }; diff --git a/include/llvm/CodeGen/ValueSet.h b/include/llvm/CodeGen/ValueSet.h index 02d3906178c..2b564b4a90d 100644 --- a/include/llvm/CodeGen/ValueSet.h +++ b/include/llvm/CodeGen/ValueSet.h @@ -2,7 +2,7 @@ Author: Ruchira Sasanka Date: Jun 30, 01 Purpose: Contains a mathematical set of Values. LiveVarSet is derived from - this. Contains both class and method definitions + this. Contains both class and method definitions. */ #ifndef VALUE_SET_H @@ -20,14 +20,14 @@ //------------------------ Support functions --------------------------------- -struct hashFuncValue { // sturcture containing the hash function. +struct hashFuncValue { // sturcture containing the hash func inline size_t operator () (const Value *const val) const { return (size_t) val; } }; -//------------------- Class Definition for ValueSet ---------------------------- +//------------------- Class Definition for ValueSet -------------------------- void printValue( const Value *const v); // func to print a Value @@ -37,21 +37,21 @@ class ValueSet : public hash_set { public: - ValueSet(); // constructor + ValueSet(); // constructor inline void add(const Value *const val) - { assert( val ); insert(val);} // for adding a live variable to set + { assert( val ); insert(val);} // for adding a live variable to set inline void remove(const Value *const val) - { assert( val ); erase(val); } // for removing a live variable from set + { assert( val ); erase(val); } // for removing a live var from set - bool setUnion( const ValueSet *const set1); // for performing two set unions - void setSubtract( const ValueSet *const set1); // for performing set difference + bool setUnion( const ValueSet *const set1); // for performing set union + void setSubtract( const ValueSet *const set1); // for performing set diff - // for performing set difference + void setDifference( const ValueSet *const set1, const ValueSet *const set2); - void printSet() const; // for printing a live variable set + void printSet() const; // for printing a live variable set }; diff --git a/lib/Analysis/LiveVar/BBLiveVar.h b/lib/Analysis/LiveVar/BBLiveVar.h index 7917cc21315..e4d5804489d 100644 --- a/lib/Analysis/LiveVar/BBLiveVar.h +++ b/lib/Analysis/LiveVar/BBLiveVar.h @@ -1,8 +1,8 @@ -/* Title: ValueSet.h +/* Title: BBLiveVar.h Author: Ruchira Sasanka Date: Jun 30, 01 Purpose: This is a wrapper class for BasicBlock which is used by live - variable anaysis + variable anaysis. */ #ifndef LIVE_VAR_BB_H @@ -28,9 +28,10 @@ class BBLiveVar bool InSetChanged, OutSetChanged; // set if the InSet/OutSet is modified // map that contains phi args->BB they came + // set by calcDefUseSets & used by setPropagate hash_map PhiArgMap; - // method to propogate an InSet to OutSet of a predecessor + // method to propogate an InSet to OutSet of a predecessor bool setPropagate( LiveVarSet *const OutSetOfPred, const LiveVarSet *const InSetOfThisBB, const BasicBlock *const PredBB); @@ -47,16 +48,18 @@ class BBLiveVar void calcDefUseSets() ; // calculates the Def & Use sets for this BB bool applyTransferFunc(); // calcultes the In in terms of Out - // calculates Out set using In sets of the predecessors + // calculates Out set using In sets of the predecessors bool applyFlowFunc(BBToBBLiveVarMapType LVMap); inline const LiveVarSet* getOutSet() const { return &OutSet; } inline const LiveVarSet* getInSet() const { return &InSet; } - void printAllSets() const; // for printing Def/In/Out sets - void printInOutSets() const; // for printing In/Out sets + void printAllSets() const; // for printing Def/In/Out sets + void printInOutSets() const; // for printing In/Out sets + + ~BBLiveVar() { } // nothing to do since only composite objects + - //TODO write a destructor to deallocate Def/In.Out sets and PhiArgMap }; @@ -65,5 +68,6 @@ class BBLiveVar + #endif diff --git a/lib/Target/SparcV9/LiveVar/BBLiveVar.h b/lib/Target/SparcV9/LiveVar/BBLiveVar.h index 7917cc21315..e4d5804489d 100644 --- a/lib/Target/SparcV9/LiveVar/BBLiveVar.h +++ b/lib/Target/SparcV9/LiveVar/BBLiveVar.h @@ -1,8 +1,8 @@ -/* Title: ValueSet.h +/* Title: BBLiveVar.h Author: Ruchira Sasanka Date: Jun 30, 01 Purpose: This is a wrapper class for BasicBlock which is used by live - variable anaysis + variable anaysis. */ #ifndef LIVE_VAR_BB_H @@ -28,9 +28,10 @@ class BBLiveVar bool InSetChanged, OutSetChanged; // set if the InSet/OutSet is modified // map that contains phi args->BB they came + // set by calcDefUseSets & used by setPropagate hash_map PhiArgMap; - // method to propogate an InSet to OutSet of a predecessor + // method to propogate an InSet to OutSet of a predecessor bool setPropagate( LiveVarSet *const OutSetOfPred, const LiveVarSet *const InSetOfThisBB, const BasicBlock *const PredBB); @@ -47,16 +48,18 @@ class BBLiveVar void calcDefUseSets() ; // calculates the Def & Use sets for this BB bool applyTransferFunc(); // calcultes the In in terms of Out - // calculates Out set using In sets of the predecessors + // calculates Out set using In sets of the predecessors bool applyFlowFunc(BBToBBLiveVarMapType LVMap); inline const LiveVarSet* getOutSet() const { return &OutSet; } inline const LiveVarSet* getInSet() const { return &InSet; } - void printAllSets() const; // for printing Def/In/Out sets - void printInOutSets() const; // for printing In/Out sets + void printAllSets() const; // for printing Def/In/Out sets + void printInOutSets() const; // for printing In/Out sets + + ~BBLiveVar() { } // nothing to do since only composite objects + - //TODO write a destructor to deallocate Def/In.Out sets and PhiArgMap }; @@ -65,5 +68,6 @@ class BBLiveVar + #endif