[turbofan] Preserve Bounds when cloning nodes in the scheduler.
authorbmeurer <bmeurer@chromium.org>
Fri, 19 Jun 2015 14:02:28 +0000 (07:02 -0700)
committerCommit bot <commit-bot@chromium.org>
Fri, 19 Jun 2015 14:02:36 +0000 (14:02 +0000)
R=jarin@chromium.org

Review URL: https://codereview.chromium.org/1196613003

Cr-Commit-Position: refs/heads/master@{#29149}

src/compiler/graph.cc
src/compiler/graph.h
src/compiler/node.cc
src/compiler/node.h
src/compiler/scheduler.cc

index 327fb58..00074b5 100644 (file)
@@ -51,6 +51,14 @@ Node* Graph::NewNode(const Operator* op, int input_count, Node** inputs,
 }
 
 
+Node* Graph::CloneNode(const Node* node) {
+  DCHECK_NOT_NULL(node);
+  Node* const clone = Node::Clone(zone(), NextNodeId(), node);
+  Decorate(clone);
+  return clone;
+}
+
+
 NodeId Graph::NextNodeId() {
   NodeId const id = next_node_id_;
   CHECK(!base::bits::UnsignedAddOverflow32(id, 1, &next_node_id_));
index 44258fe..cb073b3 100644 (file)
@@ -80,6 +80,9 @@ class Graph : public ZoneObject {
     return NewNode(op, arraysize(nodes), nodes);
   }
 
+  // Clone the {node}, and assign a new node id to the copy.
+  Node* CloneNode(const Node* node);
+
   template <class Visitor>
   inline void VisitNodeInputsFromEnd(Visitor* visitor);
 
index f38fb95..e92dccc 100644 (file)
@@ -50,7 +50,7 @@ void Node::OutOfLineInputs::ExtractFrom(Use* old_use_ptr, Node** old_input_ptr,
 
 
 Node* Node::New(Zone* zone, NodeId id, const Operator* op, int input_count,
-                Node** inputs, bool has_extensible_inputs) {
+                Node* const* inputs, bool has_extensible_inputs) {
   Node** input_ptr;
   Use* use_ptr;
   Node* node;
@@ -106,6 +106,17 @@ Node* Node::New(Zone* zone, NodeId id, const Operator* op, int input_count,
 }
 
 
+Node* Node::Clone(Zone* zone, NodeId id, const Node* node) {
+  int const input_count = node->InputCount();
+  Node* const* const inputs = node->has_inline_inputs()
+                                  ? node->inputs_.inline_
+                                  : node->inputs_.outline_->inputs_;
+  Node* const clone = New(zone, id, node->op(), input_count, inputs, false);
+  clone->set_bounds(node->bounds());
+  return clone;
+}
+
+
 void Node::Kill() {
   DCHECK_NOT_NULL(op());
   NullAllInputs();
index 08b775c..6557635 100644 (file)
@@ -42,7 +42,8 @@ typedef uint32_t NodeId;
 class Node final {
  public:
   static Node* New(Zone* zone, NodeId id, const Operator* op, int input_count,
-                   Node** inputs, bool has_extensible_inputs);
+                   Node* const* inputs, bool has_extensible_inputs);
+  static Node* Clone(Zone* zone, NodeId id, const Node* node);
 
   bool IsDead() const { return InputCount() > 0 && !InputAt(0); }
   void Kill();
@@ -284,7 +285,7 @@ class Node final {
   void* operator new(size_t, void* location) { return location; }
 
   // Only NodeProperties should manipulate the bounds.
-  Bounds bounds() { return bounds_; }
+  Bounds bounds() const { return bounds_; }
   void set_bounds(Bounds b) { bounds_ = b; }
 
   // Only NodeMarkers should manipulate the marks on nodes.
index 862969e..aa9a7cf 100644 (file)
@@ -1580,13 +1580,11 @@ class ScheduleLateNodeVisitor {
 
   Node* CloneNode(Node* node) {
     int const input_count = node->InputCount();
-    Node** const inputs = scheduler_->zone_->NewArray<Node*>(input_count);
     for (int index = 0; index < input_count; ++index) {
       Node* const input = node->InputAt(index);
       scheduler_->IncrementUnscheduledUseCount(input, index, node);
-      inputs[index] = input;
     }
-    Node* copy = scheduler_->graph_->NewNode(node->op(), input_count, inputs);
+    Node* const copy = scheduler_->graph_->CloneNode(node);
     TRACE(("clone #%d:%s -> #%d\n"), node->id(), node->op()->mnemonic(),
           copy->id());
     scheduler_->node_data_.resize(copy->id() + 1,