| Index: src/compiler/state-values-utils.h
 | 
| diff --git a/src/compiler/state-values-utils.h b/src/compiler/state-values-utils.h
 | 
| index 14b1b9e59963755c2b0e543becb3c46f3220e994..d5e84d208c33c3b1c2f64e7a93df5acb9aa1be26 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,12 @@ 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);
 | 
|  
 | 
|   private:
 | 
|    static const size_t kMaxInputCount = 8;
 | 
| +  typedef std::array<Node*, kMaxInputCount> WorkingBuffer;
 | 
|  
 | 
|    struct NodeKey {
 | 
|      Node* node;
 | 
| @@ -33,22 +39,34 @@ 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);
 | 
| +
 | 
| +  Node* BuildTree(size_t* values_idx, Node** values, size_t count,
 | 
| +                  const BitVector* liveness, 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 +75,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 +104,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_;
 | 
|    };
 | 
|  
 | 
| 
 |