blob: 79cf7dce079838cedbbf09a75adf51298b8557bd [file] [log] [blame]
Chris Lattner01744102002-02-05 00:33:19 +00001//===-- BBLiveVar.h - Live Variable Analysis for a BasicBlock ----*- C++ -*--=//
2//
Chris Lattner6357a3f2002-02-05 06:52:25 +00003// This is a BasicBlock annotation class that is used by live var analysis to
4// hold data flow information for a basic block.
Chris Lattner01744102002-02-05 00:33:19 +00005//
6//===----------------------------------------------------------------------===//
Ruchira Sasanka683847f2001-07-24 17:14:13 +00007
8#ifndef LIVE_VAR_BB_H
9#define LIVE_VAR_BB_H
10
Chris Lattner5e5dfa32002-02-05 02:51:01 +000011#include "llvm/Analysis/LiveVar/ValueSet.h"
Chris Lattner6357a3f2002-02-05 06:52:25 +000012#include "llvm/Annotation.h"
Chris Lattner01744102002-02-05 00:33:19 +000013#include <map>
Chris Lattner01744102002-02-05 00:33:19 +000014class BasicBlock;
15class Value;
Ruchira Sasanka683847f2001-07-24 17:14:13 +000016
Chris Lattner59dcbf92002-05-22 17:07:26 +000017enum LiveVarDebugLevel_t {
18 LV_DEBUG_None,
19 LV_DEBUG_Normal,
20 LV_DEBUG_Instr,
21 LV_DEBUG_Verbose
22};
23
24extern LiveVarDebugLevel_t DEBUG_LV;
25
Chris Lattner6357a3f2002-02-05 06:52:25 +000026class BBLiveVar : public Annotation {
Chris Lattner01744102002-02-05 00:33:19 +000027 const BasicBlock *BB; // pointer to BasicBlock
28 unsigned POID; // Post-Order ID
Ruchira Sasanka683847f2001-07-24 17:14:13 +000029
Vikram S. Adve4a12da72002-03-18 03:47:26 +000030 ValueSet DefSet; // Def set (with no preceding uses) for LV analysis
Chris Lattner6357a3f2002-02-05 06:52:25 +000031 ValueSet InSet, OutSet; // In & Out for LV analysis
Ruchira Sasanka683847f2001-07-24 17:14:13 +000032 bool InSetChanged, OutSetChanged; // set if the InSet/OutSet is modified
33
Vikram S. Adve4a12da72002-03-18 03:47:26 +000034 // map that contains PredBB -> Phi arguments
35 // coming in on that edge. such uses have to be
36 // treated differently from ordinary uses.
37 std::map<const BasicBlock *, ValueSet> PredToEdgeInSetMap;
38
Ruchira Sasanka91661812001-08-20 21:11:01 +000039 // method to propogate an InSet to OutSet of a predecessor
Chris Lattner5e5dfa32002-02-05 02:51:01 +000040 bool setPropagate(ValueSet *OutSetOfPred,
41 const ValueSet *InSetOfThisBB,
Chris Lattner01744102002-02-05 00:33:19 +000042 const BasicBlock *PredBB);
Ruchira Sasanka683847f2001-07-24 17:14:13 +000043
Ruchira Sasanka598641b2001-10-12 17:46:27 +000044 // To add an operand which is a def
Chris Lattner748697d2002-02-05 04:20:12 +000045 void addDef(const Value *Op);
Ruchira Sasanka598641b2001-10-12 17:46:27 +000046
47 // To add an operand which is a use
Chris Lattner748697d2002-02-05 04:20:12 +000048 void addUse(const Value *Op);
Ruchira Sasanka598641b2001-10-12 17:46:27 +000049
Chris Lattner748697d2002-02-05 04:20:12 +000050 void calcDefUseSets(); // calculates the Def & Use sets for this BB
Chris Lattner6357a3f2002-02-05 06:52:25 +000051
Chris Lattner01744102002-02-05 00:33:19 +000052 BBLiveVar(const BasicBlock *BB, unsigned POID);
Chris Lattner6357a3f2002-02-05 06:52:25 +000053 ~BBLiveVar() {} // make dtor private
54 public:
55 static BBLiveVar *CreateOnBB(const BasicBlock *BB, unsigned POID);
56 static BBLiveVar *GetFromBB(const BasicBlock *BB);
57 static void RemoveFromBB(const BasicBlock *BB);
Ruchira Sasanka683847f2001-07-24 17:14:13 +000058
Chris Lattner01744102002-02-05 00:33:19 +000059 inline bool isInSetChanged() const { return InSetChanged; }
Ruchira Sasanka683847f2001-07-24 17:14:13 +000060 inline bool isOutSetChanged() const { return OutSetChanged; }
61
Chris Lattner01744102002-02-05 00:33:19 +000062 inline unsigned getPOId() const { return POID; }
Ruchira Sasanka683847f2001-07-24 17:14:13 +000063
Chris Lattner01744102002-02-05 00:33:19 +000064 bool applyTransferFunc(); // calcultes the In in terms of Out
Ruchira Sasanka683847f2001-07-24 17:14:13 +000065
Ruchira Sasanka91661812001-08-20 21:11:01 +000066 // calculates Out set using In sets of the predecessors
Chris Lattner6357a3f2002-02-05 06:52:25 +000067 bool applyFlowFunc();
Ruchira Sasanka683847f2001-07-24 17:14:13 +000068
Chris Lattner748697d2002-02-05 04:20:12 +000069 inline const ValueSet &getOutSet() const { return OutSet; }
70 inline const ValueSet &getInSet() const { return InSet; }
Ruchira Sasanka683847f2001-07-24 17:14:13 +000071
Ruchira Sasanka91661812001-08-20 21:11:01 +000072 void printAllSets() const; // for printing Def/In/Out sets
73 void printInOutSets() const; // for printing In/Out sets
Ruchira Sasanka683847f2001-07-24 17:14:13 +000074};
75
Ruchira Sasanka683847f2001-07-24 17:14:13 +000076#endif