Reviewers: Sven Panne,

Description:
[turbofan] Improve memory layout of Node class.

Also gets rid of the reinterpret_cast on this.

[email protected]

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

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

Affected files (+15, -16 lines):
  M src/compiler/node.h
  M src/compiler/node.cc


Index: src/compiler/node.cc
diff --git a/src/compiler/node.cc b/src/compiler/node.cc
index 1486d8a34d2655b3a6367810139d77bac6cbf67a..a4680e4636f1630219fcfc4041e3aef1f260edbf 100644
--- a/src/compiler/node.cc
+++ b/src/compiler/node.cc
@@ -12,15 +12,15 @@ namespace compiler {

 Node* Node::New(Zone* zone, NodeId id, const Operator* op, int input_count,
                 Node** inputs, bool has_extensible_inputs) {
-  size_t node_size = sizeof(Node);
+  size_t node_size = sizeof(Node) - sizeof(Input);
int reserve_input_count = has_extensible_inputs ? kDefaultReservedInputs : 0;
-  size_t inputs_size = (input_count + reserve_input_count) * sizeof(Input);
+  size_t inputs_size = std::max<size_t>(
+ (input_count + reserve_input_count) * sizeof(Input), sizeof(InputDeque*));
   size_t uses_size = input_count * sizeof(Use);
   int size = static_cast<int>(node_size + inputs_size + uses_size);
   void* buffer = zone->New(size);
Node* result = new (buffer) Node(id, op, input_count, reserve_input_count);
-  Input* input =
- reinterpret_cast<Input*>(reinterpret_cast<char*>(buffer) + node_size);
+  Input* input = result->inputs_.static_;
   Use* use =
       reinterpret_cast<Use*>(reinterpret_cast<char*>(input) + inputs_size);

@@ -175,9 +175,7 @@ Node::Node(NodeId id, const Operator* op, int input_count,
                  ReservedInputCountField::encode(reserved_input_count) |
                  HasAppendableInputsField::encode(false)),
       first_use_(nullptr),
-      last_use_(nullptr) {
-  inputs_.static_ = reinterpret_cast<Input*>(this + 1);
-}
+      last_use_(nullptr) {}


 void Node::EnsureAppendableInputs(Zone* zone) {
Index: src/compiler/node.h
diff --git a/src/compiler/node.h b/src/compiler/node.h
index f8b3329d039216dc46cad97a8f114e11813d47e3..ed9c01db90d668dcb9505db9b9661814c68bf215 100644
--- a/src/compiler/node.h
+++ b/src/compiler/node.h
@@ -168,12 +168,13 @@ class Node FINAL {

   inline void EnsureAppendableInputs(Zone* zone);

-  Input* GetInputRecordPtr(int index) const {
-    if (has_appendable_inputs()) {
-      return &((*inputs_.appendable_)[index]);
-    } else {
-      return &inputs_.static_[index];
-    }
+  Input* GetInputRecordPtr(int index) {
+    return has_appendable_inputs() ? &((*inputs_.appendable_)[index])
+                                   : &inputs_.static_[index];
+  }
+  const Input* GetInputRecordPtr(int index) const {
+    return has_appendable_inputs() ? &((*inputs_.appendable_)[index])
+                                   : &inputs_.static_[index];
   }

   inline void AppendUse(Use* const use);
@@ -224,16 +225,16 @@ class Node FINAL {
   Mark mark_;
   NodeId const id_;
   unsigned bit_field_;
+  Use* first_use_;
+  Use* last_use_;
   union {
// When a node is initially allocated, it uses a static buffer to hold its // inputs under the assumption that the number of outputs will not increase. // When the first input is appended, the static buffer is converted into a
     // deque to allow for space-efficient growing.
-    Input* static_;
+    Input static_[1];
     InputDeque* appendable_;
   } inputs_;
-  Use* first_use_;
-  Use* last_use_;

   friend class Edge;
   friend class NodeMarkerBase;


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