| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_COMPILER_NODE_H_ | 5 #ifndef V8_COMPILER_NODE_H_ |
| 6 #define V8_COMPILER_NODE_H_ | 6 #define V8_COMPILER_NODE_H_ |
| 7 | 7 |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <set> | |
| 10 #include <vector> | 9 #include <vector> |
| 11 | 10 |
| 12 #include "src/v8.h" | |
| 13 | |
| 14 #include "src/compiler/opcodes.h" | 11 #include "src/compiler/opcodes.h" |
| 15 #include "src/compiler/operator.h" | 12 #include "src/compiler/operator.h" |
| 16 #include "src/types.h" | 13 #include "src/types-inl.h" |
| 17 #include "src/zone.h" | 14 #include "src/zone.h" |
| 18 #include "src/zone-allocator.h" | 15 #include "src/zone-allocator.h" |
| 19 #include "src/zone-containers.h" | 16 #include "src/zone-containers.h" |
| 20 | 17 |
| 21 namespace v8 { | 18 namespace v8 { |
| 22 namespace internal { | 19 namespace internal { |
| 23 namespace compiler { | 20 namespace compiler { |
| 24 | 21 |
| 25 // Forward declarations. | 22 // Forward declarations. |
| 26 class Edge; | 23 class Edge; |
| 27 class Graph; | 24 class Graph; |
| 28 | 25 |
| 29 | 26 |
| 30 // Marks are used during traversal of the graph to distinguish states of nodes. | 27 // Marks are used during traversal of the graph to distinguish states of nodes. |
| 31 // Each node has a mark which is a monotonically increasing integer, and a | 28 // Each node has a mark which is a monotonically increasing integer, and a |
| 32 // {NodeMarker} has a range of values that indicate states of a node. | 29 // {NodeMarker} has a range of values that indicate states of a node. |
| 33 typedef uint32_t Mark; | 30 typedef uint32_t Mark; |
| 34 | 31 |
| 32 |
| 35 // NodeIds are identifying numbers for nodes that can be used to index auxiliary | 33 // NodeIds are identifying numbers for nodes that can be used to index auxiliary |
| 36 // out-of-line data associated with each node. | 34 // out-of-line data associated with each node. |
| 37 typedef int NodeId; | 35 typedef int32_t NodeId; |
| 36 |
| 38 | 37 |
| 39 // A Node is the basic primitive of graphs. Nodes are chained together by | 38 // A Node is the basic primitive of graphs. Nodes are chained together by |
| 40 // input/use chains but by default otherwise contain only an identifying number | 39 // input/use chains but by default otherwise contain only an identifying number |
| 41 // which specific applications of graphs and nodes can use to index auxiliary | 40 // which specific applications of graphs and nodes can use to index auxiliary |
| 42 // out-of-line data, especially transient data. | 41 // out-of-line data, especially transient data. |
| 43 // | 42 // |
| 44 // In addition Nodes only contain a mutable Operator that may change during | 43 // In addition Nodes only contain a mutable Operator that may change during |
| 45 // compilation, e.g. during lowering passes. Other information that needs to be | 44 // compilation, e.g. during lowering passes. Other information that needs to be |
| 46 // associated with Nodes during compilation must be stored out-of-line indexed | 45 // associated with Nodes during compilation must be stored out-of-line indexed |
| 47 // by the Node's id. | 46 // by the Node's id. |
| 48 class Node FINAL { | 47 class Node FINAL { |
| 49 public: | 48 public: |
| 50 void Initialize(const Operator* op) { | |
| 51 set_op(op); | |
| 52 set_mark(0); | |
| 53 } | |
| 54 | |
| 55 bool IsDead() const { return InputCount() > 0 && InputAt(0) == NULL; } | 49 bool IsDead() const { return InputCount() > 0 && InputAt(0) == NULL; } |
| 56 void Kill(); | 50 void Kill(); |
| 57 | 51 |
| 58 void CollectProjections(ZoneVector<Node*>* projections); | 52 void CollectProjections(ZoneVector<Node*>* projections); |
| 59 Node* FindProjection(size_t projection_index); | 53 Node* FindProjection(size_t projection_index); |
| 60 | 54 |
| 61 const Operator* op() const { return op_; } | 55 const Operator* op() const { return op_; } |
| 62 void set_op(const Operator* op) { op_ = op; } | 56 void set_op(const Operator* op) { op_ = op; } |
| 63 | 57 |
| 64 IrOpcode::Value opcode() const { | 58 IrOpcode::Value opcode() const { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 | 131 |
| 138 private: | 132 private: |
| 139 Node* node_; | 133 Node* node_; |
| 140 }; | 134 }; |
| 141 | 135 |
| 142 Uses uses() { return Uses(this); } | 136 Uses uses() { return Uses(this); } |
| 143 UseEdges use_edges() { return UseEdges(this); } | 137 UseEdges use_edges() { return UseEdges(this); } |
| 144 | 138 |
| 145 bool OwnedBy(Node* owner) const; | 139 bool OwnedBy(Node* owner) const; |
| 146 | 140 |
| 147 static Node* New(Graph* graph, int input_count, Node** inputs, | 141 static Node* New(Zone* zone, NodeId id, const Operator* op, int input_count, |
| 148 bool has_extensible_inputs); | 142 Node** inputs, bool has_extensible_inputs); |
| 149 | 143 |
| 150 protected: | 144 protected: |
| 151 friend class Graph; | 145 friend class Graph; |
| 152 friend class Edge; | 146 friend class Edge; |
| 153 | 147 |
| 154 class Use : public ZoneObject { | 148 class Use : public ZoneObject { |
| 155 public: | 149 public: |
| 156 Node* from; | 150 Node* from; |
| 157 Use* next; | 151 Use* next; |
| 158 Use* prev; | 152 Use* prev; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 176 return &inputs_.static_[index]; | 170 return &inputs_.static_[index]; |
| 177 } | 171 } |
| 178 } | 172 } |
| 179 | 173 |
| 180 inline void AppendUse(Use* use); | 174 inline void AppendUse(Use* use); |
| 181 inline void RemoveUse(Use* use); | 175 inline void RemoveUse(Use* use); |
| 182 | 176 |
| 183 void* operator new(size_t, void* location) { return location; } | 177 void* operator new(size_t, void* location) { return location; } |
| 184 | 178 |
| 185 private: | 179 private: |
| 186 inline Node(NodeId id, int input_count, int reserve_input_count); | 180 inline Node(NodeId id, const Operator* op, int input_count, |
| 181 int reserve_input_count); |
| 187 | 182 |
| 188 typedef ZoneDeque<Input> InputDeque; | 183 typedef ZoneDeque<Input> InputDeque; |
| 189 | 184 |
| 185 friend class NodeMarkerBase; |
| 190 friend class NodeProperties; | 186 friend class NodeProperties; |
| 191 template <typename State> | |
| 192 friend class NodeMarker; | |
| 193 | 187 |
| 194 // Only NodeProperties should manipulate the bounds. | 188 // Only NodeProperties should manipulate the bounds. |
| 195 Bounds bounds() { return bounds_; } | 189 Bounds bounds() { return bounds_; } |
| 196 void set_bounds(Bounds b) { bounds_ = b; } | 190 void set_bounds(Bounds b) { bounds_ = b; } |
| 197 | 191 |
| 198 // Only NodeMarkers should manipulate the marks on nodes. | 192 // Only NodeMarkers should manipulate the marks on nodes. |
| 199 Mark mark() { return mark_; } | 193 Mark mark() { return mark_; } |
| 200 void set_mark(Mark mark) { mark_ = mark; } | 194 void set_mark(Mark mark) { mark_ = mark; } |
| 201 | 195 |
| 202 int input_count() const { return InputCountField::decode(bit_field_); } | 196 int input_count() const { return InputCountField::decode(bit_field_); } |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 Input* CurrentInput() const { | 428 Input* CurrentInput() const { |
| 435 return current_->from->GetInputRecordPtr(current_->input_index); | 429 return current_->from->GetInputRecordPtr(current_->input_index); |
| 436 } | 430 } |
| 437 | 431 |
| 438 Node::Use* current_; | 432 Node::Use* current_; |
| 439 }; | 433 }; |
| 440 | 434 |
| 441 | 435 |
| 442 std::ostream& operator<<(std::ostream& os, const Node& n); | 436 std::ostream& operator<<(std::ostream& os, const Node& n); |
| 443 | 437 |
| 444 typedef std::set<Node*, std::less<Node*>, zone_allocator<Node*> > NodeSet; | |
| 445 typedef NodeSet::iterator NodeSetIter; | |
| 446 typedef NodeSet::reverse_iterator NodeSetRIter; | |
| 447 | |
| 448 typedef ZoneDeque<Node*> NodeDeque; | 438 typedef ZoneDeque<Node*> NodeDeque; |
| 449 | 439 |
| 450 typedef ZoneVector<Node*> NodeVector; | 440 typedef ZoneVector<Node*> NodeVector; |
| 451 typedef NodeVector::iterator NodeVectorIter; | 441 typedef NodeVector::iterator NodeVectorIter; |
| 452 typedef NodeVector::const_iterator NodeVectorConstIter; | 442 typedef NodeVector::const_iterator NodeVectorConstIter; |
| 453 typedef NodeVector::reverse_iterator NodeVectorRIter; | 443 typedef NodeVector::reverse_iterator NodeVectorRIter; |
| 454 | 444 |
| 455 typedef ZoneVector<NodeVector> NodeVectorVector; | 445 typedef ZoneVector<NodeVector> NodeVectorVector; |
| 456 typedef NodeVectorVector::iterator NodeVectorVectorIter; | 446 typedef NodeVectorVector::iterator NodeVectorVectorIter; |
| 457 typedef NodeVectorVector::reverse_iterator NodeVectorVectorRIter; | 447 typedef NodeVectorVector::reverse_iterator NodeVectorVectorRIter; |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 652 inline bool Node::OwnedBy(Node* owner) const { | 642 inline bool Node::OwnedBy(Node* owner) const { |
| 653 return first_use_ != NULL && first_use_->from == owner && | 643 return first_use_ != NULL && first_use_->from == owner && |
| 654 first_use_->next == NULL; | 644 first_use_->next == NULL; |
| 655 } | 645 } |
| 656 | 646 |
| 657 } // namespace compiler | 647 } // namespace compiler |
| 658 } // namespace internal | 648 } // namespace internal |
| 659 } // namespace v8 | 649 } // namespace v8 |
| 660 | 650 |
| 661 #endif // V8_COMPILER_NODE_H_ | 651 #endif // V8_COMPILER_NODE_H_ |
| OLD | NEW |