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"
9c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/globals.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace compiler {
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Graph;
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
18c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass V8_EXPORT_PRIVATE StateValuesCache {
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit StateValuesCache(JSGraph* js_graph);
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* GetNodeForValues(Node** values, size_t count);
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const size_t kMaxInputCount = 8;
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct NodeKey {
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node* node;
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    explicit NodeKey(Node* node) : node(node) {}
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct StateValuesKey : public NodeKey {
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // ValueArray - array of nodes ({node} has to be nullptr).
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    size_t count;
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node** values;
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StateValuesKey(size_t count, Node** values)
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : NodeKey(nullptr), count(count), values(values) {}
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class ValueArrayIterator;
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static bool AreKeysEqual(void* key1, void* key2);
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static bool IsKeysEqualToNode(StateValuesKey* key, Node* node);
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static bool AreValueKeysEqual(StateValuesKey* key1, StateValuesKey* key2);
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BuildTree(ValueArrayIterator* it, size_t max_height);
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  NodeVector* GetWorkingSpace(size_t level);
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* GetEmptyStateValues();
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* GetValuesNodeFromCache(Node** nodes, size_t count);
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Graph* graph() { return js_graph_->graph(); }
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CommonOperatorBuilder* common() { return js_graph_->common(); }
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Zone* zone() { return graph()->zone(); }
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSGraph* js_graph_;
59f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  CustomMatcherZoneHashMap hash_map_;
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ZoneVector<NodeVector*> working_space_;  // One working space per level.
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* empty_state_values_;
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
64c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass V8_EXPORT_PRIVATE StateValuesAccess {
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct TypedNode {
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node* node;
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    MachineType type;
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TypedNode(Node* node, MachineType type) : node(node), type(type) {}
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
72c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  class V8_EXPORT_PRIVATE iterator {
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   public:
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Bare minimum of operators needed for range iteration.
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    bool operator!=(iterator& other);
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    iterator& operator++();
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TypedNode operator*();
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   private:
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    friend class StateValuesAccess;
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    iterator() : current_depth_(-1) {}
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    explicit iterator(Node* node);
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node* node();
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    MachineType type();
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    bool done();
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    void Advance();
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    struct StatePos {
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* node;
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int index;
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      explicit StatePos(Node* node) : node(node), index(0) {}
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      StatePos() {}
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    };
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StatePos* Top();
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    void Push(Node* node);
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    void Pop();
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const int kMaxInlineDepth = 8;
103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StatePos stack_[kMaxInlineDepth];
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int current_depth_;
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit StateValuesAccess(Node* node) : node_(node) {}
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t size();
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  iterator begin() { return iterator(node_); }
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  iterator end() { return iterator(); }
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* node_;
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace compiler
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_COMPILER_STATE_VALUES_UTILS_H_
122