Index: src/compiler/js-context-specialization.cc |
diff --git a/src/compiler/js-context-specialization.cc b/src/compiler/js-context-specialization.cc |
index d11bc6671188e5a6de74ee678fc02f48e46b069b..b2a234be4103966d7ce3eee623f6ed0be4039b53 100644 |
--- a/src/compiler/js-context-specialization.cc |
+++ b/src/compiler/js-context-specialization.cc |
@@ -6,7 +6,6 @@ |
#include "src/compiler/graph-inl.h" |
#include "src/compiler/js-context-specialization.h" |
#include "src/compiler/js-operator.h" |
-#include "src/compiler/node-aux-data-inl.h" |
#include "src/compiler/node-matchers.h" |
#include "src/compiler/node-properties-inl.h" |
@@ -14,45 +13,20 @@ namespace v8 { |
namespace internal { |
namespace compiler { |
-class ContextSpecializationVisitor : public NullNodeVisitor { |
- public: |
- explicit ContextSpecializationVisitor(JSContextSpecializer* spec) |
- : spec_(spec) {} |
- |
- void Post(Node* node) { |
- switch (node->opcode()) { |
- case IrOpcode::kJSLoadContext: { |
- Reduction r = spec_->ReduceJSLoadContext(node); |
- if (r.Changed() && r.replacement() != node) { |
- NodeProperties::ReplaceWithValue(node, r.replacement()); |
- node->RemoveAllInputs(); |
- } |
- break; |
- } |
- case IrOpcode::kJSStoreContext: { |
- Reduction r = spec_->ReduceJSStoreContext(node); |
- if (r.Changed() && r.replacement() != node) { |
- NodeProperties::ReplaceWithValue(node, r.replacement()); |
- node->RemoveAllInputs(); |
- } |
- break; |
- } |
- default: |
- break; |
- } |
- } |
- |
- private: |
- JSContextSpecializer* spec_; |
-}; |
- |
-void JSContextSpecializer::SpecializeToContext() { |
- NodeProperties::ReplaceWithValue(context_, |
- jsgraph_->Constant(info_->context())); |
- |
- ContextSpecializationVisitor visitor(this); |
- jsgraph_->graph()->VisitNodeInputsFromEnd(&visitor); |
+Reduction JSContextSpecializer::Reduce(Node* node) { |
+ if (node == context_) { |
+ Node* constant = jsgraph_->Constant(info_->context()); |
+ NodeProperties::ReplaceWithValue(node, constant); |
+ return Replace(constant); |
+ } |
+ if (node->opcode() == IrOpcode::kJSLoadContext) { |
+ return ReduceJSLoadContext(node); |
+ } |
+ if (node->opcode() == IrOpcode::kJSStoreContext) { |
+ return ReduceJSStoreContext(node); |
+ } |
+ return NoChange(); |
} |
@@ -62,7 +36,7 @@ Reduction JSContextSpecializer::ReduceJSLoadContext(Node* node) { |
HeapObjectMatcher<Context> m(NodeProperties::GetValueInput(node, 0)); |
// If the context is not constant, no reduction can occur. |
if (!m.HasValue()) { |
- return Reducer::NoChange(); |
+ return NoChange(); |
} |
const ContextAccess& access = ContextAccessOf(node->op()); |
@@ -77,14 +51,14 @@ Reduction JSContextSpecializer::ReduceJSLoadContext(Node* node) { |
if (!access.immutable()) { |
// The access does not have to look up a parent, nothing to fold. |
if (access.depth() == 0) { |
- return Reducer::NoChange(); |
+ return NoChange(); |
} |
const Operator* op = jsgraph_->javascript()->LoadContext( |
0, access.index(), access.immutable()); |
node->set_op(op); |
Handle<Object> context_handle = Handle<Object>(context, info_->isolate()); |
node->ReplaceInput(0, jsgraph_->Constant(context_handle)); |
- return Reducer::Changed(node); |
+ return Changed(node); |
} |
Handle<Object> value = Handle<Object>( |
context->get(static_cast<int>(access.index())), info_->isolate()); |
@@ -94,13 +68,15 @@ Reduction JSContextSpecializer::ReduceJSLoadContext(Node* node) { |
// We must be conservative and check if the value in the slot is currently the |
// hole or undefined. If it is neither of these, then it must be initialized. |
if (value->IsUndefined() || value->IsTheHole()) { |
- return Reducer::NoChange(); |
+ return NoChange(); |
} |
// Success. The context load can be replaced with the constant. |
// TODO(titzer): record the specialization for sharing code across multiple |
// contexts that have the same value in the corresponding context slot. |
- return Reducer::Replace(jsgraph_->Constant(value)); |
+ Node* constant = jsgraph_->Constant(value); |
+ NodeProperties::ReplaceWithValue(node, constant); |
+ return Replace(constant); |
} |
@@ -110,14 +86,14 @@ Reduction JSContextSpecializer::ReduceJSStoreContext(Node* node) { |
HeapObjectMatcher<Context> m(NodeProperties::GetValueInput(node, 0)); |
// If the context is not constant, no reduction can occur. |
if (!m.HasValue()) { |
- return Reducer::NoChange(); |
+ return NoChange(); |
} |
const ContextAccess& access = ContextAccessOf(node->op()); |
// The access does not have to look up a parent, nothing to fold. |
if (access.depth() == 0) { |
- return Reducer::NoChange(); |
+ return NoChange(); |
} |
// Find the right parent context. |
@@ -131,7 +107,7 @@ Reduction JSContextSpecializer::ReduceJSStoreContext(Node* node) { |
Handle<Object> new_context_handle = Handle<Object>(context, info_->isolate()); |
node->ReplaceInput(0, jsgraph_->Constant(new_context_handle)); |
- return Reducer::Changed(node); |
+ return Changed(node); |
} |
} // namespace compiler |