Index: src/data-flow.h |
diff --git a/src/data-flow.h b/src/data-flow.h |
index 9e7e6a496247005b28f9d4b88489fe24d1b088b8..8046e4228c04090256b8b32011c3f220a26c3917 100644 |
--- a/src/data-flow.h |
+++ b/src/data-flow.h |
@@ -241,6 +241,12 @@ class Node: public ZoneObject { |
virtual void UpdateRDIn(WorkList<Node>* worklist, bool mark) = 0; |
virtual void PropagateReachingDefinitions(List<BitVector*>* variables); |
+ // Functions used by dead-code elimination. |
+ virtual void MarkCriticalInstructions( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count); |
+ |
#ifdef DEBUG |
void AssignNodeNumber(); |
void PrintReachingDefinitions(); |
@@ -263,24 +269,24 @@ class ExitNode: public Node { |
public: |
ExitNode() : predecessors_(4) {} |
- bool IsExitNode() { return true; } |
+ virtual bool IsExitNode() { return true; } |
- void AddPredecessor(Node* predecessor) { |
+ virtual void AddPredecessor(Node* predecessor) { |
ASSERT(predecessor != NULL); |
predecessors_.Add(predecessor); |
} |
- void AddSuccessor(Node* successor) { UNREACHABLE(); } |
+ virtual void AddSuccessor(Node* successor) { UNREACHABLE(); } |
- void Traverse(bool mark, |
- ZoneList<Node*>* preorder, |
- ZoneList<Node*>* postorder); |
+ virtual void Traverse(bool mark, |
+ ZoneList<Node*>* preorder, |
+ ZoneList<Node*>* postorder); |
- void ComputeRDOut(BitVector* result); |
- void UpdateRDIn(WorkList<Node>* worklist, bool mark); |
+ virtual void ComputeRDOut(BitVector* result); |
+ virtual void UpdateRDIn(WorkList<Node>* worklist, bool mark); |
#ifdef DEBUG |
- void PrintText(); |
+ virtual void PrintText(); |
#endif |
private: |
@@ -301,18 +307,18 @@ class BlockNode: public Node { |
return reinterpret_cast<BlockNode*>(node); |
} |
- bool IsBlockNode() { return true; } |
+ virtual bool IsBlockNode() { return true; } |
bool is_empty() { return instructions_.is_empty(); } |
ZoneList<AstNode*>* instructions() { return &instructions_; } |
- void AddPredecessor(Node* predecessor) { |
+ virtual void AddPredecessor(Node* predecessor) { |
ASSERT(predecessor_ == NULL && predecessor != NULL); |
predecessor_ = predecessor; |
} |
- void AddSuccessor(Node* successor) { |
+ virtual void AddSuccessor(Node* successor) { |
ASSERT(successor_ == NULL && successor != NULL); |
successor_ = successor; |
} |
@@ -321,20 +327,25 @@ class BlockNode: public Node { |
instructions_.Add(instruction); |
} |
- void Traverse(bool mark, |
- ZoneList<Node*>* preorder, |
- ZoneList<Node*>* postorder); |
+ virtual void Traverse(bool mark, |
+ ZoneList<Node*>* preorder, |
+ ZoneList<Node*>* postorder); |
+ |
+ virtual void InitializeReachingDefinitions(int definition_count, |
+ List<BitVector*>* variables, |
+ WorkList<Node>* worklist, |
+ bool mark); |
+ virtual void ComputeRDOut(BitVector* result); |
+ virtual void UpdateRDIn(WorkList<Node>* worklist, bool mark); |
+ virtual void PropagateReachingDefinitions(List<BitVector*>* variables); |
- void InitializeReachingDefinitions(int definition_count, |
- List<BitVector*>* variables, |
- WorkList<Node>* worklist, |
- bool mark); |
- void ComputeRDOut(BitVector* result); |
- void UpdateRDIn(WorkList<Node>* worklist, bool mark); |
- void PropagateReachingDefinitions(List<BitVector*>* variables); |
+ virtual void MarkCriticalInstructions( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count); |
#ifdef DEBUG |
- void PrintText(); |
+ virtual void PrintText(); |
#endif |
private: |
@@ -351,14 +362,14 @@ class BranchNode: public Node { |
public: |
BranchNode() : predecessor_(NULL), successor0_(NULL), successor1_(NULL) {} |
- bool IsBranchNode() { return true; } |
+ virtual bool IsBranchNode() { return true; } |
- void AddPredecessor(Node* predecessor) { |
+ virtual void AddPredecessor(Node* predecessor) { |
ASSERT(predecessor_ == NULL && predecessor != NULL); |
predecessor_ = predecessor; |
} |
- void AddSuccessor(Node* successor) { |
+ virtual void AddSuccessor(Node* successor) { |
ASSERT(successor1_ == NULL && successor != NULL); |
if (successor0_ == NULL) { |
successor0_ = successor; |
@@ -367,15 +378,15 @@ class BranchNode: public Node { |
} |
} |
- void Traverse(bool mark, |
- ZoneList<Node*>* preorder, |
- ZoneList<Node*>* postorder); |
+ virtual void Traverse(bool mark, |
+ ZoneList<Node*>* preorder, |
+ ZoneList<Node*>* postorder); |
- void ComputeRDOut(BitVector* result); |
- void UpdateRDIn(WorkList<Node>* worklist, bool mark); |
+ virtual void ComputeRDOut(BitVector* result); |
+ virtual void UpdateRDIn(WorkList<Node>* worklist, bool mark); |
#ifdef DEBUG |
- void PrintText(); |
+ virtual void PrintText(); |
#endif |
private: |
@@ -397,27 +408,27 @@ class JoinNode: public Node { |
return reinterpret_cast<JoinNode*>(node); |
} |
- bool IsJoinNode() { return true; } |
+ virtual bool IsJoinNode() { return true; } |
- void AddPredecessor(Node* predecessor) { |
+ virtual void AddPredecessor(Node* predecessor) { |
ASSERT(predecessor != NULL); |
predecessors_.Add(predecessor); |
} |
- void AddSuccessor(Node* successor) { |
+ virtual void AddSuccessor(Node* successor) { |
ASSERT(successor_ == NULL && successor != NULL); |
successor_ = successor; |
} |
- void Traverse(bool mark, |
- ZoneList<Node*>* preorder, |
- ZoneList<Node*>* postorder); |
+ virtual void Traverse(bool mark, |
+ ZoneList<Node*>* preorder, |
+ ZoneList<Node*>* postorder); |
- void ComputeRDOut(BitVector* result); |
- void UpdateRDIn(WorkList<Node>* worklist, bool mark); |
+ virtual void ComputeRDOut(BitVector* result); |
+ virtual void UpdateRDIn(WorkList<Node>* worklist, bool mark); |
#ifdef DEBUG |
- void PrintText(); |
+ virtual void PrintText(); |
#endif |
private: |
@@ -499,6 +510,7 @@ class FlowGraphBuilder: public AstVisitor { |
void Build(FunctionLiteral* lit); |
FlowGraph* graph() { return &graph_; } |
+ ZoneList<Node*>* preorder() { return &preorder_; } |
ZoneList<Node*>* postorder() { return &postorder_; } |
ZoneList<Expression*>* body_definitions() { return &body_definitions_; } |
@@ -622,7 +634,6 @@ class ReachingDefinitions BASE_EMBEDDED { |
}; |
- |
class TypeAnalyzer BASE_EMBEDDED { |
public: |
TypeAnalyzer(ZoneList<Node*>* postorder, |
@@ -645,8 +656,16 @@ class TypeAnalyzer BASE_EMBEDDED { |
ZoneList<Expression*>* body_definitions_; |
int variable_count_; |
int param_count_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TypeAnalyzer); |
}; |
+ |
+void MarkLiveCode(ZoneList<Node*>* nodes, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count); |
+ |
+ |
} } // namespace v8::internal |