Reviewers: titzer,

Description:
[turbofan] Turn JSContextSpecializer into an AdvancedReducer.

This in turn allows usage of AdvancedReducer::ReplaceWithValue which
has access to the underlying graph reducer.

[email protected]

Please review this at https://codereview.chromium.org/1162903006/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+21, -17 lines):
  M src/compiler/js-context-specialization.h
  M src/compiler/js-context-specialization.cc
  M src/compiler/js-inlining.cc
  M src/compiler/pipeline.cc
  M test/cctest/compiler/test-js-context-specialization.cc


Index: src/compiler/js-context-specialization.cc
diff --git a/src/compiler/js-context-specialization.cc b/src/compiler/js-context-specialization.cc index 1bf19ac7d6876017ef4cba9f634f85b0251a4738..a39b66fbc85a002665117d75a26ad20cc7ce8114 100644
--- a/src/compiler/js-context-specialization.cc
+++ b/src/compiler/js-context-specialization.cc
@@ -70,7 +70,7 @@ Reduction JSContextSpecializer::ReduceJSLoadContext(Node* node) { // TODO(titzer): record the specialization for sharing code across multiple
   // contexts that have the same value in the corresponding context slot.
   Node* constant = jsgraph_->Constant(value);
-  NodeProperties::ReplaceWithValue(node, constant);
+  ReplaceWithValue(node, constant);
   return Replace(constant);
 }

Index: src/compiler/js-context-specialization.h
diff --git a/src/compiler/js-context-specialization.h b/src/compiler/js-context-specialization.h index 4a2ce9829ad55c070c6165c6b1c848e72dce74e5..f01ac3f9707e702bb15c1299d5a7d57c7901e7d5 100644
--- a/src/compiler/js-context-specialization.h
+++ b/src/compiler/js-context-specialization.h
@@ -15,9 +15,10 @@ namespace compiler {

// Specializes a given JSGraph to a given context, potentially constant folding
 // some {LoadContext} nodes or strength reducing some {StoreContext} nodes.
-class JSContextSpecializer : public Reducer {
+class JSContextSpecializer : public AdvancedReducer {
  public:
-  explicit JSContextSpecializer(JSGraph* jsgraph) : jsgraph_(jsgraph) {}
+  JSContextSpecializer(Editor* editor, JSGraph* jsgraph)
+      : AdvancedReducer(editor), jsgraph_(jsgraph) {}

   Reduction Reduce(Node* node) override;

Index: src/compiler/js-inlining.cc
diff --git a/src/compiler/js-inlining.cc b/src/compiler/js-inlining.cc
index e587f882bcdec0e2f485630f68be241df4fa3f3b..b26b40502de250ee685c736aea4424f0ba221957 100644
--- a/src/compiler/js-inlining.cc
+++ b/src/compiler/js-inlining.cc
@@ -276,8 +276,8 @@ Reduction JSInliner::Reduce(Node* node) {
   // type feedback in the compiler.
   AstGraphBuilder graph_builder(local_zone_, &info, &jsgraph);
   graph_builder.CreateGraph(true, false);
-  JSContextSpecializer context_specializer(&jsgraph);
   GraphReducer graph_reducer(local_zone_, &graph);
+  JSContextSpecializer context_specializer(&graph_reducer, &jsgraph);
   graph_reducer.AddReducer(&context_specializer);
   graph_reducer.ReduceGraph();

Index: src/compiler/pipeline.cc
diff --git a/src/compiler/pipeline.cc b/src/compiler/pipeline.cc
index 20f3d60daab8cd33f27a6c5d61c3be0fd71a4fc7..e83281453437fe87062e728674be4253a3248c05 100644
--- a/src/compiler/pipeline.cc
+++ b/src/compiler/pipeline.cc
@@ -496,8 +496,8 @@ struct ContextSpecializerPhase {
   static const char* phase_name() { return "context specializing"; }

   void Run(PipelineData* data, Zone* temp_zone) {
-    JSContextSpecializer spec(data->jsgraph());
     JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
+    JSContextSpecializer spec(&graph_reducer, data->jsgraph());
     AddReducer(data, &graph_reducer, &spec);
     graph_reducer.ReduceGraph();
   }
Index: test/cctest/compiler/test-js-context-specialization.cc
diff --git a/test/cctest/compiler/test-js-context-specialization.cc b/test/cctest/compiler/test-js-context-specialization.cc index 7eb50085b6fde35515ce22298d109689074e37f4..6148a12a40f558ec00645a6996adfce886ad625c 100644
--- a/test/cctest/compiler/test-js-context-specialization.cc
+++ b/test/cctest/compiler/test-js-context-specialization.cc
@@ -22,8 +22,11 @@ class ContextSpecializationTester : public HandleAndZoneScope {
         javascript_(main_zone()),
         machine_(main_zone()),
         simplified_(main_zone()),
- jsgraph_(main_isolate(), graph(), common(), &javascript_, &machine_) {} + jsgraph_(main_isolate(), graph(), common(), &javascript_, &machine_),
+        reducer_(main_zone(), graph()),
+        spec_(&reducer_, jsgraph()) {}

+  JSContextSpecializer* spec() { return &spec_; }
   Factory* factory() { return main_isolate()->factory(); }
   CommonOperatorBuilder* common() { return &common_; }
   JSOperatorBuilder* javascript() { return &javascript_; }
@@ -38,6 +41,8 @@ class ContextSpecializationTester : public HandleAndZoneScope {
   MachineOperatorBuilder machine_;
   SimplifiedOperatorBuilder simplified_;
   JSGraph jsgraph_;
+  GraphReducer reducer_;
+  JSContextSpecializer spec_;
 };


@@ -60,13 +65,12 @@ TEST(ReduceJSLoadContext) {
   Node* const_context = t.jsgraph()->Constant(native);
   Node* deep_const_context = t.jsgraph()->Constant(subcontext2);
Node* param_context = t.graph()->NewNode(t.common()->Parameter(0), start);
-  JSContextSpecializer spec(t.jsgraph());

   {
     // Mutable slot, constant context, depth = 0 => do nothing.
Node* load = t.graph()->NewNode(t.javascript()->LoadContext(0, 0, false),
                                     const_context, const_context, start);
-    Reduction r = spec.ReduceJSLoadContext(load);
+    Reduction r = t.spec()->ReduceJSLoadContext(load);
     CHECK(!r.Changed());
   }

@@ -74,7 +78,7 @@ TEST(ReduceJSLoadContext) {
     // Mutable slot, non-constant context, depth = 0 => do nothing.
Node* load = t.graph()->NewNode(t.javascript()->LoadContext(0, 0, false),
                                     param_context, param_context, start);
-    Reduction r = spec.ReduceJSLoadContext(load);
+    Reduction r = t.spec()->ReduceJSLoadContext(load);
     CHECK(!r.Changed());
   }

@@ -83,7 +87,7 @@ TEST(ReduceJSLoadContext) {
     Node* load = t.graph()->NewNode(
t.javascript()->LoadContext(2, Context::GLOBAL_EVAL_FUN_INDEX, false),
         deep_const_context, deep_const_context, start);
-    Reduction r = spec.ReduceJSLoadContext(load);
+    Reduction r = t.spec()->ReduceJSLoadContext(load);
     CHECK(r.Changed());
Node* new_context_input = NodeProperties::GetValueInput(r.replacement(), 0);
     CHECK_EQ(IrOpcode::kHeapConstant, new_context_input->opcode());
@@ -99,7 +103,7 @@ TEST(ReduceJSLoadContext) {
     // Immutable slot, constant context, depth = 0 => specialize.
Node* load = t.graph()->NewNode(t.javascript()->LoadContext(0, slot, true),
                                     const_context, const_context, start);
-    Reduction r = spec.ReduceJSLoadContext(load);
+    Reduction r = t.spec()->ReduceJSLoadContext(load);
     CHECK(r.Changed());
     CHECK(r.replacement() != load);

@@ -132,13 +136,12 @@ TEST(ReduceJSStoreContext) {
   Node* const_context = t.jsgraph()->Constant(native);
   Node* deep_const_context = t.jsgraph()->Constant(subcontext2);
Node* param_context = t.graph()->NewNode(t.common()->Parameter(0), start);
-  JSContextSpecializer spec(t.jsgraph());

   {
     // Mutable slot, constant context, depth = 0 => do nothing.
     Node* load = t.graph()->NewNode(t.javascript()->StoreContext(0, 0),
                                     const_context, const_context, start);
-    Reduction r = spec.ReduceJSStoreContext(load);
+    Reduction r = t.spec()->ReduceJSStoreContext(load);
     CHECK(!r.Changed());
   }

@@ -146,7 +149,7 @@ TEST(ReduceJSStoreContext) {
     // Mutable slot, non-constant context, depth = 0 => do nothing.
     Node* load = t.graph()->NewNode(t.javascript()->StoreContext(0, 0),
                                     param_context, param_context, start);
-    Reduction r = spec.ReduceJSStoreContext(load);
+    Reduction r = t.spec()->ReduceJSStoreContext(load);
     CHECK(!r.Changed());
   }

@@ -154,7 +157,7 @@ TEST(ReduceJSStoreContext) {
     // Immutable slot, constant context, depth = 0 => do nothing.
     Node* load = t.graph()->NewNode(t.javascript()->StoreContext(0, slot),
                                     const_context, const_context, start);
-    Reduction r = spec.ReduceJSStoreContext(load);
+    Reduction r = t.spec()->ReduceJSStoreContext(load);
     CHECK(!r.Changed());
   }

@@ -163,7 +166,7 @@ TEST(ReduceJSStoreContext) {
     Node* load = t.graph()->NewNode(
         t.javascript()->StoreContext(2, Context::GLOBAL_EVAL_FUN_INDEX),
         deep_const_context, deep_const_context, start);
-    Reduction r = spec.ReduceJSStoreContext(load);
+    Reduction r = t.spec()->ReduceJSStoreContext(load);
     CHECK(r.Changed());
Node* new_context_input = NodeProperties::GetValueInput(r.replacement(), 0);
     CHECK_EQ(IrOpcode::kHeapConstant, new_context_input->opcode());
@@ -197,7 +200,6 @@ TEST(SpecializeToContext) {

   Node* const_context = t.jsgraph()->Constant(native);
Node* param_context = t.graph()->NewNode(t.common()->Parameter(0), start);
-  JSContextSpecializer spec(t.jsgraph());

   {
     // Check that specialization replaces values and forwards effects
@@ -232,6 +234,7 @@ TEST(SpecializeToContext) {

     // Perform the reduction on the entire graph.
     GraphReducer graph_reducer(t.main_zone(), t.graph());
+    JSContextSpecializer spec(&graph_reducer, t.jsgraph());
     graph_reducer.AddReducer(&spec);
     graph_reducer.ReduceGraph();



--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to