diff options
Diffstat (limited to 'src/compiler/state-values-utils.h')
-rw-r--r-- | src/compiler/state-values-utils.h | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/src/compiler/state-values-utils.h b/src/compiler/state-values-utils.h index 14b1b9e5..e1fd7d28 100644 --- a/src/compiler/state-values-utils.h +++ b/src/compiler/state-values-utils.h @@ -5,12 +5,16 @@ #ifndef V8_COMPILER_STATE_VALUES_UTILS_H_ #define V8_COMPILER_STATE_VALUES_UTILS_H_ +#include <array> +#include "src/compiler/common-operator.h" #include "src/compiler/js-graph.h" #include "src/globals.h" namespace v8 { namespace internal { +class BitVector; + namespace compiler { class Graph; @@ -19,10 +23,13 @@ class V8_EXPORT_PRIVATE StateValuesCache { public: explicit StateValuesCache(JSGraph* js_graph); - Node* GetNodeForValues(Node** values, size_t count); + Node* GetNodeForValues(Node** values, size_t count, + const BitVector* liveness = nullptr, + int liveness_offset = 0); private: static const size_t kMaxInputCount = 8; + typedef std::array<Node*, kMaxInputCount> WorkingBuffer; struct NodeKey { Node* node; @@ -33,22 +40,35 @@ class V8_EXPORT_PRIVATE StateValuesCache { struct StateValuesKey : public NodeKey { // ValueArray - array of nodes ({node} has to be nullptr). size_t count; + SparseInputMask mask; Node** values; - StateValuesKey(size_t count, Node** values) - : NodeKey(nullptr), count(count), values(values) {} + StateValuesKey(size_t count, SparseInputMask mask, Node** values) + : NodeKey(nullptr), count(count), mask(mask), values(values) {} }; - class ValueArrayIterator; - static bool AreKeysEqual(void* key1, void* key2); static bool IsKeysEqualToNode(StateValuesKey* key, Node* node); static bool AreValueKeysEqual(StateValuesKey* key1, StateValuesKey* key2); - Node* BuildTree(ValueArrayIterator* it, size_t max_height); - NodeVector* GetWorkingSpace(size_t level); + // Fills {node_buffer}, starting from {node_count}, with {values}, starting + // at {values_idx}, sparsely encoding according to {liveness}. {node_count} is + // updated with the new number of inputs in {node_buffer}, and a bitmask of + // the sparse encoding is returned. + SparseInputMask::BitMaskType FillBufferWithValues(WorkingBuffer* node_buffer, + size_t* node_count, + size_t* values_idx, + Node** values, size_t count, + const BitVector* liveness, + int liveness_offset); + + Node* BuildTree(size_t* values_idx, Node** values, size_t count, + const BitVector* liveness, int liveness_offset, size_t level); + + WorkingBuffer* GetWorkingSpace(size_t level); Node* GetEmptyStateValues(); - Node* GetValuesNodeFromCache(Node** nodes, size_t count); + Node* GetValuesNodeFromCache(Node** nodes, size_t count, + SparseInputMask mask); Graph* graph() { return js_graph_->graph(); } CommonOperatorBuilder* common() { return js_graph_->common(); } @@ -57,7 +77,7 @@ class V8_EXPORT_PRIVATE StateValuesCache { JSGraph* js_graph_; CustomMatcherZoneHashMap hash_map_; - ZoneVector<NodeVector*> working_space_; // One working space per level. + ZoneVector<WorkingBuffer> working_space_; // One working space per level. Node* empty_state_values_; }; @@ -86,21 +106,14 @@ class V8_EXPORT_PRIVATE StateValuesAccess { MachineType type(); bool done(); void Advance(); + void EnsureValid(); - struct StatePos { - Node* node; - int index; - - explicit StatePos(Node* node) : node(node), index(0) {} - StatePos() {} - }; - - StatePos* Top(); + SparseInputMask::InputIterator* Top(); void Push(Node* node); void Pop(); static const int kMaxInlineDepth = 8; - StatePos stack_[kMaxInlineDepth]; + SparseInputMask::InputIterator stack_[kMaxInlineDepth]; int current_depth_; }; |