LCOV - code coverage report
Current view: top level - src/compiler - state-values-utils.h (source / functions) Hit Total Coverage
Test: app.info Lines: 6 6 100.0 %
Date: 2019-04-17 Functions: 0 0 -

          Line data    Source code
       1             : // Copyright 2015 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_COMPILER_STATE_VALUES_UTILS_H_
       6             : #define V8_COMPILER_STATE_VALUES_UTILS_H_
       7             : 
       8             : #include <array>
       9             : #include "src/compiler/common-operator.h"
      10             : #include "src/compiler/js-graph.h"
      11             : #include "src/globals.h"
      12             : 
      13             : namespace v8 {
      14             : namespace internal {
      15             : 
      16             : class BitVector;
      17             : 
      18             : namespace compiler {
      19             : 
      20             : class Graph;
      21             : 
      22      530231 : class V8_EXPORT_PRIVATE StateValuesCache {
      23             :  public:
      24             :   explicit StateValuesCache(JSGraph* js_graph);
      25             : 
      26             :   Node* GetNodeForValues(Node** values, size_t count,
      27             :                          const BitVector* liveness = nullptr,
      28             :                          int liveness_offset = 0);
      29             : 
      30             :  private:
      31             :   static const size_t kMaxInputCount = 8;
      32             :   using WorkingBuffer = std::array<Node*, kMaxInputCount>;
      33             : 
      34             :   struct NodeKey {
      35             :     Node* node;
      36             : 
      37    11609567 :     explicit NodeKey(Node* node) : node(node) {}
      38             :   };
      39             : 
      40             :   struct StateValuesKey : public NodeKey {
      41             :     // ValueArray - array of nodes ({node} has to be nullptr).
      42             :     size_t count;
      43             :     SparseInputMask mask;
      44             :     Node** values;
      45             : 
      46             :     StateValuesKey(size_t count, SparseInputMask mask, Node** values)
      47     8568959 :         : NodeKey(nullptr), count(count), mask(mask), values(values) {}
      48             :   };
      49             : 
      50             :   static bool AreKeysEqual(void* key1, void* key2);
      51             :   static bool IsKeysEqualToNode(StateValuesKey* key, Node* node);
      52             :   static bool AreValueKeysEqual(StateValuesKey* key1, StateValuesKey* key2);
      53             : 
      54             :   // Fills {node_buffer}, starting from {node_count}, with {values}, starting
      55             :   // at {values_idx}, sparsely encoding according to {liveness}. {node_count} is
      56             :   // updated with the new number of inputs in {node_buffer}, and a bitmask of
      57             :   // the sparse encoding is returned.
      58             :   SparseInputMask::BitMaskType FillBufferWithValues(WorkingBuffer* node_buffer,
      59             :                                                     size_t* node_count,
      60             :                                                     size_t* values_idx,
      61             :                                                     Node** values, size_t count,
      62             :                                                     const BitVector* liveness,
      63             :                                                     int liveness_offset);
      64             : 
      65             :   Node* BuildTree(size_t* values_idx, Node** values, size_t count,
      66             :                   const BitVector* liveness, int liveness_offset, size_t level);
      67             : 
      68             :   WorkingBuffer* GetWorkingSpace(size_t level);
      69             :   Node* GetEmptyStateValues();
      70             :   Node* GetValuesNodeFromCache(Node** nodes, size_t count,
      71             :                                SparseInputMask mask);
      72             : 
      73             :   Graph* graph() { return js_graph_->graph(); }
      74             :   CommonOperatorBuilder* common() { return js_graph_->common(); }
      75             : 
      76             :   Zone* zone() { return graph()->zone(); }
      77             : 
      78             :   JSGraph* js_graph_;
      79             :   CustomMatcherZoneHashMap hash_map_;
      80             :   ZoneVector<WorkingBuffer> working_space_;  // One working space per level.
      81             :   Node* empty_state_values_;
      82             : };
      83             : 
      84             : class V8_EXPORT_PRIVATE StateValuesAccess {
      85             :  public:
      86             :   struct TypedNode {
      87             :     Node* node;
      88             :     MachineType type;
      89             :     TypedNode(Node* node, MachineType type) : node(node), type(type) {}
      90             :   };
      91             : 
      92             :   class V8_EXPORT_PRIVATE iterator {
      93             :    public:
      94             :     // Bare minimum of operators needed for range iteration.
      95             :     bool operator!=(iterator& other);
      96             :     iterator& operator++();
      97             :     TypedNode operator*();
      98             : 
      99             :    private:
     100             :     friend class StateValuesAccess;
     101             : 
     102    11069790 :     iterator() : current_depth_(-1) {}
     103             :     explicit iterator(Node* node);
     104             : 
     105             :     Node* node();
     106             :     MachineType type();
     107             :     bool done();
     108             :     void Advance();
     109             :     void EnsureValid();
     110             : 
     111             :     SparseInputMask::InputIterator* Top();
     112             :     void Push(Node* node);
     113             :     void Pop();
     114             : 
     115             :     static const int kMaxInlineDepth = 8;
     116             :     SparseInputMask::InputIterator stack_[kMaxInlineDepth];
     117             :     int current_depth_;
     118             :   };
     119             : 
     120    11602277 :   explicit StateValuesAccess(Node* node) : node_(node) {}
     121             : 
     122             :   size_t size();
     123    11071152 :   iterator begin() { return iterator(node_); }
     124             :   iterator end() { return iterator(); }
     125             : 
     126             :  private:
     127             :   Node* node_;
     128             : };
     129             : 
     130             : }  // namespace compiler
     131             : }  // namespace internal
     132             : }  // namespace v8
     133             : 
     134             : #endif  // V8_COMPILER_STATE_VALUES_UTILS_H_

Generated by: LCOV version 1.10