Chromium Code Reviews| Index: src/compiler/node.h |
| diff --git a/src/compiler/node.h b/src/compiler/node.h |
| index a475fee21af8c655547790c2a16a141bf15a5534..7c9f3ad26f1b8bf6706f67e324aa63de339e7c0f 100644 |
| --- a/src/compiler/node.h |
| +++ b/src/compiler/node.h |
| @@ -46,7 +46,7 @@ class V8_EXPORT_PRIVATE Node final { |
| 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); } |
| + inline bool IsDead() const; |
| void Kill(); |
| const Operator* op() const { return op_; } |
| @@ -109,41 +109,11 @@ class V8_EXPORT_PRIVATE Node final { |
| int UseCount() const; |
| void ReplaceUses(Node* replace_to); |
| - class InputEdges final { |
| - public: |
| - typedef Edge value_type; |
| - |
| - class iterator; |
| - inline iterator begin() const; |
| - inline iterator end() const; |
| - |
| - bool empty() const; |
| - |
| - explicit InputEdges(Node* node) : node_(node) {} |
| - |
| - private: |
| - Node* node_; |
| - }; |
| - |
| - InputEdges input_edges() { return InputEdges(this); } |
| - |
| - class V8_EXPORT_PRIVATE Inputs final { |
| - public: |
| - typedef Node* value_type; |
| - |
| - class const_iterator; |
| - inline const_iterator begin() const; |
| - inline const_iterator end() const; |
| - |
| - bool empty() const; |
| - |
| - explicit Inputs(Node* node) : node_(node) {} |
| + class InputEdges; |
| + inline InputEdges input_edges(); |
| - private: |
| - Node* node_; |
| - }; |
| - |
| - Inputs inputs() { return Inputs(this); } |
| + class Inputs; |
| + inline Inputs inputs() const; |
| class UseEdges final { |
| public: |
| @@ -345,6 +315,48 @@ static inline const T& OpParameter(const Node* node) { |
| return OpParameter<T>(node->op()); |
| } |
| +class Node::InputEdges final { |
| + public: |
| + typedef Edge value_type; |
| + |
| + class iterator; |
| + inline iterator begin() const; |
| + inline iterator end() const; |
| + |
| + bool empty() const { return count_ == 0; } |
| + int count() const { return count_; } |
| + |
| + inline value_type operator[](int index) const; |
| + |
| + InputEdges(Node** input_root, Use* use_root, int count) |
| + : input_root_(input_root), use_root_(use_root), count_(count) {} |
| + |
| + private: |
| + Node** input_root_; |
| + Use* use_root_; |
| + int count_; |
| +}; |
| + |
| +class V8_EXPORT_PRIVATE Node::Inputs final { |
| + public: |
| + typedef Node* value_type; |
| + |
| + class const_iterator; |
| + inline const_iterator begin() const; |
| + inline const_iterator end() const; |
| + |
| + bool empty() const { return count_ == 0; } |
| + int count() const { return count_; } |
| + |
| + inline value_type operator[](int index) const; |
| + |
| + explicit Inputs(Node* const* input_root, int count) |
| + : input_root_(input_root), count_(count) {} |
| + |
| + private: |
| + Node* const* input_root_; |
| + int count_; |
| +}; |
| // An encapsulation for information associated with a single use of node as a |
| // input from another node, allowing access to both the defining node and |
| @@ -373,6 +385,7 @@ class Edge final { |
| private: |
| friend class Node::UseEdges::iterator; |
| + friend class Node::InputEdges; |
| friend class Node::InputEdges::iterator; |
| Edge(Node::Use* use, Node** input_ptr) : use_(use), input_ptr_(input_ptr) { |
| @@ -385,12 +398,37 @@ class Edge final { |
| Node** input_ptr_; |
| }; |
| +bool Node::IsDead() const { |
| + Node::Inputs inputs = this->inputs(); |
| + return inputs.count() > 0 && inputs[0] == nullptr; |
|
Jarin
2017/01/10 10:53:39
I actually think the original function will genera
Leszek Swirski
2017/01/10 12:03:38
You'd be surprised! I checked the disassembled ver
|
| +} |
| + |
| +Node::InputEdges Node::input_edges() { |
| + int inline_count = InlineCountField::decode(bit_field_); |
| + if (inline_count != kOutlineMarker) { |
| + return InputEdges(inputs_.inline_, reinterpret_cast<Use*>(this) - 1, |
| + inline_count); |
| + } else { |
| + return InputEdges(inputs_.outline_->inputs_, |
| + reinterpret_cast<Use*>(inputs_.outline_) - 1, |
| + inputs_.outline_->count_); |
| + } |
| +} |
| + |
| +Node::Inputs Node::inputs() const { |
| + int inline_count = InlineCountField::decode(bit_field_); |
| + if (inline_count != kOutlineMarker) { |
| + return Inputs(inputs_.inline_, inline_count); |
| + } else { |
| + return Inputs(inputs_.outline_->inputs_, inputs_.outline_->count_); |
| + } |
| +} |
| // A forward iterator to visit the edges for the input dependencies of a node. |
| class Node::InputEdges::iterator final { |
| public: |
| typedef std::forward_iterator_tag iterator_category; |
| - typedef int difference_type; |
| + typedef std::ptrdiff_t difference_type; |
| typedef Edge value_type; |
| typedef Edge* pointer; |
| typedef Edge& reference; |
| @@ -419,15 +457,12 @@ class Node::InputEdges::iterator final { |
| return iterator(use_ - offset, input_ptr_ + offset); |
| } |
| difference_type operator-(const iterator& other) const { |
| - return static_cast<difference_type>(input_ptr_ - other.input_ptr_); |
| + return input_ptr_ - other.input_ptr_; |
| } |
| private: |
| friend class Node; |
| - explicit iterator(Node* from, int index = 0) |
| - : use_(from->GetUsePtr(index)), input_ptr_(from->GetInputPtr(index)) {} |
| - |
| explicit iterator(Use* use, Node** input_ptr) |
| : use_(use), input_ptr_(input_ptr) {} |
| @@ -437,69 +472,71 @@ class Node::InputEdges::iterator final { |
| Node::InputEdges::iterator Node::InputEdges::begin() const { |
| - return Node::InputEdges::iterator(this->node_, 0); |
| + return Node::InputEdges::iterator(use_root_, input_root_); |
| } |
| Node::InputEdges::iterator Node::InputEdges::end() const { |
| - return Node::InputEdges::iterator(this->node_, this->node_->InputCount()); |
| + return Node::InputEdges::iterator(use_root_ - count_, input_root_ + count_); |
| } |
| +Edge Node::InputEdges::operator[](int index) const { |
| + return Edge(use_root_ + index, input_root_ + index); |
| +} |
| // A forward iterator to visit the inputs of a node. |
| class Node::Inputs::const_iterator final { |
| public: |
| typedef std::forward_iterator_tag iterator_category; |
| - typedef int difference_type; |
| + typedef std::ptrdiff_t difference_type; |
| typedef Node* value_type; |
| - typedef Node** pointer; |
| - typedef Node*& reference; |
| + typedef const value_type* pointer; |
| + typedef value_type& reference; |
| - const_iterator(const const_iterator& other) : iter_(other.iter_) {} |
| + const_iterator(const const_iterator& other) : input_ptr_(other.input_ptr_) {} |
| - Node* operator*() const { return (*iter_).to(); } |
| + Node* operator*() const { return *input_ptr_; } |
| bool operator==(const const_iterator& other) const { |
| - return iter_ == other.iter_; |
| + return input_ptr_ == other.input_ptr_; |
| } |
| bool operator!=(const const_iterator& other) const { |
| return !(*this == other); |
| } |
| const_iterator& operator++() { |
| - ++iter_; |
| + ++input_ptr_; |
| return *this; |
| } |
| const_iterator operator++(int); |
| const_iterator& operator+=(difference_type offset) { |
| - iter_ += offset; |
| + input_ptr_ += offset; |
| return *this; |
| } |
| const_iterator operator+(difference_type offset) const { |
| - return const_iterator(iter_ + offset); |
| + return const_iterator(input_ptr_ + offset); |
| } |
| difference_type operator-(const const_iterator& other) const { |
| - return iter_ - other.iter_; |
| + return input_ptr_ - other.input_ptr_; |
| } |
| private: |
| friend class Node::Inputs; |
| - const_iterator(Node* node, int index) : iter_(node, index) {} |
| - |
| - explicit const_iterator(Node::InputEdges::iterator iter) : iter_(iter) {} |
| + explicit const_iterator(Node* const* input_ptr) : input_ptr_(input_ptr) {} |
| - Node::InputEdges::iterator iter_; |
| + Node* const* input_ptr_; |
| }; |
| Node::Inputs::const_iterator Node::Inputs::begin() const { |
| - return const_iterator(this->node_, 0); |
| + return const_iterator(input_root_); |
| } |
| Node::Inputs::const_iterator Node::Inputs::end() const { |
| - return const_iterator(this->node_, this->node_->InputCount()); |
| + return const_iterator(input_root_ + count_); |
| } |
| +Node* Node::Inputs::operator[](int index) const { return input_root_[index]; } |
| // A forward iterator to visit the uses edges of a node. |
| class Node::UseEdges::iterator final { |