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