blob: aaee45fd451358058aad6549c5066d8532d119d1 [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 Lattner6357a3f2002-02-05 06:52:25 +000017class BBLiveVar : public Annotation {
Chris Lattner01744102002-02-05 00:33:19 +000018 const BasicBlock *BB; // pointer to BasicBlock
19 unsigned POID; // Post-Order ID
Ruchira Sasanka683847f2001-07-24 17:14:13 +000020
Vikram S. Adve4a12da72002-03-18 03:47:26 +000021 ValueSet DefSet; // Def set (with no preceding uses) for LV analysis
Chris Lattner6357a3f2002-02-05 06:52:25 +000022 ValueSet InSet, OutSet; // In & Out for LV analysis
Ruchira Sasanka683847f2001-07-24 17:14:13 +000023 bool InSetChanged, OutSetChanged; // set if the InSet/OutSet is modified
24
Vikram S. Adve4a12da72002-03-18 03:47:26 +000025 // map that contains PredBB -> Phi arguments
26 // coming in on that edge. such uses have to be
27 // treated differently from ordinary uses.
28 std::map<const BasicBlock *, ValueSet> PredToEdgeInSetMap;
29
Ruchira Sasanka91661812001-08-20 21:11:01 +000030 // method to propogate an InSet to OutSet of a predecessor
Chris Lattner5e5dfa32002-02-05 02:51:01 +000031 bool setPropagate(ValueSet *OutSetOfPred,
32 const ValueSet *InSetOfThisBB,
Chris Lattner01744102002-02-05 00:33:19 +000033 const BasicBlock *PredBB);
Ruchira Sasanka683847f2001-07-24 17:14:13 +000034
Ruchira Sasanka598641b2001-10-12 17:46:27 +000035 // To add an operand which is a def
Chris Lattner748697d2002-02-05 04:20:12 +000036 void addDef(const Value *Op);
Ruchira Sasanka598641b2001-10-12 17:46:27 +000037
38 // To add an operand which is a use
Chris Lattner748697d2002-02-05 04:20:12 +000039 void addUse(const Value *Op);
Ruchira Sasanka598641b2001-10-12 17:46:27 +000040
Chris Lattner748697d2002-02-05 04:20:12 +000041 void calcDefUseSets(); // calculates the Def & Use sets for this BB
Chris Lattner6357a3f2002-02-05 06:52:25 +000042
Chris Lattner01744102002-02-05 00:33:19 +000043 BBLiveVar(const BasicBlock *BB, unsigned POID);
Chris Lattner6357a3f2002-02-05 06:52:25 +000044 ~BBLiveVar() {} // make dtor private
45 public:
46 static BBLiveVar *CreateOnBB(const BasicBlock *BB, unsigned POID);
47 static BBLiveVar *GetFromBB(const BasicBlock *BB);
48 static void RemoveFromBB(const BasicBlock *BB);
Ruchira Sasanka683847f2001-07-24 17:14:13 +000049
Chris Lattner01744102002-02-05 00:33:19 +000050 inline bool isInSetChanged() const { return InSetChanged; }
Ruchira Sasanka683847f2001-07-24 17:14:13 +000051 inline bool isOutSetChanged() const { return OutSetChanged; }
52
Chris Lattner01744102002-02-05 00:33:19 +000053 inline unsigned getPOId() const { return POID; }
Ruchira Sasanka683847f2001-07-24 17:14:13 +000054
Chris Lattner01744102002-02-05 00:33:19 +000055 bool applyTransferFunc(); // calcultes the In in terms of Out
Ruchira Sasanka683847f2001-07-24 17:14:13 +000056
Ruchira Sasanka91661812001-08-20 21:11:01 +000057 // calculates Out set using In sets of the predecessors
Chris Lattner6357a3f2002-02-05 06:52:25 +000058 bool applyFlowFunc();
Ruchira Sasanka683847f2001-07-24 17:14:13 +000059
Chris Lattner748697d2002-02-05 04:20:12 +000060 inline const ValueSet &getOutSet() const { return OutSet; }
61 inline const ValueSet &getInSet() const { return InSet; }
Ruchira Sasanka683847f2001-07-24 17:14:13 +000062
Ruchira Sasanka91661812001-08-20 21:11:01 +000063 void printAllSets() const; // for printing Def/In/Out sets
64 void printInOutSets() const; // for printing In/Out sets
Ruchira Sasanka683847f2001-07-24 17:14:13 +000065};
66
Ruchira Sasanka683847f2001-07-24 17:14:13 +000067#endif