Index: src/data-flow.h |
diff --git a/src/data-flow.h b/src/data-flow.h |
index 1c0d1104baa44954f6e4306d687cf10e5ec2c737..ea603ecb6191ce83c85fe7eeda3a46138004aa9f 100644 |
--- a/src/data-flow.h |
+++ b/src/data-flow.h |
@@ -100,6 +100,13 @@ class BitVector: public ZoneObject { |
} |
} |
+ void Subtract(const BitVector& other) { |
+ ASSERT(other.length() == length()); |
+ for (int i = 0; i < data_length_; i++) { |
+ data_[i] &= ~other.data_[i]; |
+ } |
+ } |
+ |
void Clear() { |
for (int i = 0; i < data_length_; i++) { |
data_[i] = 0; |
@@ -122,6 +129,27 @@ class BitVector: public ZoneObject { |
}; |
+class ReachingDefinitionsData BASE_EMBEDDED { |
+ public: |
+ ReachingDefinitionsData() : rd_in_(NULL), kill_(NULL), gen_(NULL) {} |
+ |
+ void Initialize(int definition_count) { |
+ rd_in_ = new BitVector(definition_count); |
+ kill_ = new BitVector(definition_count); |
+ gen_ = new BitVector(definition_count); |
+ } |
+ |
+ BitVector* rd_in() { return rd_in_; } |
+ BitVector* kill() { return kill_; } |
+ BitVector* gen() { return gen_; } |
+ |
+ private: |
+ BitVector* rd_in_; |
+ BitVector* kill_; |
+ BitVector* gen_; |
+}; |
+ |
+ |
// Flow-graph nodes. |
class Node: public ZoneObject { |
public: |
@@ -149,11 +177,19 @@ class Node: public ZoneObject { |
int number() { return number_; } |
void set_number(int number) { number_ = number; } |
+ // Functions used by data-flow analyses. |
+ virtual void InitializeReachingDefinitions(int definition_count, |
+ List<BitVector*>* variables); |
+ |
#ifdef DEBUG |
- virtual void AssignNumbers(); |
+ void AssignNodeNumber(); |
+ void PrintReachingDefinitions(); |
virtual void PrintText() = 0; |
#endif |
+ protected: |
+ ReachingDefinitionsData rd_; |
+ |
private: |
int number_; |
bool mark_; |
@@ -224,8 +260,10 @@ class BlockNode: public Node { |
ZoneList<Node*>* preorder, |
ZoneList<Node*>* postorder); |
+ void InitializeReachingDefinitions(int definition_count, |
+ List<BitVector*>* variables); |
+ |
#ifdef DEBUG |
- void AssignNumbers(); |
void PrintText(); |
#endif |
@@ -384,8 +422,8 @@ class FlowGraphBuilder: public AstVisitor { |
void Build(FunctionLiteral* lit); |
FlowGraph* graph() { return &graph_; } |
- |
ZoneList<Node*>* postorder() { return &postorder_; } |
+ ZoneList<Expression*>* definitions() { return &definitions_; } |
private: |
ExitNode* global_exit() { return global_exit_; } |
@@ -402,8 +440,9 @@ class FlowGraphBuilder: public AstVisitor { |
// The flow graph builder collects a list of definitions (assignments and |
// count operations) to stack-allocated variables to use for reaching |
- // definitions analysis. |
- ZoneList<AstNode*> definitions_; |
+ // definitions analysis. AST node numbers in the AST are used to refer |
+ // into this list. |
+ ZoneList<Expression*> definitions_; |
DISALLOW_COPY_AND_ASSIGN(FlowGraphBuilder); |
}; |
@@ -521,6 +560,39 @@ class AssignedVariablesAnalyzer : public AstVisitor { |
DISALLOW_COPY_AND_ASSIGN(AssignedVariablesAnalyzer); |
}; |
+ |
+class ReachingDefinitions BASE_EMBEDDED { |
+ public: |
+ ReachingDefinitions(ZoneList<Node*>* postorder, |
+ ZoneList<Expression*>* definitions, |
+ int variable_count) |
+ : postorder_(postorder), |
+ definitions_(definitions), |
+ variables_(variable_count) { |
+ int definition_count = definitions->length(); |
+ for (int i = 0; i < variable_count; i++) { |
+ variables_.Add(new BitVector(definition_count)); |
+ } |
+ } |
+ |
+ static int IndexFor(Variable* var, int variable_count); |
+ |
+ void Compute(); |
+ |
+ private: |
+ // A (postorder) list of flow-graph nodes in the body. |
+ ZoneList<Node*>* postorder_; |
+ |
+ // A list of all the definitions in the body. |
+ ZoneList<Expression*>* definitions_; |
+ |
+ // For each variable, the set of all its definitions. |
+ List<BitVector*> variables_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ReachingDefinitions); |
+}; |
+ |
+ |
} } // namespace v8::internal |