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