Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Unified Diff: src/compiler/node.h

Issue 780503002: [turbofan] Initial work on cleaning up the Node class. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/compiler/node.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/node.h
diff --git a/src/compiler/node.h b/src/compiler/node.h
index f98723258578ceeb949e5398a6bccd796ed830b9..2295b7b5e3e9dfba6a161ca8b9c6b768bf26ee16 100644
--- a/src/compiler/node.h
+++ b/src/compiler/node.h
@@ -22,9 +22,11 @@ namespace v8 {
namespace internal {
namespace compiler {
+// Forward declarations.
class Edge;
class Graph;
+
// Marks are used during traversal of the graph to distinguish states of nodes.
// Each node has a mark which is a monotonically increasing integer, and a
// {NodeMarker} has a range of values that indicate states of a node.
@@ -66,22 +68,15 @@ class Node FINAL {
NodeId id() const { return id_; }
- int InputCount() const { return input_count_; }
+ int InputCount() const { return input_count(); }
Node* InputAt(int index) const { return GetInputRecordPtr(index)->to; }
inline void ReplaceInput(int index, Node* new_input);
inline void AppendInput(Zone* zone, Node* new_input);
inline void InsertInput(Zone* zone, int index, Node* new_input);
inline void RemoveInput(int index);
- int UseCount() { return use_count_; }
- Node* UseAt(int index) {
- DCHECK(index < use_count_);
- Use* current = first_use_;
- while (index-- != 0) {
- current = current->next;
- }
- return current->from;
- }
+ int UseCount() const;
+ Node* UseAt(int index) const;
inline void ReplaceUses(Node* replace_to);
template <class UnaryPredicate>
inline void ReplaceUsesIf(UnaryPredicate pred, Node* replace_to);
@@ -175,10 +170,10 @@ class Node FINAL {
void EnsureAppendableInputs(Zone* zone);
Input* GetInputRecordPtr(int index) const {
- if (has_appendable_inputs_) {
+ if (has_appendable_inputs()) {
return &((*inputs_.appendable_)[index]);
} else {
- return inputs_.static_ + index;
+ return &inputs_.static_[index];
}
}
@@ -188,7 +183,7 @@ class Node FINAL {
void* operator new(size_t, void* location) { return location; }
private:
- Node(Graph* graph, int input_count, int reserve_input_count);
+ inline Node(NodeId id, int input_count, int reserve_input_count);
typedef ZoneDeque<Input> InputDeque;
@@ -204,17 +199,39 @@ class Node FINAL {
Mark mark() { return mark_; }
void set_mark(Mark mark) { mark_ = mark; }
- static const int kReservedInputCountBits = 2;
- static const int kMaxReservedInputs = (1 << kReservedInputCountBits) - 1;
- static const int kDefaultReservedInputs = kMaxReservedInputs;
+ int input_count() const { return InputCountField::decode(bit_field_); }
+ void set_input_count(int input_count) {
+ DCHECK_LE(0, input_count);
+ bit_field_ = InputCountField::update(bit_field_, input_count);
+ }
+
+ int reserved_input_count() const {
+ return ReservedInputCountField::decode(bit_field_);
+ }
+ void set_reserved_input_count(int reserved_input_count) {
+ DCHECK_LE(0, reserved_input_count);
+ bit_field_ =
+ ReservedInputCountField::update(bit_field_, reserved_input_count);
+ }
+
+ bool has_appendable_inputs() const {
+ return HasAppendableInputsField::decode(bit_field_);
+ }
+ void set_has_appendable_inputs(bool has_appendable_inputs) {
+ bit_field_ =
+ HasAppendableInputsField::update(bit_field_, has_appendable_inputs);
+ }
+
+ typedef BitField<unsigned, 0, 29> InputCountField;
+ typedef BitField<unsigned, 29, 2> ReservedInputCountField;
+ typedef BitField<unsigned, 31, 1> HasAppendableInputsField;
+ static const int kDefaultReservedInputs = ReservedInputCountField::kMax;
const Operator* op_;
Bounds bounds_;
Mark mark_;
NodeId id_;
- int input_count_ : 29;
- unsigned int reserve_input_count_ : kReservedInputCountBits;
- bool has_appendable_inputs_ : 1;
+ unsigned bit_field_;
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.
@@ -223,7 +240,6 @@ class Node FINAL {
Input* static_;
InputDeque* appendable_;
} inputs_;
- int use_count_;
Use* first_use_;
Use* last_use_;
@@ -240,7 +256,7 @@ class Edge {
Node* to() const { return input_->to; }
int index() const {
int index = input_->use->input_index;
- DCHECK(index < input_->use->from->input_count_);
+ DCHECK(index < input_->use->from->input_count());
return index;
}
@@ -500,8 +516,6 @@ inline void Node::ReplaceUses(Node* replace_to) {
first_use_->prev = replace_to->last_use_;
replace_to->last_use_ = last_use_;
}
- replace_to->use_count_ += use_count_;
- use_count_ = 0;
first_use_ = NULL;
last_use_ = NULL;
}
@@ -526,16 +540,16 @@ inline void Node::RemoveAllInputs() {
}
inline void Node::TrimInputCount(int new_input_count) {
- if (new_input_count == input_count_) return; // Nothing to do.
+ if (new_input_count == input_count()) return; // Nothing to do.
- DCHECK(new_input_count < input_count_);
+ DCHECK(new_input_count < input_count());
// Update inline inputs.
- for (int i = new_input_count; i < input_count_; i++) {
+ for (int i = new_input_count; i < input_count(); i++) {
Node::Input* input = GetInputRecordPtr(i);
input->Update(NULL);
}
- input_count_ = new_input_count;
+ set_input_count(new_input_count);
}
inline void Node::ReplaceInput(int index, Node* new_to) {
@@ -561,14 +575,14 @@ inline void Node::Input::Update(Node* new_to) {
}
inline void Node::EnsureAppendableInputs(Zone* zone) {
- if (!has_appendable_inputs_) {
+ if (!has_appendable_inputs()) {
void* deque_buffer = zone->New(sizeof(InputDeque));
InputDeque* deque = new (deque_buffer) InputDeque(zone);
- for (int i = 0; i < input_count_; ++i) {
+ for (int i = 0; i < input_count(); ++i) {
deque->push_back(inputs_.static_[i]);
}
inputs_.appendable_ = deque;
- has_appendable_inputs_ = true;
+ set_has_appendable_inputs(true);
}
}
@@ -577,18 +591,18 @@ inline void Node::AppendInput(Zone* zone, Node* to_append) {
Input new_input;
new_input.to = to_append;
new_input.use = new_use;
- if (reserve_input_count_ > 0) {
- DCHECK(!has_appendable_inputs_);
- reserve_input_count_--;
- inputs_.static_[input_count_] = new_input;
+ if (reserved_input_count() > 0) {
+ DCHECK(!has_appendable_inputs());
+ set_reserved_input_count(reserved_input_count() - 1);
+ inputs_.static_[input_count()] = new_input;
} else {
EnsureAppendableInputs(zone);
inputs_.appendable_->push_back(new_input);
}
- new_use->input_index = input_count_;
+ new_use->input_index = input_count();
new_use->from = this;
to_append->AppendUse(new_use);
- input_count_++;
+ set_input_count(input_count() + 1);
}
inline void Node::InsertInput(Zone* zone, int index, Node* to_insert) {
@@ -619,7 +633,6 @@ inline void Node::AppendUse(Use* use) {
last_use_->next = use;
}
last_use_ = use;
- ++use_count_;
}
inline void Node::RemoveUse(Use* use) {
@@ -634,7 +647,6 @@ inline void Node::RemoveUse(Use* use) {
if (use->next != NULL) {
use->next->prev = use->prev;
}
- --use_count_;
}
inline bool Node::OwnedBy(Node* owner) const {
« no previous file with comments | « no previous file | src/compiler/node.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698