Home | History | Annotate | Download | only in compiler
      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_ESCAPE_ANALYSIS_REDUCER_H_
      6 #define V8_COMPILER_ESCAPE_ANALYSIS_REDUCER_H_
      7 
      8 #include "src/base/compiler-specific.h"
      9 #include "src/bit-vector.h"
     10 #include "src/compiler/escape-analysis.h"
     11 #include "src/compiler/graph-reducer.h"
     12 #include "src/globals.h"
     13 
     14 namespace v8 {
     15 namespace internal {
     16 namespace compiler {
     17 
     18 // Forward declarations.
     19 class JSGraph;
     20 
     21 class V8_EXPORT_PRIVATE EscapeAnalysisReducer final
     22     : public NON_EXPORTED_BASE(AdvancedReducer) {
     23  public:
     24   EscapeAnalysisReducer(Editor* editor, JSGraph* jsgraph,
     25                         EscapeAnalysis* escape_analysis, Zone* zone);
     26 
     27   Reduction Reduce(Node* node) final;
     28 
     29   // Verifies that all virtual allocation nodes have been dealt with. Run it
     30   // after this reducer has been applied. Has no effect in release mode.
     31   void VerifyReplacement() const;
     32 
     33   bool compilation_failed() const { return compilation_failed_; }
     34 
     35  private:
     36   Reduction ReduceNode(Node* node);
     37   Reduction ReduceLoad(Node* node);
     38   Reduction ReduceStore(Node* node);
     39   Reduction ReduceAllocate(Node* node);
     40   Reduction ReduceFinishRegion(Node* node);
     41   Reduction ReduceReferenceEqual(Node* node);
     42   Reduction ReduceObjectIsSmi(Node* node);
     43   Reduction ReduceFrameStateUses(Node* node);
     44   Node* ReduceDeoptState(Node* node, Node* effect, bool multiple_users);
     45   Node* ReduceStateValueInput(Node* node, int node_index, Node* effect,
     46                               bool node_multiused, bool already_cloned,
     47                               bool multiple_users);
     48 
     49   JSGraph* jsgraph() const { return jsgraph_; }
     50   EscapeAnalysis* escape_analysis() const { return escape_analysis_; }
     51   Zone* zone() const { return zone_; }
     52 
     53   JSGraph* const jsgraph_;
     54   EscapeAnalysis* escape_analysis_;
     55   Zone* const zone_;
     56   // This bit vector marks nodes we already processed (allocs, loads, stores)
     57   // and nodes that do not need a visit from ReduceDeoptState etc.
     58   BitVector fully_reduced_;
     59   bool exists_virtual_allocate_;
     60   bool compilation_failed_ = false;
     61 
     62   DISALLOW_COPY_AND_ASSIGN(EscapeAnalysisReducer);
     63 };
     64 
     65 }  // namespace compiler
     66 }  // namespace internal
     67 }  // namespace v8
     68 
     69 #endif  // V8_COMPILER_ESCAPE_ANALYSIS_REDUCER_H_
     70