//===-- BBLiveVar.h - Live Variable Analysis for a BasicBlock ---*- C++ -*-===// // // This is a BasicBlock annotation class that is used by live var analysis to // hold data flow information for a basic block. // //===----------------------------------------------------------------------===// #ifndef LIVE_VAR_BB_H #define LIVE_VAR_BB_H #include "llvm/CodeGen/ValueSet.h" #include "Support/Annotation.h" #include class BasicBlock; class Value; class MachineBasicBlock; enum LiveVarDebugLevel_t { LV_DEBUG_None, LV_DEBUG_Normal, LV_DEBUG_Instr, LV_DEBUG_Verbose }; extern LiveVarDebugLevel_t DEBUG_LV; class BBLiveVar : public Annotation { const BasicBlock &BB; // pointer to BasicBlock MachineBasicBlock &MBB; // Pointer to MachineBasicBlock unsigned POID; // Post-Order ID ValueSet DefSet; // Def set (with no preceding uses) for LV analysis ValueSet InSet, OutSet; // In & Out for LV analysis bool InSetChanged, OutSetChanged; // set if the InSet/OutSet is modified // map that contains PredBB -> Phi arguments // coming in on that edge. such uses have to be // treated differently from ordinary uses. std::map PredToEdgeInSetMap; // method to propagate an InSet to OutSet of a predecessor bool setPropagate(ValueSet *OutSetOfPred, const ValueSet *InSetOfThisBB, const BasicBlock *PredBB); // To add an operand which is a def void addDef(const Value *Op); // To add an operand which is a use void addUse(const Value *Op); void calcDefUseSets(); // calculates the Def & Use sets for this BB BBLiveVar(const BasicBlock &BB, MachineBasicBlock &MBB, unsigned POID); ~BBLiveVar() {} // make dtor private public: static BBLiveVar *CreateOnBB(const BasicBlock &BB, MachineBasicBlock &MBB, unsigned POID); static BBLiveVar *GetFromBB(const BasicBlock &BB); static void RemoveFromBB(const BasicBlock &BB); inline bool isInSetChanged() const { return InSetChanged; } inline bool isOutSetChanged() const { return OutSetChanged; } MachineBasicBlock &getMachineBasicBlock() const { return MBB; } inline unsigned getPOId() const { return POID; } bool applyTransferFunc(); // calcultes the In in terms of Out // calculates Out set using In sets of the predecessors bool applyFlowFunc(); inline const ValueSet &getOutSet() const { return OutSet; } inline ValueSet &getOutSet() { return OutSet; } inline const ValueSet &getInSet() const { return InSet; } inline ValueSet &getInSet() { return InSet; } void printAllSets() const; // for printing Def/In/Out sets void printInOutSets() const; // for printing In/Out sets }; #endif