LCOV - code coverage report
Current view: top level - src/compiler - branch-elimination.h (source / functions) Hit Total Coverage
Test: app.info Lines: 5 5 100.0 %
Date: 2019-04-17 Functions: 2 3 66.7 %

          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_BRANCH_ELIMINATION_H_
       6             : #define V8_COMPILER_BRANCH_ELIMINATION_H_
       7             : 
       8             : #include "src/base/compiler-specific.h"
       9             : #include "src/compiler/functional-list.h"
      10             : #include "src/compiler/graph-reducer.h"
      11             : #include "src/compiler/node-aux-data.h"
      12             : #include "src/globals.h"
      13             : 
      14             : namespace v8 {
      15             : namespace internal {
      16             : namespace compiler {
      17             : 
      18             : // Forward declarations.
      19             : class CommonOperatorBuilder;
      20             : class JSGraph;
      21             : 
      22     1991172 : class V8_EXPORT_PRIVATE BranchElimination final
      23             :     : public NON_EXPORTED_BASE(AdvancedReducer) {
      24             :  public:
      25             :   BranchElimination(Editor* editor, JSGraph* js_graph, Zone* zone);
      26             :   ~BranchElimination() final;
      27             : 
      28          71 :   const char* reducer_name() const override { return "BranchElimination"; }
      29             : 
      30             :   Reduction Reduce(Node* node) final;
      31             : 
      32             :  private:
      33             :   struct BranchCondition {
      34             :     Node* condition;
      35             :     Node* branch;
      36             :     bool is_true;
      37             : 
      38             :     bool operator==(BranchCondition other) const {
      39         516 :       return condition == other.condition && branch == other.branch &&
      40         199 :              is_true == other.is_true;
      41             :     }
      42         279 :     bool operator!=(BranchCondition other) const { return !(*this == other); }
      43             :   };
      44             : 
      45             :   // Class for tracking information about branch conditions.
      46             :   // At the moment it is a linked list of conditions and their values
      47             :   // (true or false).
      48             :   class ControlPathConditions : public FunctionalList<BranchCondition> {
      49             :    public:
      50             :     bool LookupCondition(Node* condition, Node** branch, bool* is_true) const;
      51             :     void AddCondition(Zone* zone, Node* condition, Node* branch, bool is_true,
      52             :                       ControlPathConditions hint);
      53             : 
      54             :    private:
      55             :     using FunctionalList<BranchCondition>::PushFront;
      56             :   };
      57             : 
      58             :   Reduction ReduceBranch(Node* node);
      59             :   Reduction ReduceDeoptimizeConditional(Node* node);
      60             :   Reduction ReduceIf(Node* node, bool is_true_branch);
      61             :   Reduction ReduceLoop(Node* node);
      62             :   Reduction ReduceMerge(Node* node);
      63             :   Reduction ReduceStart(Node* node);
      64             :   Reduction ReduceOtherControl(Node* node);
      65             : 
      66             :   Reduction TakeConditionsFromFirstControl(Node* node);
      67             :   Reduction UpdateConditions(Node* node, ControlPathConditions conditions);
      68             :   Reduction UpdateConditions(Node* node, ControlPathConditions prev_conditions,
      69             :                              Node* current_condition, Node* current_branch,
      70             :                              bool is_true_branch);
      71             : 
      72             :   Node* dead() const { return dead_; }
      73             :   Graph* graph() const;
      74             :   JSGraph* jsgraph() const { return jsgraph_; }
      75             :   Isolate* isolate() const;
      76             :   CommonOperatorBuilder* common() const;
      77             : 
      78             :   JSGraph* const jsgraph_;
      79             : 
      80             :   // Maps each control node to the condition information known about the node.
      81             :   // If the information is nullptr, then we have not calculated the information
      82             :   // yet.
      83             :   NodeAuxData<ControlPathConditions> node_conditions_;
      84             :   NodeAuxData<bool> reduced_;
      85             :   Zone* zone_;
      86             :   Node* dead_;
      87             : };
      88             : 
      89             : }  // namespace compiler
      90             : }  // namespace internal
      91             : }  // namespace v8
      92             : 
      93             : #endif  // V8_COMPILER_BRANCH_ELIMINATION_H_

Generated by: LCOV version 1.10