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
14namespace v8 {
15namespace internal {
16namespace compiler {
17
18// Forward declarations.
19class JSGraph;
20
21class 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