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 SourcePositionTable* source_positions) 20 : AdvancedReducer(editor), 21 mode_(mode), 22 inliner_(editor, local_zone, info, jsgraph, source_positions), 23 candidates_(local_zone), 24 seen_(local_zone), 25 jsgraph_(jsgraph) {} 26 27 Reduction Reduce(Node* node) final; 28 29 // Processes the list of candidates gathered while the reducer was running, 30 // and inlines call sites that the heuristic determines to be important. 31 void Finalize() final; 32 33 private: 34 // This limit currently matches what Crankshaft does. We may want to 35 // re-evaluate and come up with a proper limit for TurboFan. 36 static const int kMaxCallPolymorphism = 4; 37 38 struct Candidate { 39 Handle<JSFunction> functions[kMaxCallPolymorphism]; 40 // TODO(2206): For now polymorphic inlining is treated orthogonally to 41 // inlining based on SharedFunctionInfo. This should be unified and the 42 // above array should be switched to SharedFunctionInfo instead. Currently 43 // we use {num_functions == 1 && functions[0].is_null()} as an indicator. 44 Handle<SharedFunctionInfo> shared_info; 45 int num_functions; 46 Node* node = nullptr; // The call site at which to inline. 47 float frequency = 0.0f; // Relative frequency of this call site. 48 }; 49 50 // Comparator for candidates. 51 struct CandidateCompare { 52 bool operator()(const Candidate& left, const Candidate& right) const; 53 }; 54 55 // Candidates are kept in a sorted set of unique candidates. 56 typedef ZoneSet<Candidate, CandidateCompare> Candidates; 57 58 // Dumps candidates to console. 59 void PrintCandidates(); 60 Reduction InlineCandidate(Candidate const& candidate); 61 62 CommonOperatorBuilder* common() const; 63 Graph* graph() const; 64 JSGraph* jsgraph() const { return jsgraph_; } 65 SimplifiedOperatorBuilder* simplified() const; 66 67 Mode const mode_; 68 JSInliner inliner_; 69 Candidates candidates_; 70 ZoneSet<NodeId> seen_; 71 JSGraph* const jsgraph_; 72 int cumulative_count_ = 0; 73 }; 74 75 } // namespace compiler 76 } // namespace internal 77 } // namespace v8 78 79 #endif // V8_COMPILER_JS_INLINING_HEURISTIC_H_ 80