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_JS_INLINING_HEURISTIC_H_
6 #define V8_COMPILER_JS_INLINING_HEURISTIC_H_
7 
8 #include "src/compiler/js-inlining.h"
9 
10 namespace v8 {
11 namespace internal {
12 namespace compiler {
13 
14 class JSInliningHeuristic final : public AdvancedReducer {
15  public:
16   enum Mode { kGeneralInlining, kRestrictedInlining, kStressInlining };
JSInliningHeuristic(Editor * editor,Mode mode,Zone * local_zone,CompilationInfo * info,JSGraph * jsgraph)17   JSInliningHeuristic(Editor* editor, Mode mode, Zone* local_zone,
18                       CompilationInfo* info, JSGraph* jsgraph)
19       : AdvancedReducer(editor),
20         mode_(mode),
21         inliner_(editor, local_zone, info, jsgraph),
22         candidates_(local_zone),
23         seen_(local_zone),
24         info_(info) {}
25 
26   Reduction Reduce(Node* node) final;
27 
28   // Processes the list of candidates gathered while the reducer was running,
29   // and inlines call sites that the heuristic determines to be important.
30   void Finalize() final;
31 
32  private:
33   struct Candidate {
34     Handle<JSFunction> function;  // The call target being inlined.
35     Node* node;                   // The call site at which to inline.
36     int calls;                    // Number of times the call site was hit.
37   };
38 
39   // Comparator for candidates.
40   struct CandidateCompare {
41     bool operator()(const Candidate& left, const Candidate& right) const;
42   };
43 
44   // Candidates are kept in a sorted set of unique candidates.
45   typedef ZoneSet<Candidate, CandidateCompare> Candidates;
46 
47   // Dumps candidates to console.
48   void PrintCandidates();
49 
50   Mode const mode_;
51   JSInliner inliner_;
52   Candidates candidates_;
53   ZoneSet<NodeId> seen_;
54   CompilationInfo* info_;
55   int cumulative_count_ = 0;
56 };
57 
58 }  // namespace compiler
59 }  // namespace internal
60 }  // namespace v8
61 
62 #endif  // V8_COMPILER_JS_INLINING_HEURISTIC_H_
63