Revision: 23804
Author:   [email protected]
Date:     Tue Sep  9 13:20:09 2014 UTC
Log:      Add copy support in inliner.

Refactors JSGraph to ensure that the zone operators are created in
can be different from the Graph's zone.

[email protected]

Review URL: https://codereview.chromium.org/553873002
https://code.google.com/p/v8/source/detail?r=23804

Modified:
 /branches/bleeding_edge/src/compiler/change-lowering-unittest.cc
 /branches/bleeding_edge/src/compiler/generic-graph.h
 /branches/bleeding_edge/src/compiler/js-graph.h
 /branches/bleeding_edge/src/compiler/js-inlining.cc
 /branches/bleeding_edge/src/compiler/machine-operator-reducer-unittest.cc
 /branches/bleeding_edge/src/compiler/pipeline.cc
/branches/bleeding_edge/src/compiler/simplified-operator-reducer-unittest.cc
 /branches/bleeding_edge/test/cctest/compiler/test-changes-lowering.cc
 /branches/bleeding_edge/test/cctest/compiler/test-js-constant-cache.cc
/branches/bleeding_edge/test/cctest/compiler/test-js-context-specialization.cc
 /branches/bleeding_edge/test/cctest/compiler/test-js-typed-lowering.cc
/branches/bleeding_edge/test/cctest/compiler/test-machine-operator-reducer.cc
 /branches/bleeding_edge/test/cctest/compiler/test-representation-change.cc
 /branches/bleeding_edge/test/cctest/compiler/test-simplified-lowering.cc

=======================================
--- /branches/bleeding_edge/src/compiler/change-lowering-unittest.cc Fri Sep 5 11:47:46 2014 UTC +++ /branches/bleeding_edge/src/compiler/change-lowering-unittest.cc Tue Sep 9 13:20:09 2014 UTC
@@ -74,10 +74,12 @@

   Reduction Reduce(Node* node) {
     Typer typer(zone());
-    JSGraph jsgraph(graph(), common(), &typer);
+    MachineOperatorBuilder machine(zone(), WordRepresentation());
+    JSOperatorBuilder javascript(zone());
+    JSGraph jsgraph(graph(), common(), &javascript, &typer, &machine);
     CompilationInfo info(isolate(), zone());
     Linkage linkage(&info);
-    MachineOperatorBuilder machine(zone(), WordRepresentation());
+
     ChangeLowering reducer(&jsgraph, &linkage, &machine);
     return reducer.Reduce(node);
   }
=======================================
--- /branches/bleeding_edge/src/compiler/generic-graph.h Wed Aug 20 13:05:03 2014 UTC +++ /branches/bleeding_edge/src/compiler/generic-graph.h Tue Sep 9 13:20:09 2014 UTC
@@ -22,7 +22,6 @@

   NodeId NextNodeID() { return next_node_id_++; }
   NodeId NodeCount() const { return next_node_id_; }
-  void SetNextNodeId(NodeId next) { next_node_id_ = next; }

  private:
   Zone* zone_;
=======================================
--- /branches/bleeding_edge/src/compiler/js-graph.h Thu Sep 4 13:45:05 2014 UTC +++ /branches/bleeding_edge/src/compiler/js-graph.h Tue Sep 9 13:20:09 2014 UTC
@@ -9,6 +9,7 @@
 #include "src/compiler/common-operator.h"
 #include "src/compiler/graph.h"
 #include "src/compiler/js-operator.h"
+#include "src/compiler/machine-operator.h"
 #include "src/compiler/node-properties.h"

 namespace v8 {
@@ -22,11 +23,14 @@
 // constants, and various helper methods.
 class JSGraph : public ZoneObject {
  public:
-  JSGraph(Graph* graph, CommonOperatorBuilder* common, Typer* typer)
+  JSGraph(Graph* graph, CommonOperatorBuilder* common,
+          JSOperatorBuilder* javascript, Typer* typer,
+          MachineOperatorBuilder* machine)
       : graph_(graph),
         common_(common),
-        javascript_(zone()),
+        javascript_(javascript),
         typer_(typer),
+        machine_(machine),
         cache_(zone()) {}

   // Canonicalized global constants.
@@ -73,8 +77,9 @@
     return Constant(immediate);
   }

-  JSOperatorBuilder* javascript() { return &javascript_; }
+  JSOperatorBuilder* javascript() { return javascript_; }
   CommonOperatorBuilder* common() { return common_; }
+  MachineOperatorBuilder* machine() { return machine_; }
   Graph* graph() { return graph_; }
   Zone* zone() { return graph()->zone(); }
   Isolate* isolate() { return zone()->isolate(); }
@@ -82,8 +87,9 @@
  private:
   Graph* graph_;
   CommonOperatorBuilder* common_;
-  JSOperatorBuilder javascript_;
+  JSOperatorBuilder* javascript_;
   Typer* typer_;
+  MachineOperatorBuilder* machine_;

   SetOncePointer<Node> c_entry_stub_constant_;
   SetOncePointer<Node> undefined_constant_;
=======================================
--- /branches/bleeding_edge/src/compiler/js-inlining.cc Mon Sep 8 09:16:11 2014 UTC +++ /branches/bleeding_edge/src/compiler/js-inlining.cc Tue Sep 9 13:20:09 2014 UTC
@@ -67,14 +67,9 @@
 // A facade on a JSFunction's graph to facilitate inlining. It assumes the
 // that the function graph has only one return statement, and provides
 // {UnifyReturn} to convert a function graph to that end.
-// InlineAtCall will create some new nodes using {graph}'s builders (and hence
-// those nodes will live in {graph}'s zone.
 class Inlinee {
  public:
-  explicit Inlinee(JSGraph* graph) : jsgraph_(graph) {}
-
-  Graph* graph() { return jsgraph_->graph(); }
-  JSGraph* jsgraph() { return jsgraph_; }
+  Inlinee(Node* start, Node* end) : start_(start), end_(end) {}

   // Returns the last regular control node, that is
   // the last control node before the end node.
@@ -92,24 +87,25 @@
   }
   // Return the unique return statement of the graph.
   Node* unique_return() {
-    Node* unique_return =
-        NodeProperties::GetControlInput(jsgraph_->graph()->end());
+    Node* unique_return = NodeProperties::GetControlInput(end_);
     DCHECK_EQ(IrOpcode::kReturn, unique_return->opcode());
     return unique_return;
   }
   // Inline this graph at {call}, use {jsgraph} and its zone to create
   // any new nodes.
   void InlineAtCall(JSGraph* jsgraph, Node* call);
+
   // Ensure that only a single return reaches the end node.
-  void UnifyReturn();
+  static void UnifyReturn(JSGraph* jsgraph);

  private:
-  JSGraph* jsgraph_;
+  Node* start_;
+  Node* end_;
 };


-void Inlinee::UnifyReturn() {
-  Graph* graph = jsgraph_->graph();
+void Inlinee::UnifyReturn(JSGraph* jsgraph) {
+  Graph* graph = jsgraph->graph();

   Node* final_merge = NodeProperties::GetControlInput(graph->end(), 0);
   if (final_merge->opcode() == IrOpcode::kReturn) {
@@ -120,11 +116,11 @@

   int predecessors =
       OperatorProperties::GetControlInputCount(final_merge->op());
-  Operator* op_phi = jsgraph_->common()->Phi(kMachAnyTagged, predecessors);
-  Operator* op_ephi = jsgraph_->common()->EffectPhi(predecessors);
+  Operator* op_phi = jsgraph->common()->Phi(kMachAnyTagged, predecessors);
+  Operator* op_ephi = jsgraph->common()->EffectPhi(predecessors);

-  NodeVector values(jsgraph_->zone());
-  NodeVector effects(jsgraph_->zone());
+  NodeVector values(jsgraph->zone());
+  NodeVector effects(jsgraph->zone());
   // Iterate over all control flow predecessors,
   // which must be return statements.
   InputIter iter = final_merge->inputs().begin();
@@ -150,14 +146,81 @@
   Node* ephi = graph->NewNode(op_ephi, static_cast<int>(effects.size()),
                               &effects.front());
   Node* new_return =
-      graph->NewNode(jsgraph_->common()->Return(), phi, ephi, final_merge);
+      graph->NewNode(jsgraph->common()->Return(), phi, ephi, final_merge);
   graph->end()->ReplaceInput(0, new_return);
 }


+class CopyVisitor : public NullNodeVisitor {
+ public:
+  CopyVisitor(Graph* source_graph, Graph* target_graph, Zone* temp_zone)
+      : copies_(source_graph->NodeCount(), NULL, temp_zone),
+        sentinels_(source_graph->NodeCount(), NULL, temp_zone),
+        source_graph_(source_graph),
+        target_graph_(target_graph),
+        temp_zone_(temp_zone),
+        sentinel_op_(IrOpcode::kDead, Operator::kNoProperties, 0, 0,
+                     "sentinel") {}
+
+  GenericGraphVisit::Control Post(Node* original) {
+    NodeVector inputs(temp_zone_);
+    for (InputIter it = original->inputs().begin();
+         it != original->inputs().end(); ++it) {
+      inputs.push_back(GetCopy(*it));
+    }
+
+    // Reuse the operator in the copy. This assumes that op lives in a zone
+    // that lives longer than graph()'s zone.
+    Node* copy =
+ target_graph_->NewNode(original->op(), inputs.size(), &inputs.front());
+    copies_[original->id()] = copy;
+    return GenericGraphVisit::CONTINUE;
+  }
+
+  Node* GetCopy(Node* original) {
+    Node* copy = copies_[original->id()];
+    if (copy == NULL) {
+      copy = GetSentinel(original);
+    }
+    return copy;
+  }
+
+  void CopyGraph() {
+    source_graph_->VisitNodeInputsFromEnd(this);
+    ReplaceSentinels();
+  }
+
+  const NodeVector& copies() { return copies_; }
+
+ private:
+  void ReplaceSentinels() {
+    for (int id = 0; id < source_graph_->NodeCount(); ++id) {
+      Node* sentinel = sentinels_[id];
+      if (sentinel == NULL) continue;
+      Node* copy = copies_[id];
+      DCHECK_NE(NULL, copy);
+      sentinel->ReplaceUses(copy);
+    }
+  }
+
+  Node* GetSentinel(Node* original) {
+    Node* sentinel = sentinels_[original->id()];
+    if (sentinel == NULL) {
+      sentinel = target_graph_->NewNode(&sentinel_op_);
+    }
+    return sentinel;
+  }
+
+  NodeVector copies_;
+  NodeVector sentinels_;
+  Graph* source_graph_;
+  Graph* target_graph_;
+  Zone* temp_zone_;
+  SimpleOperator sentinel_op_;
+};
+
+
 void Inlinee::InlineAtCall(JSGraph* jsgraph, Node* call) {
-  MachineOperatorBuilder machine(jsgraph->zone());
-
// The scheduler is smart enough to place our code; we just ensure {control}
   // becomes the control input of the start of the inlinee.
   Node* control = NodeProperties::GetControlInput(call);
@@ -166,21 +229,22 @@
// also be the effect dependency for the inlinee as it produces an effect.
   // TODO(sigurds) Use simplified load once it is ready.
   Node* context = jsgraph->graph()->NewNode(
-      machine.Load(kMachAnyTagged), NodeProperties::GetValueInput(call, 0),
+      jsgraph->machine()->Load(kMachAnyTagged),
+      NodeProperties::GetValueInput(call, 0),
       jsgraph->Int32Constant(JSFunction::kContextOffset - kHeapObjectTag),
       NodeProperties::GetEffectInput(call));

   // {inlinee_inputs} counts JSFunction, Receiver, arguments, context,
   // but not effect, control.
-  int inlinee_inputs = graph()->start()->op()->OutputCount();
+  int inlinee_inputs = start_->op()->OutputCount();
   // Context is last argument.
   int inlinee_context_index = inlinee_inputs - 1;
   // {inliner_inputs} counts JSFunction, Receiver, arguments, but not
   // context, effect, control.
   int inliner_inputs = OperatorProperties::GetValueInputCount(call->op());
   // Iterate over all uses of the start node.
-  UseIter iter = graph()->start()->uses().begin();
-  while (iter != graph()->start()->uses().end()) {
+  UseIter iter = start_->uses().begin();
+  while (iter != start_->uses().end()) {
     Node* use = *iter;
     switch (use->opcode()) {
       case IrOpcode::kParameter: {
@@ -234,10 +298,10 @@
 }


-void JSInliner::TryInlineCall(Node* node) {
-  DCHECK_EQ(IrOpcode::kJSCallFunction, node->opcode());
+void JSInliner::TryInlineCall(Node* call) {
+  DCHECK_EQ(IrOpcode::kJSCallFunction, call->opcode());

-  HeapObjectMatcher<JSFunction> match(node->InputAt(0));
+  HeapObjectMatcher<JSFunction> match(call->InputAt(0));
   if (!match.HasValue()) {
     return;
   }
@@ -275,21 +339,20 @@
            info_->shared_info()->DebugName()->ToCString().get());
   }

-  Graph graph(info_->zone());
-  graph.SetNextNodeId(jsgraph_->graph()->NextNodeID());
-
-  Typer typer(info_->zone());
-  CommonOperatorBuilder common(info_->zone());
-  JSGraph jsgraph(&graph, &common, &typer);
+  Graph graph(info.zone());
+  Typer typer(info.zone());
+ JSGraph jsgraph(&graph, jsgraph_->common(), jsgraph_->javascript(), &typer,
+                  jsgraph_->machine());

   AstGraphBuilder graph_builder(&info, &jsgraph);
   graph_builder.CreateGraph();
+  Inlinee::UnifyReturn(&jsgraph);

-  Inlinee inlinee(&jsgraph);
-  inlinee.UnifyReturn();
-  inlinee.InlineAtCall(jsgraph_, node);
+  CopyVisitor visitor(&graph, jsgraph_->graph(), info.zone());
+  visitor.CopyGraph();

-  jsgraph_->graph()->SetNextNodeId(inlinee.graph()->NextNodeID());
+ Inlinee inlinee(visitor.GetCopy(graph.start()), visitor.GetCopy(graph.end()));
+  inlinee.InlineAtCall(jsgraph_, call);
 }
 }
 }
=======================================
--- /branches/bleeding_edge/src/compiler/machine-operator-reducer-unittest.cc Mon Sep 8 09:11:11 2014 UTC +++ /branches/bleeding_edge/src/compiler/machine-operator-reducer-unittest.cc Tue Sep 9 13:20:09 2014 UTC
@@ -20,7 +20,8 @@
  protected:
   Reduction Reduce(Node* node) {
     Typer typer(zone());
-    JSGraph jsgraph(graph(), common(), &typer);
+    JSOperatorBuilder javascript(zone());
+    JSGraph jsgraph(graph(), common(), &javascript, &typer, &machine_);
     MachineOperatorReducer reducer(&jsgraph);
     return reducer.Reduce(node);
   }
=======================================
--- /branches/bleeding_edge/src/compiler/pipeline.cc Fri Sep 5 15:01:51 2014 UTC +++ /branches/bleeding_edge/src/compiler/pipeline.cc Tue Sep 9 13:20:09 2014 UTC
@@ -170,7 +170,9 @@
   // typer could sweep over later.
   Typer typer(zone());
   CommonOperatorBuilder common(zone());
-  JSGraph jsgraph(&graph, &common, &typer);
+  JSOperatorBuilder javascript(zone());
+  MachineOperatorBuilder machine(zone());
+  JSGraph jsgraph(&graph, &common, &javascript, &typer, &machine);
   Node* context_node;
   {
     PhaseStats graph_builder_stats(info(), PhaseStats::CREATE_GRAPH,
@@ -256,7 +258,6 @@
       SourcePositionTable::Scope pos(&source_positions,
                                      SourcePosition::Unknown());
       Linkage linkage(info());
-      MachineOperatorBuilder machine(zone());
       ValueNumberingReducer vn_reducer(zone());
       SimplifiedOperatorReducer simple_reducer(&jsgraph, &machine);
       ChangeLowering lowering(&jsgraph, &linkage, &machine);
@@ -281,7 +282,6 @@
                                 "generic lowering");
       SourcePositionTable::Scope pos(&source_positions,
                                      SourcePosition::Unknown());
-      MachineOperatorBuilder machine(zone());
       JSGenericLowering lowering(info(), &jsgraph, &machine);
       GraphReducer graph_reducer(&graph);
       graph_reducer.AddReducer(&lowering);
=======================================
--- /branches/bleeding_edge/src/compiler/simplified-operator-reducer-unittest.cc Mon Sep 8 09:11:11 2014 UTC +++ /branches/bleeding_edge/src/compiler/simplified-operator-reducer-unittest.cc Tue Sep 9 13:20:09 2014 UTC
@@ -23,7 +23,8 @@
   Reduction Reduce(Node* node) {
     Typer typer(zone());
     MachineOperatorBuilder machine(zone());
-    JSGraph jsgraph(graph(), common(), &typer);
+    JSOperatorBuilder javascript(zone());
+    JSGraph jsgraph(graph(), common(), &javascript, &typer, &machine);
     SimplifiedOperatorReducer reducer(&jsgraph, &machine);
     return reducer.Reduce(node);
   }
=======================================
--- /branches/bleeding_edge/test/cctest/compiler/test-changes-lowering.cc Thu Sep 4 10:23:51 2014 UTC +++ /branches/bleeding_edge/test/cctest/compiler/test-changes-lowering.cc Tue Sep 9 13:20:09 2014 UTC
@@ -31,10 +31,13 @@
   explicit ChangesLoweringTester(MachineType p0 = kMachNone)
       : GraphBuilderTester<ReturnType>(p0),
         typer(this->zone()),
-        jsgraph(this->graph(), this->common(), &typer),
+        javascript(this->zone()),
+        jsgraph(this->graph(), this->common(), &javascript, &typer,
+                this->machine()),
         function(Handle<JSFunction>::null()) {}

   Typer typer;
+  JSOperatorBuilder javascript;
   JSGraph jsgraph;
   Handle<JSFunction> function;

=======================================
--- /branches/bleeding_edge/test/cctest/compiler/test-js-constant-cache.cc Mon Sep 8 09:16:11 2014 UTC +++ /branches/bleeding_edge/test/cctest/compiler/test-js-constant-cache.cc Tue Sep 9 13:20:09 2014 UTC
@@ -17,10 +17,16 @@
 class JSCacheTesterHelper {
  protected:
   explicit JSCacheTesterHelper(Zone* zone)
-      : main_graph_(zone), main_common_(zone), main_typer_(zone) {}
+      : main_graph_(zone),
+        main_common_(zone),
+        main_javascript_(zone),
+        main_typer_(zone),
+        main_machine_(zone) {}
   Graph main_graph_;
   CommonOperatorBuilder main_common_;
+  JSOperatorBuilder main_javascript_;
   Typer main_typer_;
+  MachineOperatorBuilder main_machine_;
 };


@@ -30,7 +36,8 @@
  public:
   JSConstantCacheTester()
       : JSCacheTesterHelper(main_zone()),
-        JSGraph(&main_graph_, &main_common_, &main_typer_) {}
+ JSGraph(&main_graph_, &main_common_, &main_javascript_, &main_typer_,
+                &main_machine_) {}

   Type* upper(Node* node) { return NodeProperties::GetBounds(node).upper; }

=======================================
--- /branches/bleeding_edge/test/cctest/compiler/test-js-context-specialization.cc Mon Sep 8 09:16:11 2014 UTC +++ /branches/bleeding_edge/test/cctest/compiler/test-js-context-specialization.cc Tue Sep 9 13:20:09 2014 UTC
@@ -22,9 +22,10 @@
       : DirectGraphBuilder(new (main_zone()) Graph(main_zone())),
         common_(main_zone()),
         javascript_(main_zone()),
+        machine_(main_zone()),
         simplified_(main_zone()),
         typer_(main_zone()),
-        jsgraph_(graph(), common(), &typer_),
+        jsgraph_(graph(), common(), &javascript_, &typer_, &machine_),
         info_(main_isolate(), main_zone()) {}

   Factory* factory() { return main_isolate()->factory(); }
@@ -37,6 +38,7 @@
  private:
   CommonOperatorBuilder common_;
   JSOperatorBuilder javascript_;
+  MachineOperatorBuilder machine_;
   SimplifiedOperatorBuilder simplified_;
   Typer typer_;
   JSGraph jsgraph_;
=======================================
--- /branches/bleeding_edge/test/cctest/compiler/test-js-typed-lowering.cc Mon Sep 8 09:16:11 2014 UTC +++ /branches/bleeding_edge/test/cctest/compiler/test-js-typed-lowering.cc Tue Sep 9 13:20:09 2014 UTC
@@ -50,7 +50,7 @@
   }

   Node* reduce(Node* node) {
-    JSGraph jsgraph(&graph, &common, &typer);
+    JSGraph jsgraph(&graph, &common, &javascript, &typer, &machine);
     JSTypedLowering reducer(&jsgraph);
     Reduction reduction = reducer.Reduce(node);
     if (reduction.Changed()) return reduction.replacement();
=======================================
--- /branches/bleeding_edge/test/cctest/compiler/test-machine-operator-reducer.cc Mon Sep 8 09:16:11 2014 UTC +++ /branches/bleeding_edge/test/cctest/compiler/test-machine-operator-reducer.cc Tue Sep 9 13:20:09 2014 UTC
@@ -55,8 +55,9 @@
         machine(main_zone()),
         common(main_zone()),
         graph(main_zone()),
+        javascript(main_zone()),
         typer(main_zone()),
-        jsgraph(&graph, &common, &typer),
+        jsgraph(&graph, &common, &javascript, &typer, &machine),
         maxuint32(Constant<int32_t>(kMaxUInt32)) {
     Node* s = graph.NewNode(common.Start(num_parameters));
     graph.SetStart(s);
@@ -68,6 +69,7 @@
   MachineOperatorBuilder machine;
   CommonOperatorBuilder common;
   Graph graph;
+  JSOperatorBuilder javascript;
   Typer typer;
   JSGraph jsgraph;
   Node* maxuint32;
=======================================
--- /branches/bleeding_edge/test/cctest/compiler/test-representation-change.cc Mon Sep 8 09:16:11 2014 UTC +++ /branches/bleeding_edge/test/cctest/compiler/test-representation-change.cc Tue Sep 9 13:20:09 2014 UTC
@@ -25,13 +25,16 @@
   explicit RepresentationChangerTester(int num_parameters = 0)
       : GraphAndBuilders(main_zone()),
         typer_(main_zone()),
-        jsgraph_(main_graph_, &main_common_, &typer_),
+        javascript_(main_zone()),
+        jsgraph_(main_graph_, &main_common_, &javascript_, &typer_,
+                 &main_machine_),
changer_(&jsgraph_, &main_simplified_, &main_machine_, main_isolate()) {
     Node* s = graph()->NewNode(common()->Start(num_parameters));
     graph()->SetStart(s);
   }

   Typer typer_;
+  JSOperatorBuilder javascript_;
   JSGraph jsgraph_;
   RepresentationChanger changer_;

=======================================
--- /branches/bleeding_edge/test/cctest/compiler/test-simplified-lowering.cc Fri Sep 5 13:22:27 2014 UTC +++ /branches/bleeding_edge/test/cctest/compiler/test-simplified-lowering.cc Tue Sep 9 13:20:09 2014 UTC
@@ -36,10 +36,13 @@
                            MachineType p4 = kMachNone)
       : GraphBuilderTester<ReturnType>(p0, p1, p2, p3, p4),
         typer(this->zone()),
-        jsgraph(this->graph(), this->common(), &typer),
+        javascript(this->zone()),
+        jsgraph(this->graph(), this->common(), &javascript, &typer,
+                this->machine()),
         lowering(&jsgraph) {}

   Typer typer;
+  JSOperatorBuilder javascript;
   JSGraph jsgraph;
   SimplifiedLowering lowering;

@@ -626,6 +629,7 @@
 class TestingGraph : public HandleAndZoneScope, public GraphAndBuilders {
  public:
   Typer typer;
+  JSOperatorBuilder javascript;
   JSGraph jsgraph;
   Node* p0;
   Node* p1;
@@ -636,7 +640,8 @@
   explicit TestingGraph(Type* p0_type, Type* p1_type = Type::None())
       : GraphAndBuilders(main_zone()),
         typer(main_zone()),
-        jsgraph(graph(), common(), &typer) {
+        javascript(main_zone()),
+        jsgraph(graph(), common(), &javascript, &typer, machine()) {
     start = graph()->NewNode(common()->Start(2));
     graph()->SetStart(start);
     ret =

--
--
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