blob: db5ac8f8d8f4d646871aa601e9f16fd30314c385 [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 Lattner65b1ad92002-02-04 16:31:03 +000014class Method;
Chris Lattner01744102002-02-05 00:33:19 +000015class BasicBlock;
16class Value;
Ruchira Sasanka683847f2001-07-24 17:14:13 +000017
Chris Lattner6357a3f2002-02-05 06:52:25 +000018class BBLiveVar : public Annotation {
Chris Lattner01744102002-02-05 00:33:19 +000019 const BasicBlock *BB; // pointer to BasicBlock
20 unsigned POID; // Post-Order ID
Ruchira Sasanka683847f2001-07-24 17:14:13 +000021
Chris Lattner6357a3f2002-02-05 06:52:25 +000022 ValueSet DefSet; // Def set for LV analysis
23 ValueSet InSet, OutSet; // In & Out for LV analysis
Ruchira Sasanka683847f2001-07-24 17:14:13 +000024 bool InSetChanged, OutSetChanged; // set if the InSet/OutSet is modified
25
26 // map that contains phi args->BB they came
Ruchira Sasanka91661812001-08-20 21:11:01 +000027 // set by calcDefUseSets & used by setPropagate
Chris Lattner01744102002-02-05 00:33:19 +000028 std::map<const Value *, const BasicBlock *> PhiArgMap;
Ruchira Sasanka683847f2001-07-24 17:14:13 +000029
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