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