Index: src/data-flow.cc |
diff --git a/src/data-flow.cc b/src/data-flow.cc |
index e327c5755dc7cfb22ed30dc7c455b9962976eb2f..fe4b3db00e1e6bf1dddf19e53a5e42ae25545171 100644 |
--- a/src/data-flow.cc |
+++ b/src/data-flow.cc |
@@ -1663,9 +1663,16 @@ void BlockNode::PrintText() { |
PrintF("L%d: Block\n", number()); |
TextInstructionPrinter printer; |
for (int i = 0, len = instructions_.length(); i < len; i++) { |
+ AstNode* instr = instructions_[i]; |
+ // Print a star next to dead instructions. |
+ if (instr->AsExpression() != NULL && instr->AsExpression()->is_live()) { |
+ PrintF(" "); |
+ } else { |
+ PrintF("* "); |
+ } |
PrintF("%d ", printer.NextNumber()); |
- printer.Visit(instructions_[i]); |
- printer.AssignNumber(instructions_[i]); |
+ printer.Visit(instr); |
+ printer.AssignNumber(instr); |
PrintF("\n"); |
} |
PrintF("goto L%d\n\n", successor_->number()); |
@@ -1753,7 +1760,7 @@ void BlockNode::InitializeReachingDefinitions(int definition_count, |
for (int i = 0; i < instruction_count; i++) { |
Expression* expr = instructions_[i]->AsExpression(); |
if (expr == NULL) continue; |
- Variable* var = expr->AssignedVar(); |
+ Variable* var = expr->AssignedVariable(); |
if (var == NULL || !var->IsStackAllocated()) continue; |
// All definitions of this variable are killed. |
@@ -1930,7 +1937,7 @@ void BlockNode::PropagateReachingDefinitions(List<BitVector*>* variables) { |
// It may instead (or also) be a definition. If so update the running |
// value of reaching definitions for the block. |
- Variable* var = expr->AssignedVar(); |
+ Variable* var = expr->AssignedVariable(); |
if (var == NULL || !var->IsStackAllocated()) continue; |
// All definitions of this variable are killed. |
@@ -1961,7 +1968,7 @@ void ReachingDefinitions::Compute() { |
for (int i = 0, len = body_definitions_->length(); i < len; i++) { |
// Account for each definition in the body as a definition of the |
// defined variable. |
- Variable* var = body_definitions_->at(i)->AssignedVar(); |
+ Variable* var = body_definitions_->at(i)->AssignedVariable(); |
variables[IndexFor(var, variable_count_)]->Add(i + variable_count_); |
} |
@@ -2046,4 +2053,50 @@ void TypeAnalyzer::Compute() { |
} |
+void Node::MarkCriticalInstructions( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count) { |
+} |
+ |
+ |
+void BlockNode::MarkCriticalInstructions( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count) { |
+ for (int i = instructions_.length() - 1; i >= 0; i--) { |
+ // Only expressions can appear in the flow graph for now. |
+ Expression* expr = instructions_[i]->AsExpression(); |
+ if (expr != NULL && !expr->is_live() && |
+ (expr->is_loop_condition() || expr->IsCritical())) { |
+ expr->mark_as_live(); |
+ expr->ProcessNonLiveChildren(stack, body_definitions, variable_count); |
+ } |
+ } |
+} |
+ |
+ |
+void MarkLiveCode(ZoneList<Node*>* nodes, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count) { |
+ List<AstNode*> stack(20); |
+ |
+ // Mark the critical AST nodes as live; mark their dependencies and |
+ // add them to the marking stack. |
+ for (int i = nodes->length() - 1; i >= 0; i--) { |
+ nodes->at(i)->MarkCriticalInstructions(&stack, body_definitions, |
+ variable_count); |
+ } |
+ |
+ // Continue marking dependencies until no more. |
+ while (!stack.is_empty()) { |
+ // Only expressions can appear in the flow graph for now. |
+ Expression* expr = stack.RemoveLast()->AsExpression(); |
+ if (expr != NULL) { |
+ expr->ProcessNonLiveChildren(&stack, body_definitions, variable_count); |
+ } |
+ } |
+} |
+ |
+ |
} } // namespace v8::internal |