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_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 };
     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