Index: src/compiler/ast-graph-builder.h |
diff --git a/src/compiler/ast-graph-builder.h b/src/compiler/ast-graph-builder.h |
index 4739e034c8f6faba009a4d603104fb4441cf601c..85d493076ef0ed9a035a2b584c3e2c082e2495fa 100644 |
--- a/src/compiler/ast-graph-builder.h |
+++ b/src/compiler/ast-graph-builder.h |
@@ -7,6 +7,7 @@ |
#include "src/ast.h" |
#include "src/compiler/js-graph.h" |
+#include "src/compiler/liveness-analyzer.h" |
#include "src/compiler/state-values-utils.h" |
namespace v8 { |
@@ -101,6 +102,9 @@ class AstGraphBuilder : public AstVisitor { |
// Cache for StateValues nodes for frame states. |
StateValuesCache state_values_cache_; |
+ // Analyzer of local variable liveness. |
+ LivenessAnalyzer liveness_analyzer_; |
+ |
// Growth increment for the temporary buffer used to construct input lists to |
// new nodes. |
static const int kInputBufferSizeIncrement = 64; |
@@ -121,6 +125,7 @@ class AstGraphBuilder : public AstVisitor { |
Scope* current_scope() const; |
Node* current_context() const; |
Node* exit_control() const { return exit_control_; } |
+ LivenessAnalyzer* liveness_analyzer() { return &liveness_analyzer_; } |
void set_environment(Environment* env) { environment_ = env; } |
void set_ast_context(AstContext* ctx) { ast_context_ = ctx; } |
@@ -212,6 +217,10 @@ class AstGraphBuilder : public AstVisitor { |
// If so, record the stack height into the compilation and return {true}. |
bool CheckOsrEntry(IterationStatement* stmt); |
+ // Computes local variable liveness and replaces dead variables in |
+ // frame states with the undefined values. |
+ void ClearNonLiveSlotsInFrameStates(); |
+ |
// Helper to wrap a Handle<T> into a Unique<T>. |
template <class T> |
Unique<T> MakeUnique(Handle<T> object) { |
@@ -372,26 +381,10 @@ class AstGraphBuilder::Environment : public ZoneObject { |
locals_count_; |
} |
- // Operations on parameter or local variables. The parameter indices are |
- // shifted by 1 (receiver is parameter index -1 but environment index 0). |
- void Bind(Variable* variable, Node* node) { |
- DCHECK(variable->IsStackAllocated()); |
- if (variable->IsParameter()) { |
- values()->at(variable->index() + 1) = node; |
- } else { |
- DCHECK(variable->IsStackLocal()); |
- values()->at(variable->index() + parameters_count_) = node; |
- } |
- } |
- Node* Lookup(Variable* variable) { |
- DCHECK(variable->IsStackAllocated()); |
- if (variable->IsParameter()) { |
- return values()->at(variable->index() + 1); |
- } else { |
- DCHECK(variable->IsStackLocal()); |
- return values()->at(variable->index() + parameters_count_); |
- } |
- } |
+ // Operations on parameter or local variables. |
+ void Bind(Variable* variable, Node* node); |
+ Node* Lookup(Variable* variable); |
+ void MarkAllLocalsLive(); |
Node* Context() const { return contexts_.back(); } |
void PushContext(Node* context) { contexts()->push_back(context); } |
@@ -474,7 +467,7 @@ class AstGraphBuilder::Environment : public ZoneObject { |
// Copies this environment at a loop header control-flow point. |
Environment* CopyForLoop(BitVector* assigned, bool is_osr = false) { |
PrepareForLoop(assigned, is_osr); |
- return Copy(); |
+ return CopyAndShareLiveness(); |
} |
int ContextStackDepth() { return static_cast<int>(contexts_.size()); } |
@@ -483,6 +476,7 @@ class AstGraphBuilder::Environment : public ZoneObject { |
AstGraphBuilder* builder_; |
int parameters_count_; |
int locals_count_; |
+ LivenessAnalyzerBlock* liveness_block_; |
NodeVector values_; |
NodeVector contexts_; |
Node* control_dependency_; |
@@ -491,8 +485,9 @@ class AstGraphBuilder::Environment : public ZoneObject { |
Node* locals_node_; |
Node* stack_node_; |
- explicit Environment(const Environment* copy); |
+ explicit Environment(Environment* copy); |
Environment* Copy() { return new (zone()) Environment(this); } |
+ Environment* CopyAndShareLiveness(); |
void UpdateStateValues(Node** state_values, int offset, int count); |
void UpdateStateValuesWithCache(Node** state_values, int offset, int count); |
Zone* zone() const { return builder_->local_zone(); } |
@@ -501,6 +496,7 @@ class AstGraphBuilder::Environment : public ZoneObject { |
CommonOperatorBuilder* common() { return builder_->common(); } |
NodeVector* values() { return &values_; } |
NodeVector* contexts() { return &contexts_; } |
+ LivenessAnalyzerBlock* liveness_block() { return liveness_block_; } |
// Prepare environment to be used as loop header. |
void PrepareForLoop(BitVector* assigned, bool is_osr = false); |