state-values-utils.h revision f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3
1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_COMPILER_STATE_VALUES_UTILS_H_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_COMPILER_STATE_VALUES_UTILS_H_
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/js-graph.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace compiler {
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Graph;
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass StateValuesCache {
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit StateValuesCache(JSGraph* js_graph);
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* GetNodeForValues(Node** values, size_t count);
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const size_t kMaxInputCount = 8;
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct NodeKey {
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node* node;
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    explicit NodeKey(Node* node) : node(node) {}
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct StateValuesKey : public NodeKey {
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // ValueArray - array of nodes ({node} has to be nullptr).
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    size_t count;
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node** values;
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StateValuesKey(size_t count, Node** values)
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : NodeKey(nullptr), count(count), values(values) {}
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class ValueArrayIterator;
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static bool AreKeysEqual(void* key1, void* key2);
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static bool IsKeysEqualToNode(StateValuesKey* key, Node* node);
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static bool AreValueKeysEqual(StateValuesKey* key1, StateValuesKey* key2);
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BuildTree(ValueArrayIterator* it, size_t max_height);
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  NodeVector* GetWorkingSpace(size_t level);
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* GetEmptyStateValues();
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* GetValuesNodeFromCache(Node** nodes, size_t count);
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Graph* graph() { return js_graph_->graph(); }
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CommonOperatorBuilder* common() { return js_graph_->common(); }
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Zone* zone() { return graph()->zone(); }
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSGraph* js_graph_;
58f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  CustomMatcherZoneHashMap hash_map_;
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ZoneVector<NodeVector*> working_space_;  // One working space per level.
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* empty_state_values_;
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass StateValuesAccess {
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct TypedNode {
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node* node;
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    MachineType type;
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TypedNode(Node* node, MachineType type) : node(node), type(type) {}
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class iterator {
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   public:
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Bare minimum of operators needed for range iteration.
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    bool operator!=(iterator& other);
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    iterator& operator++();
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TypedNode operator*();
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   private:
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    friend class StateValuesAccess;
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    iterator() : current_depth_(-1) {}
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    explicit iterator(Node* node);
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node* node();
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    MachineType type();
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    bool done();
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    void Advance();
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    struct StatePos {
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* node;
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int index;
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      explicit StatePos(Node* node) : node(node), index(0) {}
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      StatePos() {}
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    };
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StatePos* Top();
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    void Push(Node* node);
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    void Pop();
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const int kMaxInlineDepth = 8;
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StatePos stack_[kMaxInlineDepth];
103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int current_depth_;
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit StateValuesAccess(Node* node) : node_(node) {}
107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t size();
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  iterator begin() { return iterator(node_); }
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  iterator end() { return iterator(); }
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* node_;
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace compiler
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_COMPILER_STATE_VALUES_UTILS_H_
121