Index: src/compiler/js-inlining-heuristic.cc |
diff --git a/src/compiler/js-inlining-heuristic.cc b/src/compiler/js-inlining-heuristic.cc |
index 4b7fb8d567ecab532e5477adcd6f41bdf3b902a5..c58b83e3956d1feee53ec48a58ba04451cdc87d2 100644 |
--- a/src/compiler/js-inlining-heuristic.cc |
+++ b/src/compiler/js-inlining-heuristic.cc |
@@ -5,7 +5,6 @@ |
#include "src/compiler/js-inlining-heuristic.h" |
#include "src/compiler.h" |
-#include "src/compiler/dead-code-elimination.h" // TODO(mstarzinger): Remove! |
#include "src/compiler/node-matchers.h" |
#include "src/objects-inl.h" |
@@ -16,6 +15,10 @@ namespace compiler { |
Reduction JSInliningHeuristic::Reduce(Node* node) { |
if (node->opcode() != IrOpcode::kJSCallFunction) return NoChange(); |
+ // Check if we already saw that {node} before, and if so, just skip it. |
+ if (seen_.find(node->id()) != seen_.end()) return NoChange(); |
+ seen_.insert(node->id()); |
+ |
Node* callee = node->InputAt(0); |
HeapObjectMatcher match(callee); |
if (!match.HasValue() || !match.Value()->IsJSFunction()) return NoChange(); |
@@ -59,6 +62,14 @@ Reduction JSInliningHeuristic::Reduce(Node* node) { |
if (info_->shared_info()->asm_function()) return NoChange(); |
if (function->shared()->asm_function()) return NoChange(); |
+ // Stop inlinining once the maximum allowed level is reached. |
+ int level = 0; |
+ for (Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); |
+ frame_state->opcode() == IrOpcode::kFrameState; |
+ frame_state = NodeProperties::GetFrameStateInput(frame_state, 0)) { |
+ if (++level > FLAG_max_inlining_levels) return NoChange(); |
+ } |
+ |
// Gather feedback on how often this call site has been hit before. |
CallFunctionParameters p = CallFunctionParametersOf(node->op()); |
int calls = -1; // Same default as CallICNexus::ExtractCallCount. |
@@ -77,24 +88,17 @@ Reduction JSInliningHeuristic::Reduce(Node* node) { |
} |
-void JSInliningHeuristic::ProcessCandidates() { |
- if (candidates_.empty()) return; // Nothing to do without candidates. |
+void JSInliningHeuristic::Finalize() { |
if (FLAG_trace_turbo_inlining) PrintCandidates(); |
- int cumulative_count = 0; |
- for (const Candidate& candidate : candidates_) { |
- if (cumulative_count > FLAG_max_inlined_nodes_cumulative) break; |
+ while (!candidates_.empty()) { |
+ if (cumulative_count_ > FLAG_max_inlined_nodes_cumulative) break; |
+ auto i = candidates_.begin(); |
+ Candidate const& candidate = *i; |
inliner_.ReduceJSCallFunction(candidate.node, candidate.function); |
- cumulative_count += candidate.function->shared()->ast_node_count(); |
+ cumulative_count_ += candidate.function->shared()->ast_node_count(); |
+ candidates_.erase(i); |
} |
- |
- // TODO(mstarzinger): Temporary workaround to eliminate dead control from the |
- // graph being introduced by the inliner. Make this part of the pipeline. |
- GraphReducer graph_reducer(local_zone_, jsgraph_->graph(), jsgraph_->Dead()); |
- DeadCodeElimination dead_code_elimination(&graph_reducer, jsgraph_->graph(), |
- jsgraph_->common()); |
- graph_reducer.AddReducer(&dead_code_elimination); |
- graph_reducer.ReduceGraph(); |
} |