• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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_JS_INLINING_H_
6 #define V8_COMPILER_JS_INLINING_H_
7 
8 #include "src/compiler/graph-reducer.h"
9 #include "src/compiler/js-graph.h"
10 
11 namespace v8 {
12 namespace internal {
13 
14 class BailoutId;
15 class OptimizedCompilationInfo;
16 
17 namespace compiler {
18 
19 class SourcePositionTable;
20 
21 // The JSInliner provides the core graph inlining machinery. Note that this
22 // class only deals with the mechanics of how to inline one graph into another,
23 // heuristics that decide what and how much to inline are beyond its scope.
24 class JSInliner final : public AdvancedReducer {
25  public:
JSInliner(Editor * editor,Zone * local_zone,OptimizedCompilationInfo * info,JSGraph * jsgraph,JSHeapBroker * broker,SourcePositionTable * source_positions)26   JSInliner(Editor* editor, Zone* local_zone, OptimizedCompilationInfo* info,
27             JSGraph* jsgraph, JSHeapBroker* broker,
28             SourcePositionTable* source_positions)
29       : AdvancedReducer(editor),
30         local_zone_(local_zone),
31         info_(info),
32         jsgraph_(jsgraph),
33         broker_(broker),
34         source_positions_(source_positions) {}
35 
reducer_name()36   const char* reducer_name() const override { return "JSInliner"; }
37 
Reduce(Node * node)38   Reduction Reduce(Node* node) final { UNREACHABLE(); }
39 
40   // Can be used by inlining heuristics or by testing code directly, without
41   // using the above generic reducer interface of the inlining machinery.
42   Reduction ReduceJSCall(Node* node);
43 
44  private:
zone()45   Zone* zone() const { return local_zone_; }
46   CommonOperatorBuilder* common() const;
47   JSOperatorBuilder* javascript() const;
48   SimplifiedOperatorBuilder* simplified() const;
49   Graph* graph() const;
jsgraph()50   JSGraph* jsgraph() const { return jsgraph_; }
51   // TODO(neis): Make heap broker a component of JSGraph?
broker()52   JSHeapBroker* broker() const { return broker_; }
isolate()53   Isolate* isolate() const { return jsgraph_->isolate(); }
54 
55   Zone* const local_zone_;
56   OptimizedCompilationInfo* info_;
57   JSGraph* const jsgraph_;
58   JSHeapBroker* const broker_;
59   SourcePositionTable* const source_positions_;
60 
61   base::Optional<SharedFunctionInfoRef> DetermineCallTarget(Node* node);
62   FeedbackCellRef DetermineCallContext(Node* node, Node** context_out);
63 
64   Node* CreateArtificialFrameState(Node* node, Node* outer_frame_state,
65                                    int parameter_count, BailoutId bailout_id,
66                                    FrameStateType frame_state_type,
67                                    SharedFunctionInfoRef shared,
68                                    Node* context = nullptr);
69 
70   Reduction InlineCall(Node* call, Node* new_target, Node* context,
71                        Node* frame_state, Node* start, Node* end,
72                        Node* exception_target,
73                        const NodeVector& uncaught_subcalls);
74 };
75 
76 }  // namespace compiler
77 }  // namespace internal
78 }  // namespace v8
79 
80 #endif  // V8_COMPILER_JS_INLINING_H_
81